北京大学开源分词工具pkuseg 初试与使用感受
本部分內(nèi)容部分來自:https://github.com/lancopku/PKUSeg-python
1.前言
最近看到一些博文介紹了北大的一個(gè)開源的中文分詞工具包pkuseg。其中說到,它在多個(gè)分詞數(shù)據(jù)集上都有非常高的分詞準(zhǔn)確率,我們所知道的,也經(jīng)常使用的結(jié)巴分詞誤差率高達(dá) 18.55% 和 20.42,而北大的 pkuseg 只有 3.25% 與 4.32%。當(dāng)然還有其他的分詞工具,如:清華大學(xué)的THULAC,HanLp,pynlpir等工具。分詞的重要性不言而喻,在看到相關(guān)介紹后也在第一時(shí)間去嘗試一下,以下根據(jù)github開源信息做出實(shí)驗(yàn),其使用的語言是python。github地址為:https://github.com/lancopku/PKUSeg-python。
2.簡介
pkuseg是由北京大學(xué)語言計(jì)算與機(jī)器學(xué)習(xí)研究組研制推出的一套全新的中文分詞工具包。pkuseg具有如下幾個(gè)特點(diǎn):
- 高分詞準(zhǔn)確率。相比于其他的分詞工具包,該工具包在不同領(lǐng)域的數(shù)據(jù)上都大幅提高了分詞的準(zhǔn)確度。根據(jù)測試結(jié)果,pkuseg分別在示例數(shù)據(jù)集(MSRA和CTB8)上降低了79.33%和63.67%的分詞錯(cuò)誤率。
- 多領(lǐng)域分詞。該分詞包訓(xùn)練了多種不同領(lǐng)域的分詞模型。根據(jù)待分詞的領(lǐng)域特點(diǎn),用戶可以自由地選擇不同的模型。
- 支持用戶自訓(xùn)練模型。支持用戶使用全新的標(biāo)注數(shù)據(jù)進(jìn)行訓(xùn)練。
3.工具使用
3.1安裝
方式1.程序包下載安裝
pip install pkuseg
之后通過import pkuseg來引用
- 1
- 2
方式2.從github下載(需要下載模型文件)
將pkuseg文件放到目錄下,通過import pkuseg使用
模型需要下載或自己訓(xùn)練。
- 1
- 2
3.2代碼示例
1.使用默認(rèn)模型及默認(rèn)詞典分詞
在實(shí)際測試中,第一次加載模型時(shí)間比較長,并且分詞的結(jié)果也沒有給出各個(gè)詞語的詞性,如下圖:
2.設(shè)置用戶自定義詞典
在實(shí)際測試中,可以看出,自定義詞典確實(shí)起到作用,但是這個(gè)處理時(shí)間似乎有點(diǎn)小長,默認(rèn)詞典與自定義詞典比較,代碼如下
import pkuseg
lexicon = [‘北京大學(xué)’, ‘北京天安門’] #希望分詞時(shí)用戶詞典中的詞固定不分開
segDefault = pkuseg.pkuseg() #默認(rèn)分詞類型
seg = pkuseg.pkuseg(user_dict=lexicon) #加載模型,給定用戶詞典
textDefault = segDefault.cut(‘我愛北京天安門’) #進(jìn)行分詞
text = seg.cut(‘我愛北京天安門’) #進(jìn)行分詞
print(textDefault)
print(text)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
運(yùn)行結(jié)果如下:
loading model
finish
loading model
finish
['我', '愛', '北京', '天安門']
['我', '愛', '北京天安門']
[Finished in 40.2s]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.模型訓(xùn)練
訓(xùn)練模型是需要解壓的,具體內(nèi)容可參考github上的內(nèi)容,其中代碼如下:
import pkuseg
seg = pkuseg.pkuseg(model_name=‘ctb8’) #假設(shè)用戶已經(jīng)下載好了ctb8的模型并放在了’ctb8’目錄下,通過設(shè)置model_name加載該模型
text = seg.cut(‘我愛北京天安門’) #進(jìn)行分詞
print(text)
- 1
- 2
- 3
- 4
- 5
運(yùn)行結(jié)果:
loading model
finish
['我', '愛', '北京', '天安門']
[Finished in 24.6s]
- 1
- 2
- 3
- 4
4.對于大型文本數(shù)據(jù)集,如果需要快速分詞的話,我們也可以采用多線程的方式
讀取文件,并將分詞結(jié)果輸出到一個(gè)文件中,在進(jìn)行測試的時(shí)候,幾經(jīng)報(bào)錯(cuò),也可沒出結(jié)果,獲取我的系統(tǒng)配置有問題,或者輸入文件有問題,或者…這里就拋磚引玉,希望大牛能夠調(diào)出來,代碼如下:
import pkuseg
#對input.txt的文件分詞輸出到output.txt中,使用默認(rèn)模型和詞典,開20個(gè)進(jìn)程
pkuseg.test(‘input.txt’, ‘output.txt’, nthread=20)
- 1
- 2
- 3
- 4
運(yùn)行結(jié)果:
loading model finish Traceback (most recent call last):File "<string>", line 1, in <module>File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_mainexitcode = _main(fd)File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 114, in _mainprepare(preparation_data)File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 225, in prepare_fixup_main_from_path(data['init_main_from_path'])File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_pathrun_name="__mp_main__")File "C:\Development\Python\Anaconda3\lib\runpy.py", line 263, in run_pathpkg_name=pkg_name, script_name=fname)File "C:\Development\Python\Anaconda3\lib\runpy.py", line 96, in _run_module_codemod_name, mod_spec, pkg_name, script_name)File "C:\Development\Python\Anaconda3\lib\runpy.py", line 85, in _run_codeexec(code, run_globals)File "C:\Users\JackPi\Desktop\test\pkusegtest\test.py", line 10, in <module>pkuseg.test('input.txt', 'output.txt', nthread=20) File "C:\Development\Python\Anaconda3\lib\site-packages\pkuseg\__init__.py", line 263, in testp.start()File "C:\Development\Python\Anaconda3\lib\multiprocessing\process.py", line 105, in startself._popen = self._Popen(self)File "C:\Development\Python\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popenreturn _default_context.get_context().Process._Popen(process_obj)File "C:\Development\Python\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popenreturn Popen(process_obj)File "C:\Development\Python\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__prep_data = spawn.get_preparation_data(process_obj._name)File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 143, in get_preparation_data_check_not_importing_main()File "C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_mainis not going to be frozen to produce an executable.''') RuntimeError: An attempt has been made to start a new process before thecurrent process has finished its bootstrapping phase.This probably means that you are not using fork to start yourchild processes and you have forgotten to use the proper idiomin the main module:if __name__ == '__main__':freeze_support()...The "freeze_support()" line can be omitted if the programis not going to be frozen to produce an executable.
loading model
finish
Traceback (most recent call last):
File “C:\Users\JackPi\Desktop\test\pkusegtest\test.py”, line 10, in <module>
pkuseg.test(‘input.txt’, ‘output.txt’, nthread=20)
File “C:\Development\Python\Anaconda3\lib\site-packages\pkuseg_init_.py”, line 263, in test
p.start()
File “C:\Development\Python\Anaconda3\lib\multiprocessing\process.py”, line 105, in start
self._popen = self._Popen(self)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\context.py”, line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\context.py”, line 322, in _Popen
return Popen(process_obj)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\popen_spawn_win32.py”, line 65, in init
reduction.dump(process_obj, to_child)
File “C:\Development\Python\Anaconda3\lib\multiprocessing\reduction.py”, line 60, in dump
ForkingPickler(file, protocol).dump(obj)
BrokenPipeError: [Errno 32] Broken pipe
[Finished in 42.5s]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
其中的input.txt中的內(nèi)容為:
外星文明探索是一個(gè)很特殊的學(xué)科,它對研究者的人生觀影響很大。夜深人靜的時(shí)候,從耳機(jī)中聽著來自宇宙沒有生命的噪音,這噪音隱隱約約的,好像比那些星星還永恒;有時(shí)又覺得那聲音像大興安嶺的冬天里沒完沒了的寒風(fēng),讓我感到很冷,那種孤獨(dú)真是沒法形容。地球生命真的是宇宙中偶然里的偶然,人類是這空蕩蕩的大殿里唯一一只螞蟻。有時(shí)覺得生命真珍貴,一切都重如泰山;有時(shí)又覺得人是那么渺小,什么都不值一提。
- 1
5.重新訓(xùn)練一個(gè)分詞模型
import pkuseg
#訓(xùn)練文件為'msr_training.utf8',測試文件為'msr_test_gold.utf8',模型存到'./models'目錄下,開20個(gè)進(jìn)程訓(xùn)練模型
pkuseg.train('msr_training.utf8', 'msr_test_gold.utf8', './models', nthread=20)
- 1
- 2
- 3
這里我就沒有去測試,感興趣的可以去嘗試一下。
6.參數(shù)說明
pkuseg.pkuseg(model_name='msra', user_dict='safe_lexicon')
model_name 模型路徑。默認(rèn)是'msra'表示我們預(yù)訓(xùn)練好的模型(僅對pip下載的用戶)。用戶可以填自己下載或訓(xùn)練的模型所在的路徑如model_name='./models'。
user_dict 設(shè)置用戶詞典。默認(rèn)為'safe_lexicon'表示我們提供的一個(gè)中文詞典(僅pip)。用戶可以傳入一個(gè)包含若干自定義單詞的迭代器。
pkuseg.test(readFile, outputFile, model_name=‘msra’, user_dict=‘safe_lexicon’, nthread=10)
readFile 輸入文件路徑
outputFile 輸出文件路徑
model_name 同pkuseg.pkuseg
user_dict 同pkuseg.pkuseg
nthread 測試時(shí)開的進(jìn)程數(shù)
pkuseg.train(trainFile, testFile, savedir, nthread=10)
trainFile 訓(xùn)練文件路徑
testFile 測試文件路徑
savedir 訓(xùn)練模型的保存路徑
nthread 訓(xùn)練時(shí)開的進(jìn)程數(shù)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
4 各類分詞工具包性能比較
在進(jìn)行比較之前需要說明以下預(yù)訓(xùn)練模型
分詞模式下,用戶需要加載預(yù)訓(xùn)練好的模型。這里提供了三種在不同類型數(shù)據(jù)上訓(xùn)練得到的模型,根據(jù)具體需要,用戶可以選擇不同的預(yù)訓(xùn)練模型。以下是對預(yù)訓(xùn)練模型的說明:
MSRA: 在MSRA(新聞?wù)Z料)上訓(xùn)練的模型。新版本代碼采用的是此模型。
CTB8: 在CTB8(新聞文本及網(wǎng)絡(luò)文本的混合型語料)上訓(xùn)練的模型。
WEIBO: 在微博(網(wǎng)絡(luò)文本語料)上訓(xùn)練的模型。
其中,MSRA數(shù)據(jù)由第二屆國際漢語分詞評測比賽提供,CTB8數(shù)據(jù)由LDC提供,WEIBO數(shù)據(jù)由NLPCC分詞比賽提供。
具體比較
官方數(shù)據(jù)中:在比較中選擇THULAC、結(jié)巴分詞等國內(nèi)代表分詞工具包與pkuseg做性能比較,測試環(huán)境選擇Linux,在新聞數(shù)據(jù)(MSRA)和混合型文本(CTB8)數(shù)據(jù)上對不同工具包進(jìn)行了準(zhǔn)確率測試(數(shù)據(jù)在github上,可下載)。該比較使用了第二屆國際漢語分詞評測比賽提供的分詞評價(jià)腳本。評測結(jié)果如下:
| MSRA | F-score | Error Rate |
|---|---|---|
| jieba | 81.45 | 18.55 |
| THULAC | 85.48 | 14.52 |
| pkuseg | 96.75 (+13.18%) | 3.25 (-77.62%) |
| CTB8 | F-score | Error Rate |
|---|---|---|
| jieba | 79.58 | 20.42 |
| THULAC | 87.77 | 12.23 |
| pkuseg | 95.64 (+8.97%) | 4.36 (-64.35%) |
通過上面的數(shù)據(jù),可以說明jieba分詞的準(zhǔn)確率最低,清華大學(xué)的THULAC的準(zhǔn)確率也沒有pkuseg高。但是,我們需要注意的是:北大的這個(gè)分詞工具是經(jīng)過這些數(shù)據(jù)訓(xùn)練出來的,準(zhǔn)確率高也是情理之中的事情。真正的好不好,就看使用者的反饋了。
5 相關(guān)論文及作者
1.論文
- Xu Sun, Houfeng Wang, Wenjie Li. Fast Online Training with Frequency-Adaptive Learning Rates for Chinese Word Segmentation and New Word Detection. ACL. 253–262. 2012
- Jingjing Xu, Xu Sun. Dependency-based Gated Recursive Neural Network for Chinese Word Segmentation. ACL 2016: 567-572
2.作者
Ruixuan Luo (羅睿軒), Jingjing Xu(許晶晶), Xu Sun (孫栩)
6 總結(jié)
從客觀來看,該工具還是存在缺點(diǎn)的,雖然官方給出的準(zhǔn)確率很高,但是在實(shí)際分詞過程中,花費(fèi)時(shí)間長,系統(tǒng)穩(wěn)定性低,分詞結(jié)果也不可以顯示分詞的詞性,綜合來講與當(dāng)前成熟的開源的分詞工具還是有一定的差距,但是也不否定該工具具有的亮點(diǎn),以及其非常高的準(zhǔn)確性。分詞是自然語言處理中底層并且非常重要的一環(huán),當(dāng)前做得也是比較成熟了,但是也存在很多缺陷,也是一個(gè)研究的方向。個(gè)人認(rèn)為,真正做自然語言處理,到最后依然是需要回歸到語言到底是什么,語言是如何發(fā)出的,語言的發(fā)展等等,當(dāng)今基于統(tǒng)計(jì)的自然語言處理不容置疑也確實(shí)做出不錯(cuò)的成績,但基本上都是基于語料的,模型訓(xùn)練的等等。在自然語言處理這一交叉學(xué)科上,其發(fā)展依然任重而道遠(yuǎn),不能一味地崇拜機(jī)器學(xué)習(xí),深度學(xué)習(xí),回歸語言本質(zhì),用數(shù)學(xué)的方式進(jìn)行處理也將會(huì)是未來研究的方向。
</div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet"></div>
總結(jié)
以上是生活随笔為你收集整理的北京大学开源分词工具pkuseg 初试与使用感受的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科学空间
- 下一篇: oracle dba_tables各字段