Python中文分詞庫jieba,pkusegwg性能準(zhǔn)確度比較
中文分詞(Chinese Word Segmentation),將中文語句切割成單獨的詞組。英文使用空格來分開每個單詞的,而中文單獨一個漢字跟詞有時候完全不是同個含義,因此,中文分詞相比英文分詞難度高很多。
分詞主要用于NLP 自然語言處理(Natural Language Processing),使用場景有:
- 搜索優(yōu)化,關(guān)鍵詞提?。ò俣戎笖?shù))
- 語義分析,智能問答系統(tǒng)(客服系統(tǒng))
- 非結(jié)構(gòu)化文本媒體內(nèi)容,如社交信息(微博熱榜)
- 文本聚類,根據(jù)內(nèi)容生成分類(行業(yè)分類)
Python的中文分詞
Python的中文分詞庫有很多,常見的有:
- jieba(結(jié)巴分詞)
- THULAC(清華大學(xué)自然語言處理與社會人文計算實驗室)
- pkuseg(北京大學(xué)語言計算與機器學(xué)習(xí)研究組)
- SnowNLP
- pynlpir
- CoreNLP
- pyltp
通常前三個是比較經(jīng)常見到的,主要在易用性/準(zhǔn)確率/性能都還不錯。我個人常用的一直都是結(jié)巴分詞(比較早接觸),最近使用pkuseg,兩者的使用后面詳細講。
結(jié)巴分詞
簡介
“結(jié)巴”中文分詞:做最好的 Python 中文分詞組件
- 支持三種分詞模式:
- 精確模式,試圖將句子最精確地切開,適合文本分析;
- 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非???,但是不能解決歧義;
- 搜索引擎模式,在精確模式的基礎(chǔ)上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
- 支持繁體分詞
- 支持自定義詞典
jieba分詞實例
我們使用京東商場的美的電器評論來看看結(jié)巴分詞的效果。如果你沒有安裝結(jié)巴分詞庫則需要在命令行下輸入pip install jieba,安裝完之后即可開始分詞之旅。
評論數(shù)據(jù)整理在文件meidi_jd.csv文件中,讀取數(shù)據(jù)前先導(dǎo)入相關(guān)庫。因為中文的文本或文件的編碼方式不同編碼選擇gb18030,有時候是utf-8、gb2312、gbk自行測試。
# 導(dǎo)入相關(guān)庫 import pandas as pd import jieba # 讀取數(shù)據(jù) data = pd.read_csv('meidi_jd.csv', encoding='gb18030') # 查看數(shù)據(jù) data.head()
# 生成分詞 data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x))) data.head()
到這里我們僅僅通過一行代碼即可生成中文的分詞列表,如果你想要生成分詞后去重可以改成這樣。
data['cut'] = data['comment'].apply(lambda x : list(set(jieba.cut(x))))
自定義詞典
經(jīng)過前面的分詞后,我們可以通過查看分詞是否準(zhǔn)確,會發(fā)現(xiàn)實際上有些詞被分隔成單獨的漢字,例如:
print(data['cut'].loc[14])
['很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好']
這時候我們就需要導(dǎo)入自定義的詞典,以便包含 jieba 詞庫里沒有的詞。雖然 jieba 有新詞識別能力,但是自行添加新詞可以保證更高的正確率。自定義詞典采用一詞一行,為了演示我添加了“很好”并保存在dict.txt文件中,讓我們開始用自定義的詞典吧!
data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x))) data.head() print(data['cut'].loc[14])
['很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好']
現(xiàn)在已經(jīng)按照我們計劃的正確分詞出來了!很好!
停用詞
分詞的過程中我們會發(fā)現(xiàn)實際上有些詞實際上意義不大,比如:標(biāo)點符號、嗯、啊等詞,這個時候我們需要將停用詞去除掉。首先我們需要有個停用詞詞組,可以自定義也可以從網(wǎng)上下載詞庫,這里我們使用網(wǎng)上下載的停用詞文件StopwordsCN.txt。
# 讀取停用詞數(shù)據(jù) stopwords = pd.read_csv('StopwordsCN.txt', encoding='utf8', names=['stopword'], index_col=False) stopwords.head()
接下里我們只要適當(dāng)更改分詞的代碼即可在分詞的時候去掉停用詞:
# 轉(zhuǎn)化詞列表 stop_list = stopwords['stopword'].tolist() # 去除停用詞 data['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list]) data.head()
pkuseg
pkuseg簡單易用,支持細分領(lǐng)域分詞,有效提升了分詞準(zhǔn)確度。
簡介
pkuseg具有如下幾個特點:
- 多領(lǐng)域分詞。不同于以往的通用中文分詞工具,此工具包同時致力于為不同領(lǐng)域的數(shù)據(jù)提供個性化的預(yù)訓(xùn)練模型。根據(jù)待分詞文本的領(lǐng)域特點,用戶可以自由地選擇不同的模型。 我們目前支持了新聞領(lǐng)域,網(wǎng)絡(luò)文本領(lǐng)域和混合領(lǐng)域的分詞預(yù)訓(xùn)練模型,同時也擬在近期推出更多的細領(lǐng)域預(yù)訓(xùn)練模型,比如醫(yī)藥、旅游、專利、小說等等。
- 更高的分詞準(zhǔn)確率。相比于其他的分詞工具包,當(dāng)使用相同的訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),pkuseg可以取得更高的分詞準(zhǔn)確率。
- 支持用戶自訓(xùn)練模型。支持用戶使用全新的標(biāo)注數(shù)據(jù)進行訓(xùn)練。
注:pkuseg目前僅支持Python3,目前已經(jīng)很多主流庫開始不支持Python2,建議使用Python3版本,如需使用Python2可創(chuàng)建虛擬環(huán)境來搭建。
Python中文分詞庫jpkuseg實例
pkuseg的使用跟結(jié)巴分詞有一點不一樣,pkuseg需要先創(chuàng)建模型實例再使用實例方法cut。前面有提到pkuseg是支持加載與訓(xùn)練模型的,這也大大提高了分詞準(zhǔn)確性,特別是對細分領(lǐng)域數(shù)據(jù)集進行分詞,詳細查看GitHub文檔。
import pkuseg # 以默認(rèn)配置加載模型 seg = pkuseg.pkuseg() # 進行分詞 data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list]) data.head()
自定義詞典
同樣的,pkuseg也支持自定義詞典來提高分詞準(zhǔn)確率。
# 使用默認(rèn)模型,并使用自定義詞典 seg = pkuseg.pkuseg(user_dict='dict.txt') # 進行分詞 data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list]) print(data['cut'].loc[14])
自定義預(yù)訓(xùn)練模型
分詞模式下,用戶需要加載預(yù)訓(xùn)練好的模型。pkuseg提供三種不同數(shù)據(jù)類型訓(xùn)練得到的模型。
- MSRA: 在MSRA(新聞?wù)Z料)上訓(xùn)練的模型。下載地址
- CTB8: 在CTB8(新聞文本及網(wǎng)絡(luò)文本的混合型語料)上訓(xùn)練的模型。下載地址
- WEIBO: 在微博(網(wǎng)絡(luò)文本語料)上訓(xùn)練的模型。下載地址
- MixedModel: 混合數(shù)據(jù)集訓(xùn)練的通用模型。隨pip包附帶的是此模型。下載地址
# 下載后解壓出來,并復(fù)制文件夾路徑 file_path = '/Users/jan/anaconda3/lib/python3.6/site-packages/pkuseg/ctb8' # 加載其他預(yù)訓(xùn)練模型 seg = pkuseg.pkuseg(model_name=file_path) text = seg.cut('京東商城信得過,買的放心,用的省心、安心、放心!') print(text)
jieba與pkusegwg性能對比
結(jié)巴的分詞速度說明比較簡單,描述中也沒有性能對比,更像是分詞內(nèi)容和環(huán)境。。
- 1.5 MB / Second in Full Mode
- 400 KB / Second in Default Mode
- 測試環(huán)境: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《圍城》.txt
相比之下pkuseg選擇jieba、THULAC等國內(nèi)代表分詞工具包與pkuseg做性能比較。以下是在不同數(shù)據(jù)集上的對比結(jié)果:
從結(jié)果看pkuseg在精確度、召回率和F分?jǐn)?shù)上表現(xiàn)得相當(dāng)不錯。性能方面我使用jupyter notebook進行簡單測試。
%%timeit data['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])
%%timeit data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])
輸出結(jié)果:
結(jié)巴:2.54 s ± 3.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
pkuseg:7.45 s ± 68.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
從數(shù)據(jù)結(jié)果上看,pkuseg分詞的時間要高于結(jié)巴分詞的時間,當(dāng)然pkuseg提供多進程來進行分詞,性能方面也是可以提高的。
詞頻統(tǒng)計
到這里我們基本是已經(jīng)學(xué)會用Python庫進行分詞,關(guān)于詞頻統(tǒng)計的方式也很多,我們先將所有分詞合并在一起方便統(tǒng)計。
# 將所有的分詞合并 words = [] for content in data['cut']: words.extend(content)
方式一:
# 創(chuàng)建分詞數(shù)據(jù)框 corpus = pd.DataFrame(words, columns=['word']) corpus['cnt'] = 1 # 分組統(tǒng)計 g = corpus.groupby(['word']).agg({'cnt': 'count'}).sort_values('cnt', ascending=False) g.head(10)
方式二:
# 導(dǎo)入相關(guān)庫 from collections import Counter from pprint import pprint counter = Counter(words) # 打印前十高頻詞 pprint(counter.most_common(10))
[('不錯', 3913),
('安裝', 3055),
('好', 2045),
('很好', 1824),
('買', 1634),
('熱水器', 1182),
('挺', 1051),
('師傅', 923),
('美', 894),
('送貨', 821)]
結(jié)尾
我個人的使用建議,如果想簡單快速上手分詞可以使用結(jié)巴分詞,但如果追求準(zhǔn)確度和特定領(lǐng)域分詞可以選擇pkuseg加載模型再分詞。另外jieba和THULAC并沒有提供細分領(lǐng)域預(yù)訓(xùn)練模型,如果想使用自定義模型分詞需使用它們提供的訓(xùn)練接口在細分領(lǐng)域的數(shù)據(jù)集上進行訓(xùn)練,用訓(xùn)練得到的模型進行中文分詞。
更多關(guān)于Python中文分詞庫jieba,pkusegwg的相關(guān)文章可以點擊下面的相關(guān)鏈接
相關(guān)文章
Python實現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能完整實例
這篇文章主要介紹了Python實現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能,結(jié)合完整實例形式分析了Python多線程、多用戶FTP服務(wù)器端與客戶端相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下2017-08-08Qt Quick QML-500行代碼實現(xiàn)合成大西瓜游戲
合成大西瓜游戲是前段時間比較火的小游戲,最近小編閑來無事,通過研究小球碰撞原理親自寫碰撞算法實現(xiàn)一個合成大西瓜游戲,下面小編把我的實現(xiàn)思路及核心代碼分析出來,供大家參考2021-05-05實例講解Python設(shè)計模式編程之工廠方法模式的使用
這篇文章主要介紹了Python設(shè)計模式編程之工廠方法模式的運用實例,文中也對Factory Method模式中涉及到的角色作出了解析,需要的朋友可以參考下2016-03-03pandas計算相關(guān)系數(shù)corr返回空的問題解決
本文主要介紹了pandas計算相關(guān)系數(shù)corr返回空的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01