pkuseg簡單易用,支持細分領域分詞,有效提高了分詞準確度。python
pkuseg具備以下幾個特色:linux
經過PyPI安裝(自帶模型文件):git
pip3 install pkuseg 以後經過import pkuseg來引用
建議更新到最新版本以得到更好的開箱體驗:github
pip3 install -U pkuseg
若是PyPI官方源下載速度不理想,建議使用鏡像源,好比:
初次安裝:web
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pkuseg
更新:windows
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -U pkuseg
注意:安裝方式一和二目前僅支持linux,mac,windows 64 位的python3.5,python 3.6,python 3.7版本。網絡
若是不使用pip安裝方式,選擇從GitHub下載,可運行如下命令安裝:工具
python setup.py build_ext -i
GitHub的代碼並不包括預訓練模型,所以須要用戶自行下載或訓練模型,預訓練模型可詳見release。使用時需設定"model_name"爲模型文件。post
咱們選擇jieba、THULAC等國內表明分詞工具包與pkuseg作性能比較。性能
考慮到jieba分詞和THULAC工具包等並無提供細領域的預訓練模型,爲了便於比較,咱們從新使用它們提供的訓練接口在細領域的數據集上進行訓練,用訓練獲得的模型進行中文分詞。
咱們選擇Linux做爲測試環境,在新聞數據(MSRA)、混合型文本(CTB8)、網絡文本(WEIBO)數據上對不一樣工具包進行了準確率測試。咱們使用了第二屆國際漢語分詞評測比賽提供的分詞評價腳本。其中MSRA與WEIBO使用標準訓練集測試集劃分,CTB8採用隨機劃分。對於不一樣的分詞工具包,訓練測試數據的劃分都是一致的;即全部的分詞工具包都在相同的訓練集上訓練,在相同的測試集上測試。對於全部數據集,pkuseg使用了不使用詞典的訓練和測試接口。如下是pkuseg訓練和測試代碼示例:
pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models') pkuseg.test('msr_test.raw', 'output.txt', user_dict=None)
如下是在不一樣數據集上的對比結果:
MSRA | Precision | Recall | F-score |
---|---|---|---|
jieba | 87.01 | 89.88 | 88.42 |
THULAC | 95.60 | 95.91 | 95.71 |
pkuseg | 96.94 | 96.81 | 96.88 |
Precision | Recall | F-score | |
---|---|---|---|
jieba | 87.79 | 87.54 | 87.66 |
THULAC | 93.40 | 92.40 | 92.87 |
pkuseg | 93.78 | 94.65 | 94.21 |
考慮到不少用戶在嘗試分詞工具的時候,大多數時候會使用工具包自帶模型測試。爲了直接對比「初始」性能,咱們也比較了各個工具包的默認模型在不一樣領域的測試效果。請注意,這樣的比較只是爲了說明默認狀況下的效果,並不必定是公平的。
Default | MSRA | CTB8 | PKU | All Average | |
---|---|---|---|---|---|
jieba | 81.45 | 79.58 | 81.83 | 83.56 | 81.61 |
THULAC | 85.55 | 87.84 | 92.29 | 86.65 | 88.08 |
pkuseg | 87.29 | 91.77 | 92.68 | 93.43 | 91.29 |
其中,All Average
顯示的是在全部測試集上F-score的平均。
更多詳細比較可參見和現有工具包的比較。
如下代碼示例適用於python交互式環境。
代碼示例1:使用默認配置進行分詞(若是用戶沒法肯定分詞領域,推薦使用默認模型分詞)
import pkuseg seg = pkuseg.pkuseg() # 以默認配置加載模型 text = seg.cut('我愛北京天安門') # 進行分詞 print(text)
代碼示例2:細領域分詞(若是用戶明確分詞領域,推薦使用細領域模型分詞)
import pkuseg seg = pkuseg.pkuseg(model_name='medicine') # 程序會自動下載所對應的細領域模型 text = seg.cut('我愛北京天安門') # 進行分詞 print(text)
代碼示例3:分詞同時進行詞性標註,各詞性標籤的詳細含義可參考 tags.txt
import pkuseg seg = pkuseg.pkuseg(postag=True) # 開啓詞性標註功能 text = seg.cut('我愛北京天安門') # 進行分詞和詞性標註 print(text)
代碼示例4:對文件分詞
import pkuseg # 對input.txt的文件分詞輸出到output.txt中 # 開20個進程 pkuseg.test('input.txt', 'output.txt', nthread=20)
代碼示例5:額外使用用戶自定義詞典
import pkuseg seg = pkuseg.pkuseg(user_dict='my_dict.txt') # 給定用戶詞典爲當前目錄下的"my_dict.txt" text = seg.cut('我愛北京天安門') # 進行分詞 print(text)
代碼示例6:使用自訓練模型分詞(以CTB8模型爲例)
import pkuseg seg = pkuseg.pkuseg(model_name='./ctb8') # 假設用戶已經下載好了ctb8的模型並放在了'./ctb8'目錄下,經過設置model_name加載該模型 text = seg.cut('我愛北京天安門') # 進行分詞 print(text)
代碼示例7:訓練新模型 (模型隨機初始化)
import pkuseg # 訓練文件爲'msr_training.utf8' # 測試文件爲'msr_test_gold.utf8' # 訓練好的模型存到'./models'目錄下 # 訓練模式下會保存最後一輪模型做爲最終模型 # 目前僅支持utf-8編碼,訓練集和測試集要求全部單詞以單個或多個空格分開 pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models')
代碼示例8:fine-tune訓練(從預加載的模型繼續訓練)
import pkuseg # 訓練文件爲'train.txt' # 測試文件爲'test.txt' # 加載'./pretrained'目錄下的模型,訓練好的模型保存在'./models',訓練10輪 pkuseg.train('train.txt', 'test.txt', './models', train_iter=10, init_model='./pretrained')
模型配置
pkuseg.pkuseg(model_name = "default", user_dict = "default", postag = False) model_name 模型路徑。 "default",默認參數,表示使用咱們預訓練好的混合領域模型(僅對pip下載的用戶)。 "news", 使用新聞領域模型。 "web", 使用網絡領域模型。 "medicine", 使用醫藥領域模型。 "tourism", 使用旅遊領域模型。 model_path, 從用戶指定路徑加載模型。 user_dict 設置用戶詞典。 "default", 默認參數,使用咱們提供的詞典。 None, 不使用詞典。 dict_path, 在使用默認詞典的同時會額外使用用戶自定義詞典,能夠填本身的用戶詞典的路徑,詞典格式爲一行一個詞。 postag 是否進行詞性分析。 False, 默認參數,只進行分詞,不進行詞性標註。 True, 會在分詞的同時進行詞性標註。
對文件進行分詞
pkuseg.test(readFile, outputFile, model_name = "default", user_dict = "default", postag = False, nthread = 10) readFile 輸入文件路徑。 outputFile 輸出文件路徑。 model_name 模型路徑。同pkuseg.pkuseg user_dict 設置用戶詞典。同pkuseg.pkuseg postag 設置是否開啓詞性分析功能。同pkuseg.pkuseg nthread 測試時開的進程數。
模型訓練
pkuseg.train(trainFile, testFile, savedir, train_iter = 20, init_model = None) trainFile 訓練文件路徑。 testFile 測試文件路徑。 savedir 訓練模型的保存路徑。 train_iter 訓練輪數。 init_model 初始化模型,默認爲None表示使用默認初始化,用戶能夠填本身想要初始化的模型的路徑如init_model='./models/'。
當將以上代碼示例置於文件中運行時,如涉及多進程功能,請務必使用if __name__ == '__main__'
保護全局語句,如:
mp.py文件
import pkuseg if __name__ == '__main__': pkuseg.test('input.txt', 'output.txt', nthread=20) pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models', nthread=20)
運行
python3 mp.py
詳見沒法使用多進程分詞和訓練功能,提示RuntimeError和BrokenPipeError。
在Windows平臺上,請當文件足夠大時再使用多進程分詞功能,詳見關於多進程速度問題。
從pip安裝的用戶在使用細領域分詞功能時,只須要設置model_name字段爲對應的領域便可,會自動下載對應的細領域模型。
從github下載的用戶則須要本身下載對應的預訓練模型,並設置model_name字段爲預訓練模型路徑。預訓練模型能夠在release部分下載。如下是對預訓練模型的說明:
news: 在MSRA(新聞語料)上訓練的模型。
web: 在微博(網絡文本語料)上訓練的模型。
medicine: 在醫藥領域上訓練的模型。
tourism: 在旅遊領域上訓練的模型。
mixed: 混合數據集訓練的通用模型。隨pip包附帶的是此模型。
歡迎更多用戶能夠分享本身訓練好的細分領域模型。
該代碼包主要基於如下科研論文,如使用了本工具,請引用如下論文:
PKUSeg的做者有三位,Ruixuan Luo (羅睿軒),Jingjing Xu (許晶晶) ,以及Xu Sun (孫栩) 。
工具包的誕生,也是基於其中兩位參與的ACL論文。
準確率又那麼高,還不去試試?
GitHub傳送門:
https://github.com/lancopku/PKUSeg-python
論文傳送門:
http://www.aclweb.org/anthology/P12-1027