送你十本Python電子書 文 | 皮乾東 推薦 | 編程派() 本部分內(nèi)容部分來自:https://github.com/lancopku/PKUSeg-python
1.前言最近看到一些博文介紹了北大的一個開源的中文分詞工具包pkuseg。其中說到,它在多個分詞數(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)介紹后也在第一時間去嘗試一下,以下根據(jù)github開源信息做出實(shí)驗(yàn),其使用的語言是python。github地址為:https://github.com/lancopku/PKUSeg-python。 2.簡介pkuseg是由北京大學(xué)語言計(jì)算與機(jī)器學(xué)習(xí)研究組研制推出的一套全新的中文分詞工具包。pkuseg具有如下幾個特點(diǎn): 高分詞準(zhǔn)確率。相比于其他的分詞工具包,該工具包在不同領(lǐng)域的數(shù)據(jù)上都大幅提高了分詞的準(zhǔn)確度。根據(jù)測試結(jié)果,pkuseg分別在示例數(shù)據(jù)集(MSRA和CTB8)上降低了79.33%和63.67%的分詞錯誤率。 多領(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
之后通過importpkuseg來引用
方式2.從github下載(需要下載模型文件) 將pkuseg文件放到目錄下,通過importpkuseg使用
模型需要下載或自己訓(xùn)練。
3.2代碼示例1.使用默認(rèn)模型及默認(rèn)詞典分詞 在實(shí)際測試中,第一次加載模型時間比較長,并且分詞的結(jié)果也沒有給出各個詞語的詞性,如下圖: 2.設(shè)置用戶自定義詞典 在實(shí)際測試中,可以看出,自定義詞典確實(shí)起到作用,但是這個處理時間似乎有點(diǎn)小長,默認(rèn)詞典與自定義詞典比較,代碼如下 importpkuseg
lexicon = ['北京大學(xué)','北京天安門']#希望分詞時用戶詞典中的詞固定不分開
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)
運(yùn)行結(jié)果如下: loading model
finish
loading model
finish
['我','愛','北京','天安門']
['我','愛','北京天安門']
[Finishedin40.2s]
3.模型訓(xùn)練 訓(xùn)練模型是需要解壓的,具體內(nèi)容可參考github上的內(nèi)容,其中代碼如下: importpkuseg
seg = pkuseg.pkuseg(model_name='ctb8')#假設(shè)用戶已經(jīng)下載好了ctb8的模型并放在了'ctb8'目錄下,通過設(shè)置model_name加載該模型
text = seg.cut('我愛北京天安門')#進(jìn)行分詞
print(text)
運(yùn)行結(jié)果: loading model
finish
['我','愛','北京','天安門']
[Finishedin24.6s]
4.對于大型文本數(shù)據(jù)集,如果需要快速分詞的話,我們也可以采用多線程的方式 讀取文件,并將分詞結(jié)果輸出到一個文件中,在進(jìn)行測試的時候,幾經(jīng)報(bào)錯,也可沒出結(jié)果,獲取我的系統(tǒng)配置有問題,或者輸入文件有問題,或者…這里就拋磚引玉,希望大牛能夠調(diào)出來,代碼如下: importpkuseg
#對input.txt的文件分詞輸出到output.txt中,使用默認(rèn)模型和詞典,開20個進(jìn)程
pkuseg.test('input.txt','output.txt', nthread=20)
運(yùn)行結(jié)果: loading model
finish
Traceback(most recent calllast):
File'<string>', line1,in<module>
File'C:\Development\Python\Anaconda3\lib\multiprocessing\spawn.py', line105,inspawn_main
exitcode = _main(fd)
File, line114,in_main
prepare(preparation_data)
File, line225,inprepare
_fixup_main_from_path(data['init_main_from_path'])
File, line277,in_fixup_main_from_path
run_name='__mp_main__')
File'C:\Development\Python\Anaconda3\lib\runpy.py', line263,inrun_path
pkg_name=pkg_name, script_name=fname)
File, line96,in_run_module_code
mod_name, mod_spec, pkg_name, script_name)
File, line85,in_run_code
exec(code, run_globals)
File'C:\Users\JackPi\Desktop\test\pkusegtest\test.py', line10,in<module>
pkuseg.test('input.txt','output.txt', nthread=20)
File'C:\Development\Python\Anaconda3\lib\site-packages\pkuseg\__init__.py', line263,intest
p.start
File'C:\Development\Python\Anaconda3\lib\multiprocessing\process.py', line105,instart
self._popen =self._Popen(self)
File'C:\Development\Python\Anaconda3\lib\multiprocessing\context.py', line223,in_Popen
return_default_context.get_context.Process._Popen(process_obj)
File, line322,in_Popen
returnPopen(process_obj)
File'C:\Development\Python\Anaconda3\lib\multiprocessing\popen_spawn_win32.py', line33,in__init__
prep_data = spawn.get_preparation_data(process_obj._name)
File, line143,inget_preparation_data
_check_not_importing_main
File, line136,in_check_not_importing_main
isnotgoing to be frozen to produce an executable.''')
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support
...
The 'freeze_support' line can be omitted if the program
is 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]
其中的input.txt中的內(nèi)容為: 外星文明探索是一個很特殊的學(xué)科,它對研究者的人生觀影響很大。夜深人靜的時候,從耳機(jī)中聽著來自宇宙沒有生命的噪音,這噪音隱隱約約的,好像比那些星星還永恒;有時又覺得那聲音像大興安嶺的冬天里沒完沒了的寒風(fēng),讓我感到很冷,那種孤獨(dú)真是沒法形容。地球生命真的是宇宙中偶然里的偶然,人類是這空蕩蕩的大殿里唯一一只螞蟻。有時覺得生命真珍貴,一切都重如泰山;有時又覺得人是那么渺小,什么都不值一提。
5.重新訓(xùn)練一個分詞模型 importpkuseg
#訓(xùn)練文件為'msr_training.utf8',測試文件為'msr_test_gold.utf8',模型存到'./models'目錄下,開20個進(jìn)程訓(xùn)練模型
pkuseg.train('msr_training.utf8','msr_test_gold.utf8','./models', nthread=20)
這里我就沒有去測試,感興趣的可以去嘗試一下。 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'表示我們提供的一個中文詞典(僅pip)。用戶可以傳入一個包含若干自定義單詞的迭代器。
pkuseg.test(readFile, outputFile, model_name='msra', user_dict='safe_lexicon', nthread=10)
readFile 輸入文件路徑
outputFile 輸出文件路徑
model_name 同pkuseg.pkuseg
user_dict 同pkuseg.pkuseg
nthread 測試時開的進(jìn)程數(shù)
pkuseg.train(trainFile, testFile, savedir, nthread=10)
trainFile 訓(xùn)練文件路徑
testFile 測試文件路徑
savedir 訓(xùn)練模型的保存路徑
nthread 訓(xùn)練時開的進(jìn)程數(shù)
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é)果如下: 通過上面的數(shù)據(jù),可以說明jieba分詞的準(zhǔn)確率最低,清華大學(xué)的THULAC的準(zhǔn)確率也沒有pkuseg高。但是,我們需要注意的是:北大的這個分詞工具是經(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)時間長,系統(tǒng)穩(wěn)定性低,分詞結(jié)果也不可以顯示分詞的詞性,綜合來講與當(dāng)前成熟的開源的分詞工具還是有一定的差距,但是也不否定該工具具有的亮點(diǎn),以及其非常高的準(zhǔn)確性。 分詞是自然語言處理中底層并且非常重要的一環(huán),當(dāng)前做得也是比較成熟了,但是也存在很多缺陷,也是一個研究的方向。個人認(rèn)為,真正做自然語言處理,到最后依然是需要回歸到語言到底是什么,語言是如何發(fā)出的,語言的發(fā)展等等,當(dāng)今基于統(tǒng)計(jì)的自然語言處理不容置疑也確實(shí)做出不錯的成績,但基本上都是基于語料的,模型訓(xùn)練的等等。在自然語言處理這一交叉學(xué)科上,其發(fā)展依然任重而道遠(yuǎn),不能一味地崇拜機(jī)器學(xué)習(xí),深度學(xué)習(xí),回歸語言本質(zhì),用數(shù)學(xué)的方式進(jìn)行處理也將會是未來研究的方向。 版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。 回復(fù)下方「關(guān)鍵詞」,獲取優(yōu)質(zhì)資源 回復(fù)關(guān)鍵詞「 pybook03」,立即獲取主頁君與小伙伴一起翻譯的《Think Python 2e》電子版 回復(fù)關(guān)鍵詞「入門資料」,立即獲取主頁君整理的 10 本 Python 入門書的電子版 回復(fù)關(guān)鍵詞「m」,立即獲取Python精選優(yōu)質(zhì)文章合集 回復(fù)關(guān)鍵詞「book 數(shù)字」,將數(shù)字替換成 0 及以上數(shù)字,有驚喜好禮哦~ 題圖:pexels,CC0 授權(quán)。
|