結巴分詞簡要理解
Python中分分詞工具很多,包括盤古分詞、Yaha分詞、Jieba分詞、清華THULAC等。它們的基本用法都大同小異,這裡先了解一下結巴分詞。
一、安裝
pip install jieba
若使用PyCharm,從左上角的File–>Setting–>Project:工程名–>Project Interpreter,點選右側的“+”,在彈出介面的搜尋欄中輸入“jieba”,Install Package
二、演算法介紹 結巴中文分詞涉及到的演算法包括:
(1) 基於Trie樹結構實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG);
(2) 採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合;
(3) 對於未登入詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi演算法。
三、分詞模式 結巴中文分詞支援的三種分詞模式包括:
(1) 精確模式:試圖將句子最精確地切開,適合文字分析;
(2) 全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義問題;
(3) 搜尋引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。
import jieba # 全模式 text = "我來到北京清華大學" seg_list = jieba.cut(text, cut_all=True) print(u"[全模式]: ", "/ ".join(seg_list)) # 精確模式 seg_list = jieba.cut(text, cut_all=False) print(u"[精確模式]: ", "/ ".join(seg_list)) # 預設是精確模式 seg_list = jieba.cut(text) print(u"[預設模式]: ", "/ ".join(seg_list)) # 搜尋引擎模式 seg_list = jieba.cut_for_search(text) print(u"[搜尋引擎模式]: ", "/ ".join(seg_list))
執行結果:
[全模式]: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學
[精確模式]: 我/ 來到/ 北京/ 清華大學
[預設模式]: 我/ 來到/ 北京/ 清華大學
[搜尋引擎模式]: 我/ 來到/ 北京/ 清華/ 華大/ 大學/ 清華大學
四、新詞識別
import jieba
#新詞識別 “杭研”並沒有在詞典中,但是也被Viterbi演算法識別出來了
seg_list = jieba.cut("他來到了網易杭研大廈")
print (u"[新詞識別]: ", "/ ".join(seg_list))
執行結果:
[新詞識別]: 他/ 來到/ 了/ 網易/ 杭研/ 大廈
五、自定義詞典
先看一個例子:
import jieba
text = "故宮的著名景點包括乾清宮、太和殿和黃琉璃瓦等"
# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))
# 精確模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精確模式]: ", "/ ".join(seg_list))
# 搜尋引擎模式
seg_list = jieba.cut_for_search(text)
print(u"[搜尋引擎模式]: ", "/ ".join(seg_list))
執行結果:
[全模式]: 故宮/ 的/ 著名/ 著名景點/ 景點/ 包括/ 乾/ 清宮/ / / 太和/ 太和殿/ 和/ 黃/ 琉璃/ 琉璃瓦/ 等
[精確模式]: 故宮/ 的/ 著名景點/ 包括/ 乾/ 清宮/ 、/ 太和殿/ 和/ 黃/ 琉璃瓦/ 等
[搜尋引擎模式]: 故宮/ 的/ 著名/ 景點/ 著名景點/ 包括/ 乾/ 清宮/ 、/ 太和/ 太和殿/ 和/ 黃/ 琉璃/ 琉璃瓦/ 等
可以看到,結巴分詞工具認出了專有名詞”太和殿”,但沒有認出”乾清宮”和”黃琉璃瓦”。 也就是說,專有名詞”乾清宮”和”黃琉璃瓦”可能因分詞而分開,這也是很多分詞工具的一個缺陷。 為此,Jieba分詞支援開發者使用自定定義的詞典,以便包含jieba詞庫裡沒有的詞語。雖然結巴有新詞識別能力,但自行新增新詞可以保證更高的正確率,尤其是專有名詞。
基本用法:
jieba.load_userdict(file_name) #file_name為自定義詞典的路徑
詞典格式和dict.txt一樣,一個詞佔一行; 每一行分三部分,第一部分為詞語,中間部分為詞頻,最後部分為詞性(可省略,ns為地點名詞),用空格隔開。 咱們在jieba的安裝目錄下新增mydict.txt,內容為
乾清宮 1 n
黃琉璃瓦 1 n
更新程式碼,主要是新增載入mydict.txt的程式碼:
import jieba
jieba.load_userdict("D:\Program Files\Python36\Lib\site-packages\jieba\mydict.txt")
text = "故宮的著名景點包括乾清宮、太和殿和黃琉璃瓦等"
# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))
# 精確模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精確模式]: ", "/ ".join(seg_list))
# 搜尋引擎模式
seg_list = jieba.cut_for_search(text)
print(u"[搜尋引擎模式]: ", "/ ".join(seg_list))
執行結果:
[全模式]: 故宮/ 的/ 著名/ 著名景點/ 景點/ 包括/ 乾清宮/ 清宮/ / / 太和/ 太和殿/ 和/ 黃琉璃瓦/ 琉璃/ 琉璃瓦/ 等
[精確模式]: 故宮/ 的/ 著名景點/ 包括/ 乾清宮/ 、/ 太和殿/ 和/ 黃琉璃瓦/ 等
[搜尋引擎模式]: 故宮/ 的/ 著名/ 景點/ 著名景點/ 包括/ 清宮/ 乾清宮/ 、/ 太和/ 太和殿/ 和/ 琉璃/ 琉璃瓦/ 黃琉璃瓦/ 等
可以看到,新新增的兩個專有名詞已經被結巴分詞工具辨別出來了。
六、關鍵詞提取 在構建VSM向量空間模型過程或者把文字轉換成數學形式計算中,你需要運用到關鍵詞提取的技術。
基本方法:
jieba.analyse.extract_tags(sentence, topK)
其中sentence為待提取的文字,topK為返回幾個TF/IDF權重最大的關鍵詞,預設值為20。
程式:
import jieba
import jieba.analyse
#匯入自定義詞典
jieba.load_userdict("D:\Program Files\Python36\Lib\site-packages\jieba\mydict.txt")
#精確模式
text = "故宮的著名景點包括乾清宮、太和殿和午門等。其中乾清宮非常精美,午門是紫禁城的正門,午門居中向陽。"
seg_list = jieba.cut(text, cut_all=False)
print (u"分詞結果:")
print ("/".join(seg_list))
#獲取關鍵詞
tags = jieba.analyse.extract_tags(text, topK=5)
print (u"關鍵詞:")
print (" ".join(tags))
執行結果:
故宮/的/著名景點/包括/乾清宮/、/太和殿/和/午門/等/。/其中/乾清宮/非常/精美/,/午門/是/紫禁城/的/正門/,/午門/居中/向陽/。
關鍵詞:
午門 乾清宮 著名景點 太和殿 向陽
這裡“午門”出現了3次,所以先輸出。“乾清宮”出現了2次,第二個輸出。
其他詞都出現1次,那麼為什麼接下來輸出的是“著名景點”、“太和殿”和“向陽”呢? 這是因為,在詞頻一樣的前題下,根據TF/IDF的順序來輸出,因為其他詞的TF一樣(都是1),所以IDF小的會先輸出來。
不知道結巴分詞是根據什麼來判斷IDF的,假如是根據dict.txt中的第二列詞頻來判斷,那麼確實是“著名景點” < “太陽殿” < “向陽” < 其他詞語。這樣第三個輸出的就是“著名景點”,最後兩個依次為“太陽殿”和“向陽”。
七、去除停用詞
import jieba
# 去除停用詞
stopwords = {}.fromkeys(['的', '包括', '等', '是'])
text = "故宮的著名景點包括乾清宮、太和殿和午門等。其中乾清宮非常精美,午門是紫禁城的正門。"
# 精確模式
segs = jieba.cut(text, cut_all=False)
final = ''
for seg in segs:
if seg not in stopwords:
final += seg
print (final)
seg_list = jieba.cut(final, cut_all=False)
print ("/ ".join(seg_list))
在資訊檢索中,為節省儲存空間和提高搜尋效率,在處理自然語言資料(或文字)之前或之後會自動過濾掉某些字或詞,比如“的”、“是”、“而且”、“但是”、”非常“等。這些字或詞即被稱為Stop Words(停用詞)。
故宮著名景點乾清宮、太和殿和午門。其中乾清宮非常精美,午門紫禁城正門。
故宮/ 著名景點/ 乾/ 清宮/ 、/ 太和殿/ 和/ 午門/ 。/ 其中/ 乾/ 清宮/ 非常/ 精美/ ,/ 午門/ 紫禁城/ 正門/ 。