在所有人類語言中,一句話、一段文本、一篇文章都是有一個個的詞組成的。詞是包含獨立意義的最小文本單元,將長文本拆分成單個獨立的詞匯的過程叫做分詞。分詞之后,文本原本的語義將被拆分到在更加精細化的各個獨立詞匯中,詞匯的結(jié)構(gòu)比長文本簡單,對于計算機而言,更容易理解和分析,所以,分詞往往是自然語言處理的第一步。
對于英文文本,句子中的詞匯可以通過空格很容易得進行劃分,但是在我們中文中則不然,沒有明顯的劃分標(biāo)志,所以需要通過專門的方法(算法)進行分詞。在Python中,有多種庫實現(xiàn)了各種方法支持中文分詞,例如:jieba、hanlp、pkuseg等。在本篇中,先來說說jieba分詞。
1 四種模式分詞
(1)精確模式:試圖將句子最精確地切開,適合文本分析。精確分詞模式對應(yīng)的方法是jieba.cut,該方法接受四個輸入?yún)?shù): 需要分詞的字符串;cut_all 參數(shù)用來控制是否采用全模式,值為False時表示采用精確分詞模式;HMM 參數(shù)用來控制是否使用 HMM 模型。
(2)全模式:把句子中所有的可以成詞的詞語都掃描出來,速度非??欤遣荒芙鉀Q歧義。全模式同樣是調(diào)用jieba.cut方法實現(xiàn),不過cut_all參數(shù)值設(shè)置為True。
(3)搜索引擎模式:在精確模式的基礎(chǔ)上,對長詞再詞切分,提高召回率,適合用于搜索引擎分詞。搜索引擎模式對應(yīng)的方法是jieba.cut_for_search。該方法接受兩個參數(shù):需要分詞的字符串;是否使用 HMM 模型。該方法適合用于搜索引擎構(gòu)建倒排索引的分詞,粒度比較細。
注意,待分詞的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建議直接輸入 GBK 字符串,可能無法預(yù)料地錯誤解碼成 UTF-8。 另外,jieba.cut 以及 jieba.cut_for_search 返回的結(jié)構(gòu)都是一個可迭代的 generator,可以使用 for 循環(huán)來獲得分詞后得到的每一個詞語(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。
在分詞文本過大時,可以使用jieba.enable_parallel()來開啟并行分詞模式,使用多進行進行分詞。
import jieba
strt = "據(jù)報道,因雷暴雨天氣,該地區(qū)川億線變壓器跌落式熔斷器引流線燒斷,造成電壓不穩(wěn)"
# 精確模式,默認hi精確模式,所以可以不指定cut_all=False
sl = jieba.cut(strt, cut_all=False, HMM=False)
print("精確模式分詞結(jié)果:", ",".join(sl))
print('\n')
# 全模式
sl = jieba.cut(strt, cut_all=True)
print("全模式分詞結(jié)果:", ",".join(sl) )
print('\n')
# 搜索引擎模式
sl = jieba.cut_for_search(strt)
print("搜索引擎模式分詞結(jié)果:", ",".join(sl))
在上面分詞結(jié)果中,可以看出,部分專有名詞并沒有被正確劃分,這時候可以試試將HMM參數(shù)設(shè)置為True,表示使用隱馬爾可夫模型發(fā)現(xiàn)新詞:
sl = jieba.cut(strt, cut_all=False, HMM=True)
print(",".join(sl))
遺憾的是,就算使用了發(fā)現(xiàn)新詞功能,只是進一步劃分出了“燒斷”一詞,仍然沒有對“川億線”、“跌落式”、“引流線”等詞匯進行正確提取,這是隱馬爾可夫模型分詞原理決定的,只能發(fā)現(xiàn)在原始訓(xùn)練詞庫匯總頻率稍高的新詞,而對沒有出現(xiàn)過的新詞無能為力。這時候,我們可以自定義詞典來添加新詞。
2 自定義詞典分詞
2.1 添加詞典
自定義詞典分詞是指在分詞前,用戶手動將部分詞匯添加到結(jié)巴分詞的詞庫中。通過這種方式可以進一步提取出默認詞庫中沒有的詞匯,提高分詞準確率。
在添加詞典通過jieba.load_userdict(file_name)方法實現(xiàn),參數(shù)file_name是詞典文件名,詞典中一個詞占一行,每一行分三部分,即詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。
可見,“川億線”一次已被正確劃分。再來試試jieba.load_userdict(file_name)添加詞庫,這種方式的好處是可以一次性添加多個詞。我們先將詞匯寫入文件,請讀者自行新建一個名為“dict.txt”的文件,寫入一下內(nèi)容:
跌落式 90 a 熔斷器 80 a 跌落式熔斷器 10 n 引流線 80 n
strt = "據(jù)報道,因雷暴雨天氣,該地區(qū)川億線變壓器跌落式熔斷器引流線燒斷,造成電壓不穩(wěn)"
jieba.load_userdict('dict.txt')
sl = jieba.cut(strt, cut_all=False)
print(",".join(sl))
從上面結(jié)果可以看出,添加自定義的詞庫后,原本沒有被正確劃分出來的詞,如“跌落式熔斷器”,“引流線”等都被正確劃分出來了。
2.2 調(diào)整詞典
添加自定義的詞典后,有時候我們還是需要對詞典進行微調(diào)。
jieba.suggest_freq()
在上述我們自定義的詞典中包含“跌落式”、“熔斷器”、“跌落式熔斷器”三個詞,但是分詞結(jié)果中按最長的“跌落式熔斷器”進行分詞,如果我們分別進行劃分,可以使用jieba.suggest_freq()方法調(diào)節(jié)單個詞語的詞頻,使其能(或不能)被正確劃分出來。
jieba.suggest_freq(('跌落式', '熔斷器'), tune=True)
sl = jieba.cut(strt, cut_all=False, HMM=False)
print(",".join(sl))
這時候,“跌落式”、“熔斷器”兩個詞就沒有在被完整劃分。
同時,對于居中的“不穩(wěn)”一詞,在上述分詞結(jié)果中被分成了兩個部分,這里也可以通過jieba.suggest_freq()調(diào)整,使其分為一個完整詞。
jieba.suggest_freq('不穩(wěn)', tune=True)
sl = jieba.cut(strt, cut_all=False)
print(",".join(sl))
據(jù),報道,,,因,雷暴雨,天氣,,,該,地區(qū),川,億線,變壓器,跌落式熔斷器,引流線,燒斷,,,造成,電壓,不穩(wěn)
sl = jieba.cut(strt, cut_all=False)
print(",".join(sl))
據(jù),報道,,,因,雷暴雨,天氣,,,該,地區(qū),川,億線,變壓器,跌落,式,熔斷器,引流線,燒斷,,,造成,電壓,不穩(wěn)
jieba.add_word(word, freq=None, tag=None)
jieba.add_word()用于向詞庫中添加一個詞,該方法有三個參數(shù):word指需要添加的詞,freq是詞頻,tag是詞性,其中,詞頻和詞性可省略。例如,在上述分詞中沒有被正確劃分為一個詞“川億線”添加到詞庫中:
jieba.add_word('川億線')
sl = jieba.cut(strt, cut_all=False, HMM=False)
print(",".join(sl))
據(jù),報道,,,因,雷暴雨,天氣,,,該,地區(qū),川億線,變壓器,跌落,式,熔斷器,引流線,燒,斷,,,造成,電壓,不穩(wěn)
del_word(word)
del_word(word)可以刪除詞庫中的一個詞。
jieba.del_word('川億線')
sl = jieba.cut(strt, cut_all=False, HMM=False)
print(",".join(sl))
據(jù),報道,,,因,雷暴雨,天氣,,,該,地區(qū),川,億,線,變壓器,跌落,式,熔斷器,引流線,燒,斷,,,造成,電壓,不穩(wěn)
3 詞性標(biāo)注
jieba分詞中,通過jieba.posseg提供詞性標(biāo)注支持。jieba.posseg.cut()方法返回一個生成器,jieba.posseg.lcut()放回一個列表。
import jieba.posseg
sl = jieba.posseg.cut(strt)
for x in sl:
print('分詞: ', x.word, ' 詞性: ', x.flag)
分詞: 據(jù) 詞性: p 分詞: 報道 詞性: v 分詞: , 詞性: x 分詞: 因 詞性: p 分詞: 雷暴雨 詞性: nr 分詞: 天氣 詞性: n 分詞: , 詞性: x 分詞: 該 詞性: r 分詞: 地區(qū) 詞性: n 分詞: 川 詞性: j 分詞: 億線 詞性: m 分詞: 變壓器 詞性: n 分詞: 跌落 詞性: v 分詞: 式 詞性: k 分詞: 熔斷器 詞性: n 分詞: 引流線 詞性: n 分詞: 燒斷 詞性: v 分詞: , 詞性: x 分詞: 造成 詞性: v 分詞: 電壓 詞性: n 分詞: 不穩(wěn) 詞性: a
結(jié)巴分詞中,各種詞性標(biāo)注含義如下所示:

4 關(guān)鍵詞提取
4.1 基于 TF-IDF 算法的關(guān)鍵詞抽取
TF-IDF算法可以分為TF和IDF兩個部分來理解,TF指的是Term Frequency,意思詞頻。

IDF指的是inverse document frequency,即逆文檔頻率。

從計算公式上可以看出,TF衡量的是某個詞在當(dāng)前文檔的頻率,IDF衡量的是包含某個詞的文檔占比,當(dāng)占比越少時,IDF越大。TF-IDF算法的基本思想:某一個詞在本篇文章中詞頻越高(TF越大),而在其他文章中出現(xiàn)次數(shù)少(IDF?。?,則越有可能是本篇文章的關(guān)鍵詞。將TF與IDF相結(jié)合,進行關(guān)鍵詞篩選,于是有了一個新的量TF-IDF:

jieba分詞中實現(xiàn)了TF-IDF算法,進行關(guān)鍵詞選取,可以通過調(diào)用jieba.analyse.extract_tags()使用這一功能,在extract_tags()有4個參數(shù):
sentence 為待提取的文本
topK 為返回幾個 TF/IDF 權(quán)重最大的關(guān)鍵詞,默認值為 20
withWeight 為是否一并返回關(guān)鍵詞權(quán)重值,默認值為 False
allowPOS 僅包括指定詞性的詞,默認值為空,即不篩選文章來源:http://www.zghlxwxcb.cn/news/detail-501795.html
import jieba.analyse as analyse
txt = "自然語言處理是計算機科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個重要方向。它研究能實現(xiàn)人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融語言學(xué)、計算機科學(xué)、數(shù)學(xué)于一體的科學(xué)。因此,這一領(lǐng)域的研究將涉及自然語言,即人們?nèi)粘J褂玫恼Z言,所以它與語言學(xué)的研究有著密切的聯(lián)系,但又有重要的區(qū)別。自然語言處理并不是一般地研究自然語言,而在于研制能有效地實現(xiàn)自然語言通信的計算機系統(tǒng),特別是其中的軟件系統(tǒng)。因而它是計算機科學(xué)的一部分。"
analyse.extract_tags(txt, topK=5, withWeight=True, allowPOS=())
[('自然語言', 1.1237629576061539), ('計算機科學(xué)', 0.4503481350267692), ('語言學(xué)', 0.27566262244215384), ('研究', 0.2660770221507693), ('領(lǐng)域', 0.24979825580353845)]
4.2 基于 TextRank 算法的關(guān)鍵詞抽取
TextRank算法在原理上比DF-ITF算法復(fù)雜許多,本文不在展開介紹。在jieba分詞庫中使用TextRank算法通過調(diào)用jieba.analyse.textrank方法實現(xiàn)。該方法參數(shù)與上述使用TF-IDF算法時調(diào)用的analyse.extract_tags的參數(shù)一致。文章來源地址http://www.zghlxwxcb.cn/news/detail-501795.html
txt = "自然語言處理是計算機科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個重要方向。它研究能實現(xiàn)人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融語言學(xué)、計算機科學(xué)、數(shù)學(xué)于一體的科學(xué)。因此,這一領(lǐng)域的研究將涉及自然語言,即人們?nèi)粘J褂玫恼Z言,所以它與語言學(xué)的研究有著密切的聯(lián)系,但又有重要的區(qū)別。自然語言處理并不是一般地研究自然語言,而在于研制能有效地實現(xiàn)自然語言通信的計算機系統(tǒng),特別是其中的軟件系統(tǒng)。因而它是計算機科學(xué)的一部分。"
analyse.textrank(txt, topK=5, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
['研究', '領(lǐng)域', '計算機科學(xué)', '實現(xiàn)', '處理']
到了這里,關(guān)于數(shù)據(jù)分析之jieba分詞使用詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!