pkuseg:一個多領域中文分詞工具包

pkuseg簡單易用,支持細分領域分詞,有效提高了分詞準確度。python

目錄

主要亮點

pkuseg具備以下幾個特色:linux

  1. 多領域分詞。不一樣於以往的通用中文分詞工具,此工具包同時致力於爲不一樣領域的數據提供個性化的預訓練模型。根據待分詞文本的領域特色,用戶能夠自由地選擇不一樣的模型。 咱們目前支持了新聞領域,網絡領域,醫藥領域,旅遊領域,以及混合領域的分詞預訓練模型。在使用中,若是用戶明確待分詞的領域,可加載對應的模型進行分詞。若是用戶沒法肯定具體領域,推薦使用在混合領域上訓練的通用模型。各領域分詞樣例可參考 example.txt
  2. 更高的分詞準確率。相比於其餘的分詞工具包,當使用相同的訓練數據和測試數據,pkuseg能夠取得更高的分詞準確率。
  3. 支持用戶自訓練模型。支持用戶使用全新的標註數據進行訓練。
  4. 支持詞性標註。

編譯和安裝

  • 目前僅支持python3
  • 新版本發佈:2019-1-23
    • 修改了詞典處理方法,擴充了詞典,分詞效果有提高
    • 效率進行了優化,測試速度較以前版本提高9倍左右
    • 增長了在大規模混合數據集訓練的通用模型,並將其設爲默認使用模型
  • 新版本發佈:2019-1-30
    • 支持fine-tune訓練(從預加載的模型繼續訓練),支持設定訓練輪數
  • 新版本發佈:2019-2-20
    • 支持詞性標註,增長了醫療、旅遊細領域模型
  • 爲了得到好的效果和速度,強烈建議你們經過pip install更新到目前的最新版本
  1. 經過PyPI安裝(自帶模型文件):git

    pip3 install pkuseg
    以後經過import pkuseg來引用

    建議更新到最新版本以得到更好的開箱體驗:github

    pip3 install -U pkuseg
  2. 若是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版本。網絡

  3. 若是不使用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
WEIBO 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 WEIBO 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包附帶的是此模型。

歡迎更多用戶能夠分享本身訓練好的細分領域模型。

版本歷史

  • v0.0.11(2019-01-09)
    • 修訂默認配置:CTB8做爲默認模型,不使用詞典
  • v0.0.14(2019-01-23)
    • 修改了詞典處理方法,擴充了詞典,分詞效果有提高
    • 效率進行了優化,測試速度較以前版本提高9倍左右
    • 增長了在大規模混合數據集訓練的通用模型,並將其設爲默認使用模型
  • v0.0.15(2019-01-30)
    • 支持fine-tune訓練(從預加載的模型繼續訓練),支持設定訓練輪數
  • v0.0.18(2019-02-20)
    • 支持詞性標註,增長了醫療、旅遊兩個細領域模型

開源協議

  1. 本代碼採用MIT許可證。
  2. 歡迎對該工具包提出任何寶貴意見和建議,請發郵件至jingjingxu@pku.edu.cn

相關論文

該代碼包主要基於如下科研論文,如使用了本工具,請引用如下論文:

傳送門

PKUSeg的做者有三位,Ruixuan Luo (羅睿軒),Jingjing Xu (許晶晶) ,以及Xu Sun (孫栩) 。

工具包的誕生,也是基於其中兩位參與的ACL論文

準確率又那麼高,還不去試試?

GitHub傳送門:
https://github.com/lancopku/PKUSeg-python

論文傳送門:

 

http://www.aclweb.org/anthology/P12-1027

 

 

http://aclweb.org/anthology/P16-2092

相關文章
相關標籤/搜索