jieba 結巴分詞 常用說明
安裝
- 全自動:easy_install jieba 或者 pip install jieba 或者pip3 install jieba
- 手 動:jieba 目錄放置於當前目錄或者 site-packages 目錄
演算法
- 基於統計詞典,構造字首詞典;基於字首詞典對句子進行切分,得到所有切分可能;根據切分位置,構造一個有向無環圖(DAG)
- 基於DAG圖,採用動態規劃計算最大概率路徑(最有可能的分詞結果),根據最大概率路徑分詞
- 對於未登入詞(詞庫中沒有的詞),採用有漢字成詞能力的 HMM 模型進行切分
- 注: jieba中沒有使用trie樹作為字首詞典儲存的資料結構,用的是字首集合,如set([‘數’, ‘資料’, ‘資料結’, ‘資料結構’])
功能
1.分詞
三種分詞模式
A、精確模式:將句子精確切開,適合文字分析。預設是精確模式。
B、全模式:將句中所有可以成詞的詞語都掃描出來,適合用於搜尋引擎構建倒排索引的分詞,粒度比較細
C、搜尋引擎模式:在精確模式基礎上,對長詞再次切分,適合搜尋引擎
注:當指定jieba.cut_for_search或jieba.cut的引數HMM=True時,就有了新詞發現的能力。
# encoding=utf-8 import jieba # 精確模式
seg_list = jieba.cut("我去過清華大學和北京大學。") print(unicode("精確模式: ","utf-8")+ "/ ".join(seg_list)) # 全模式 seg_list = jieba.cut("我去過清華大學和北京大學。", cut_all=True) print(unicode("全模式: ","utf-8") + "/ ".join(seg_list)) # 搜尋引擎模式 seg_list = jieba.cut_for_search("我去過清華大學和北京大學。") print(unicode("搜尋引擎模式: ","utf-8") + "/ ".join(seg_list)) # 精確模式/全模式下-新詞發現 “杭研”沒有在詞典中,也被HMM模型 Viterbi演算法識別出來 seg_list = jieba.cut("他來到了網易杭研大廈",HMM=True) print(unicode("精確模式/全模式-新詞發現: ","utf-8") + "/ ".join(seg_list)) # 搜尋引擎模式下-新詞發現 “杭研”沒有在詞典中,也被HMM模型 Viterbi演算法識別出來 seg_list = jieba.cut_for_search("他來到了網易杭研大廈",HMM=True) print(unicode("搜尋引擎模式-新詞發現: ","utf-8") + "/ ".join(seg_list)) #print result: #精確模式: 我/ 去過/ 清華大學/ 和/ 北京大學/ 。 #全模式: 我/ 去過/ 清華/ 清華大學/ 華大/ 大學/ 和/ 北京/ 北京大學/ 大學/ / #搜尋引擎模式: 我/ 去過/ 清華/ 華大/ 大學/ 清華大學/ 和/ 北京/ 大學/ 北京大學/ 。 #精確模式/全模式-新詞發現: 他/ 來到/ 了/ 網易/ 杭研/ 大廈 #搜尋引擎模式-新詞發現: 他/ 來到/ 了/ 網易/ 杭研/ 大廈2.新增自定義使用者詞典
jieba 有新詞發現能力,但新增使用者詞典可以保證更高的正確率。
無使用者詞典下中英文分詞示例
# encoding=utf-8 import jieba data=[ "世界經濟論壇也叫達沃斯論壇。", "The World Economic Forum is also called the Davos Forum." ] for d in data: seg_list = jieba.cut(d) #詞與詞之間用","連線 print(",".join(seg_list)) #無使用者詞典下中英文分詞結果 # 世界, 經濟, 論壇, 也, 叫, 達沃斯, 論壇,。 # The,, World,, Economic,, Forum,, is, , also,, called,, the,, >Davos,, Forum,.
預設格式使用者詞典下中英文分詞示例
預設詞典格式和 dict.txt(jieba包下) 一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name 若為路徑或二進位制方式開啟的檔案,則檔案必須為 UTF-8 編碼。
把中文詞”世界經濟論壇”、”達沃斯論壇”;英文詞”World Economic Forum”、”Davos Forum”新增到專案目錄下”“dict/userdict”“中。示例如下…
# encoding=utf-8 import jieba """ 預設格式下的使用者詞典"dict/userdict: 世界經濟論壇 n 達沃斯論壇 n World Economic Forum n Davos Forum n """ # 載入使用者詞典 jieba.load_userdict("dict/userdict") # 測試使用者詞典 data=[ "世界經濟論壇也叫達沃斯論壇。", "The World Economic Forum is also called the Davos Forum." ] for d in data: seg_list = jieba.cut(d) #詞與詞之間用","連線 print(",".join(seg_list)) #預設格式使用者詞典下中英文分詞結果 # 世界經濟論壇,也,叫,達沃斯論壇,。 # The, ,World, ,Economic, ,Forum, ,is, ,also, ,called, ,the, ,Davos, >,Forum,.
可以看到jieba分詞在預設格式下,中文沒問題,英文專有名詞不太理想。不過,可以通過修改jieba包中的init.py檔案幾個正則來解決。詳情請見:jieba分詞支援關鍵詞帶空格和特殊字元
修改格式後用戶詞典下中英文分詞示例
根據上述連結修改後,測試中英文下根據使用者詞典分詞。
# encoding=utf-8 import jieba """ 修改格式後的使用者詞典"dict/userdict:用@@來間隔詞、詞頻、詞性 世界經濟論壇@@n 達沃斯論壇@@n World Economic [email protected]@n Davos [email protected]@n """ # 載入使用者詞典 jieba.load_userdict("dict/userdict") # 測試使用者詞典 data=[ "世界經濟論壇也叫達沃斯論壇。", "The World Economic Forum is also called the Davos Forum." ] for d in data: seg_list = jieba.cut(d) #詞與詞之間用","連線 print(",".join(seg_list)) #修改格式後中英文分詞結果 # 世界經濟論壇,也,叫,達沃斯論壇,。 # The, ,World Economic Forum, ,is, ,also, ,called, ,the, ,Davos >Forum,.
2.關鍵詞提取
基於 TF-IDF 演算法的關鍵詞抽取
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))
引數解釋:
(1)sentence :待提取的文字;
(2)topK :返回K個權重最大的關鍵詞
(3)withWeight :是否返回權重
(4)allowPOS :是否僅包括指定詞性的詞
# encoding=utf-8 #關鍵詞提取 import jieba.analyse kWords = jieba.analyse.extract_tags("此外,公司擬對全資子公司吉林歐亞置業>有限公司增資4.3億元,增資後,吉林歐亞置業註冊資本由7000萬元增加到5億元。>吉林歐亞置業主要經營範圍為房地產開發及百貨零售等業務。目前在建吉林歐亞城>市商業綜合體專案。2013年,實現營業收入0萬元,實現淨利潤-139.13萬元。", >topK=5,withWeight=True) for word,weight in kWords: # print(word+":"+weight) print word,":",weight #結果 # 歐亞 : 0.730014270029 # 吉林 : 0.659038184374 # 置業 : 0.488713452211 # 萬元 : 0.339272248186 # 增資 : 0.335824019852
注: 關鍵詞提取所使用逆文頻(IDF)庫、停用詞庫可切換成自定路徑
基於 TextRank 演算法的關鍵詞抽取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))
引數解釋:
(1)sentence :待提取的文字;
(2)topK :返回K個權重最大的關鍵詞
(3)withWeight :是否返回權重
(4)allowPOS :是否僅包括指定詞性的詞
TextRank基本思想:
(1)分詞
(2)找詞之間共現關係,構建圖
(3)計算圖中節點的PageRank3.詞性標註
import jieba.posseg as pseg words = pseg.cut("我愛北京天安門") for word, flag in words: print('%s %s' % (word, flag)) #詞性 #我 r #愛 v #北京 ns #天安門 ns
4.並行分詞
原理:
文字按行分隔後,分配到多個 Python 程序並行分詞,最後歸併結果。
用法:
jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程序數
jieba.disable_parallel() # 關閉並行分詞模式
效果:
在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程序版的 3.3 倍。
注意:
並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。目前暫不支援 Windows5.返回詞語在原文的起止位置
import jieba result = jieba.tokenize(u'永和服裝飾品有限公司') for tk in result: print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2])) #結果 #word 永和 start: 0 end:2 #word 服裝 start: 2 end:4 #word 飾品 start: 4 end:6 #word 有限公司 start: 6 end:10 #word 不是 start: 10 end:12