jieba中文處理
1. 中文分詞
jieba是一個(gè)在中文自然語言處理中用的最多的工具包之一看疙,它以分詞起家,目前已經(jīng)能夠?qū)崿F(xiàn)包括分詞直奋、詞性標(biāo)注以及命名實(shí)體識別等多種功能能庆。既然Jieba是以分詞起家,我們自然要首先學(xué)習(xí)Jieba的中文分詞功能帮碰。Jieba提供了三種分詞模式:
- 精確模式 在該模式下相味,Jieba會將句子進(jìn)行最精確的切分
- 全模式 把句子中所有可以成詞的詞語都掃描出來,優(yōu)點(diǎn)在于該模式非逞惩欤快丰涉,缺點(diǎn)也很明顯,就是不能有效解決歧義的問題
- 搜索引擎模式 在精確模式的基礎(chǔ)上斯碌,對長詞進(jìn)行再次切分一死,該模式適合用于搜索引擎構(gòu)建索引的分詞
在jieba分詞中,最常用的分詞函數(shù)有兩個(gè)傻唾,分別是cut
和cut_for_search
投慈,分別對應(yīng)于“精確模式/全模式”和“搜索引擎模式”。
當(dāng)然冠骄,兩者的輸入?yún)?shù)也不一樣伪煤,cut函數(shù)的輸入主要有三個(gè),分別是:
- 需要分詞的字符串
-
cut_all
用來控制是否采用全模式 -
HMM
參數(shù)用來控制是否使用HMM模型
cut_for_search
函數(shù)主要有兩個(gè)參數(shù):
- 需要分詞的字符串
-
HMM
參數(shù)用來控制是否使用HMM模型
# coding:utf-8
import jieba
sent = "抑郁癥已成為全球頭號致殘?jiān)獌戳堇保曰疾茁蔬h(yuǎn)高于男性抱既。三個(gè)年齡群體的人最容易患上抑郁癥,包括年輕人扁誓,孕婦及產(chǎn)后婦女防泵,老年人。由抑郁癥引發(fā)的冷漠情緒蝗敢、動(dòng)力不足等精神狀態(tài)捷泞,會導(dǎo)致人無法適應(yīng)日常生活。關(guān)注心理健康寿谴,別讓抑郁打倒你锁右!"
# 精確模式
seg_list = jieba.cut(sent)
print("精確模式:", '/ '.join(seg_list))
print('-'*100)
# 全模式
seg_list = jieba.cut(sent, cut_all=True)
print("全模式:", '/ '.join(seg_list))
print('-'*100)
# 搜索引擎模式
seg_list = jieba.cut_for_search(sent)
print("搜索引擎模式:", '/ '.join(seg_list))
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/4z/5wdk0_qx6pv3zbbsdj0s4ys40000gn/T/jieba.cache
Loading model cost 1.022 seconds.
Prefix dict has been built succesfully.
精確模式: 抑郁癥/ 已/ 成為/ 全球/ 頭號/ 致殘/ 元兇/ ,/ 女性/ 患病/ 幾率/ 遠(yuǎn)高于/ 男性/ 。/ 三個(gè)/ 年齡/ 群體/ 的/ 人/ 最/ 容易/ 患上/ 抑郁癥/ 骡湖,/ 包括/ 年輕人/ 贱纠,/ 孕婦/ 及/ 產(chǎn)后/ 婦女/ ,/ 老年人/ 响蕴。/ 由/ 抑郁癥/ 引發(fā)/ 的/ 冷漠/ 情緒/ 谆焊、/ 動(dòng)力/ 不足/ 等/ 精神狀態(tài)/ ,/ 會/ 導(dǎo)致/ 人/ 無法/ 適應(yīng)/ 日常生活/ 浦夷。/ 關(guān)注/ 心理健康/ 辖试,/ 別/ 讓/ 抑郁/ 打倒/ 你/ !
----------------------------------------------------------------------------------------------------
全模式: 抑郁/ 抑郁癥/ 已成/ 成為/ 全球/ 頭號/ 致殘/ 元兇/ / / 女性/ 患病/ 幾率/ 遠(yuǎn)高于/ 高于/ 男性/ / / 三個(gè)/ 年齡/ 群體/ 的/ 人/ 最/ 容易/ 患上/ 抑郁/ 抑郁癥/ / / 包括/ 年輕/ 年輕人/ / / 孕婦/ 及/ 產(chǎn)后/ 婦女/ / / 老年/ 老年人/ / / 由/ 抑郁/ 抑郁癥/ 引發(fā)/ 的/ 冷漠/ 情緒/ / / 動(dòng)力/ 不足/ 等/ 精神/ 精神狀態(tài)/ 狀態(tài)/ / / 會/ 導(dǎo)致/ 人/ 無法/ 適應(yīng)/ 日常/ 日常生活/ 常生/ 生活/ / / 關(guān)注/ 注心/ 心理/ 心理健康/ 健康/ / / 別/ 讓/ 抑郁/ 打倒/ 你/ /
----------------------------------------------------------------------------------------------------
搜索引擎模式: 抑郁/ 抑郁癥/ 已/ 成為/ 全球/ 頭號/ 致殘/ 元兇/ 劈狐,/ 女性/ 患病/ 幾率/ 高于/ 遠(yuǎn)高于/ 男性/ 罐孝。/ 三個(gè)/ 年齡/ 群體/ 的/ 人/ 最/ 容易/ 患上/ 抑郁/ 抑郁癥/ ,/ 包括/ 年輕/ 年輕人/ 肥缔,/ 孕婦/ 及/ 產(chǎn)后/ 婦女/ 莲兢,/ 老年/ 老年人/ 。/ 由/ 抑郁/ 抑郁癥/ 引發(fā)/ 的/ 冷漠/ 情緒/ 续膳、/ 動(dòng)力/ 不足/ 等/ 精神/ 狀態(tài)/ 精神狀態(tài)/ 改艇,/ 會/ 導(dǎo)致/ 人/ 無法/ 適應(yīng)/ 日常/ 常生/ 生活/ 日常生活/ 。/ 關(guān)注/ 心理/ 健康/ 心理健康/ 坟岔,/ 別/ 讓/ 抑郁/ 打倒/ 你/ 谒兄!
需要注意的是,cut
和cut_for_search
返回的都是generator社付,如果想直接返回列表承疲,需要使用lcut
和lcut_for_search
如果在一些特定場景中,需要使用一些特殊詞匯進(jìn)行分詞鸥咖,就需要加載自定義的分詞詞典:
jieba.load_userdict(filename)
其中燕鸽,用戶字典的格式為:
朝三暮四 3 i
朝秦暮楚 1
湯姆
公主墳
每一行表示一個(gè)單詞,每行最多由三部分組成
詞語 詞頻(可省略) 詞性(可省略)
如果只是少量詞匯啼辣,可以使用
add_word(word, freq=None, tag=None)
需要注意的是绵咱,如果沒有給出詞頻和詞性信息,在后續(xù)的處理中可能會造成一定的影響熙兔。
2. 關(guān)鍵詞提取
jieba提供了兩種關(guān)鍵詞提取算法,分別是TF-IDF以及TextRank
2.1 基于TF-IDF算法的關(guān)鍵詞提取
關(guān)于TF-IDF的原理艾恼,可以參考吳軍老師的《數(shù)學(xué)之美》住涉,里面給出了很詳細(xì)的說明。本文只介紹利用TF-IDF算法提取關(guān)鍵詞钠绍。
from jieba import analyse
analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS=())
其中:
- sentence 表示待提取的文本
- topK 表示返回的TF-IDF最大的前n個(gè)詞語的數(shù)量
- withWeight 表示是否返回權(quán)重值舆声,默認(rèn)為False
- allowPOS 僅包括特定詞性的單詞,默認(rèn)值為空,即不篩選
from jieba import analyse
with open('./西游記.txt') as f:
lines = f.read()
words = analyse.extract_tags(lines, allowPOS=('n'))
print(' '.join(words))
行者 八戒 師父 菩薩 妖精 長老 呆子 悟空 徒弟 國王 小妖 妖怪 鐵棒 不題 師徒 老者 妖魔 兄弟 妖王 意思
2.2 基于TextRank算法的關(guān)鍵詞提取
TextRank的用法與extract_tags的函數(shù)定義完全一致
from jieba import analyse
with open('./西游記.txt') as f:
lines = f.read()
words = analyse.textrank(lines, allowPOS=('n'))
print(' '.join(words))
行者 師父 八戒 菩薩 妖精 國王 長老 意思 悟空 形容 呆子 徒弟 小妖 鐵棒 問道 兄弟 公主 弟子 道士 貧僧
3. 詞性標(biāo)注
詞性標(biāo)注主要是在分詞的基礎(chǔ)上媳握,對詞的詞性進(jìn)行判別碱屁,在jieba中可以使用如下方式進(jìn)行:
from jieba import posseg as psg
words = psg.cut(sent)
for word, tag in words:
print(f"{word} {tag}")
抑郁癥 i
已 d
成為 v
全球 n
頭號 n
致殘 v
元兇 n
, x
女性 n
患病 n
幾率 n
遠(yuǎn)高于 nr
男性 n
蛾找。 x
三個(gè) m
年齡 n
群體 n
的 uj
人 n
最 d
容易 a
患上 n
抑郁癥 i
娩脾, x
包括 v
年輕人 n
, x
孕婦 n
及 c
產(chǎn)后 n
婦女 n
打毛, x
老年人 n
柿赊。 x
由 p
抑郁癥 i
引發(fā) v
的 uj
冷漠 n
情緒 n
、 x
動(dòng)力 n
不足 a
等 u
精神狀態(tài) n
幻枉, x
會 v
導(dǎo)致 v
人 n
無法 n
適應(yīng) v
日常生活 i
碰声。 x
關(guān)注 v
心理健康 n
, x
別 d
讓 v
抑郁 a
打倒 v
你 r
熬甫! x
其他
并行分詞
在jieba中采用將目標(biāo)文檔按行分割胰挑,對每一行采用一個(gè)Python進(jìn)程進(jìn)行分詞處理,然后將結(jié)果歸并到一起(有點(diǎn)類似于MapReduce)椿肩。據(jù)說目前尚不支持Windows瞻颂,僅支持Linux和MacOS。
啟動(dòng)并行分詞使用如下命令:
jieba.enable_parallel(n)
- n 表示并行的進(jìn)程數(shù)量覆旱。
關(guān)閉并行分詞使用如下命令:
jieba.disable_parallel()
%%time
jieba.enable_parallel(6)
with open('./西游記.txt') as f:
content = f.read()
words = ' '.join(jieba.cut(content))
CPU times: user 274 ms, sys: 88.6 ms, total: 363 ms
Wall time: 1.66 s
%%time
jieba.disable_parallel()
with open('./西游記.txt') as f:
content = f.read()
words = ' '.join(jieba.cut(content))
CPU times: user 5.91 s, sys: 73.8 ms, total: 5.98 s
Wall time: 6.02 s
返回詞語在原文的起止位置
使用tokenize函數(shù)后蘸朋,會獲得一個(gè)詞語信息的元組,元組中的第一個(gè)元素是分詞得到的結(jié)果扣唱,第二個(gè)元素是詞的起始位置藕坯,第三個(gè)元素是詞的終止位置。
result = jieba.tokenize(sent)
for tk in result:
print(f"word {tk[0]}\t\t start: {tk[1]} \t\t end:{tk[2]}")
word 抑郁癥 start: 0 end:3
word 已 start: 3 end:4
word 成為 start: 4 end:6
word 全球 start: 6 end:8
word 頭號 start: 8 end:10
word 致殘 start: 10 end:12
word 元兇 start: 12 end:14
word 噪沙, start: 14 end:15
word 女性 start: 15 end:17
word 患病 start: 17 end:19
word 幾率 start: 19 end:21
word 遠(yuǎn)高于 start: 21 end:24
word 男性 start: 24 end:26
word 炼彪。 start: 26 end:27
word 三個(gè) start: 27 end:29
word 年齡 start: 29 end:31
word 群體 start: 31 end:33
word 的 start: 33 end:34
word 人 start: 34 end:35
word 最 start: 35 end:36
word 容易 start: 36 end:38
word 患上 start: 38 end:40
word 抑郁癥 start: 40 end:43
word , start: 43 end:44
word 包括 start: 44 end:46
word 年輕人 start: 46 end:49
word 正歼, start: 49 end:50
word 孕婦 start: 50 end:52
word 及 start: 52 end:53
word 產(chǎn)后 start: 53 end:55
word 婦女 start: 55 end:57
word 辐马, start: 57 end:58
word 老年人 start: 58 end:61
word 。 start: 61 end:62
word 由 start: 62 end:63
word 抑郁癥 start: 63 end:66
word 引發(fā) start: 66 end:68
word 的 start: 68 end:69
word 冷漠 start: 69 end:71
word 情緒 start: 71 end:73
word 局义、 start: 73 end:74
word 動(dòng)力 start: 74 end:76
word 不足 start: 76 end:78
word 等 start: 78 end:79
word 精神狀態(tài) start: 79 end:83
word 喜爷, start: 83 end:84
word 會 start: 84 end:85
word 導(dǎo)致 start: 85 end:87
word 人 start: 87 end:88
word 無法 start: 88 end:90
word 適應(yīng) start: 90 end:92
word 日常生活 start: 92 end:96
word 。 start: 96 end:97
word 關(guān)注 start: 97 end:99
word 心理健康 start: 99 end:103
word 萄唇, start: 103 end:104
word 別 start: 104 end:105
word 讓 start: 105 end:106
word 抑郁 start: 106 end:108
word 打倒 start: 108 end:110
word 你 start: 110 end:111
word 檩帐! start: 111 end:112
其他分詞器
除了本文介紹的jieba分詞工具包以外,還有很多好用的中文分詞工具另萤,比如
- NLPIR湃密,又名ICTCLAS(據(jù)說是要收費(fèi)的诅挑,但是我看文檔,并沒有提到收費(fèi))