Python中文分詞及詞頻統(tǒng)計

中文分詞

中文分詞(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的中文分詞庫有很多,常見的有:

  • jieba(結(jié)巴分詞)
  • THULAC(清華大學(xué)自然語言處理與社會人文計算實驗室)
  • pkuseg(北京大學(xué)語言計算與機器學(xué)習(xí)研究組)
  • SnowNLP
  • pynlpir
  • CoreNLP
  • pyltp

通常前三個是比較經(jīng)常見到的忘蟹,主要在易用性/準確率/性能都還不錯飒房。我個人常用的一直都是結(jié)巴分詞(比較早接觸),最近使用pkuseg媚值,兩者的使用后面詳細講。

結(jié)巴分詞

簡介

“結(jié)巴”中文分詞:做最好的 Python 中文分詞組件

  • 支持三種分詞模式:

    • 精確模式护糖,試圖將句子最精確地切開褥芒,適合文本分析;
    • 全模式嫡良,把句子中所有的可以成詞的詞語都掃描出來, 速度非趁谭觯快,但是不能解決歧義寝受;
    • 搜索引擎模式坷牛,在精確模式的基礎(chǔ)上,對長詞再次切分很澄,提高召回率京闰,適合用于搜索引擎分詞。
  • 支持繁體分詞

  • 支持自定義詞典

實例

我們使用京東商場的美的電器評論來看看結(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)過前面的分詞后,我們可以通過查看分詞是否準確辆雾,會發(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)實際上有些詞實際上意義不大拴念,比如:標點符號、嗯褐缠、啊等詞政鼠,這個時候我們需要將停用詞去除掉。首先我們需要有個停用詞詞組队魏,可以自定義也可以從網(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)域分詞官帘,有效提升了分詞準確度。

簡介

pkuseg具有如下幾個特點:

  1. 多領(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ī)藥、旅游钓猬、專利稍刀、小說等等。
  2. 更高的分詞準確率敞曹。相比于其他的分詞工具包账月,當(dāng)使用相同的訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),pkuseg可以取得更高的分詞準確率澳迫。
  3. 支持用戶自訓(xùn)練模型局齿。支持用戶使用全新的標注數(shù)據(jù)進行訓(xùn)練。

注:pkuseg目前僅支持Python3橄登,目前已經(jīng)很多主流庫開始不支持Python2抓歼,建議使用Python3版本讥此,如需使用Python2可創(chuàng)建虛擬環(huán)境來搭建。

實例

pkuseg的使用跟結(jié)巴分詞有一點不一樣谣妻,pkuseg需要先創(chuàng)建模型實例再使用實例方法cut萄喳。前面有提到pkuseg是支持加載與訓(xùn)練模型的,這也大大提高了分詞準確性蹋半,特別是對細分領(lǐng)域數(shù)據(jù)集進行分詞他巨,詳細查看GitHub文檔。

import pkuseg

# 以默認配置加載模型
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也支持自定義詞典來提高分詞準確率染突。

# 使用默認模型,并使用自定義詞典
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)

性能對比

結(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分數(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é)巴分詞,但如果追求準確度和特定領(lǐng)域分詞可以選擇pkuseg加載模型再分詞锦援。另外jieba和THULAC并沒有提供細分領(lǐng)域預(yù)訓(xùn)練模型猛蔽,如果想使用自定義模型分詞需使用它們提供的訓(xùn)練接口在細分領(lǐng)域的數(shù)據(jù)集上進行訓(xùn)練,用訓(xùn)練得到的模型進行中文分詞灵寺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曼库,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子略板,更是在濱河造成了極大的恐慌毁枯,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叮称,死亡現(xiàn)場離奇詭異种玛,居然都是意外死亡,警方通過查閱死者的電腦和手機瓤檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門赂韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挠蛉,你說我怎么就攤上這事祭示。” “怎么了谴古?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵质涛,是天一觀的道長。 經(jīng)常有香客問我掰担,道長汇陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任带饱,我火速辦了婚禮毡代,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纠炮。我一直安慰自己月趟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布恢口。 她就那樣靜靜地躺著孝宗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕肩。 梳的紋絲不亂的頭發(fā)上因妇,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天问潭,我揣著相機與錄音,去河邊找鬼婚被。 笑死狡忙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的址芯。 我是一名探鬼主播灾茁,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谷炸!你這毒婦竟也來了北专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤旬陡,失蹤者是張志新(化名)和其女友劉穎拓颓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體描孟,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驶睦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匿醒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片场航。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廉羔,靈堂內(nèi)的尸體忽然破棺而出旗闽,到底是詐尸還是另有隱情,我是刑警寧澤蜜另,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嫡意,受9級特大地震影響举瑰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔬螟,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一此迅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旧巾,春花似錦耸序、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廓握,卻和暖如春搅窿,著一層夾襖步出監(jiān)牢的瞬間嘁酿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工男应, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闹司,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓沐飘,卻偏偏與公主長得像游桩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耐朴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容