1. 介紹
JIEBA 是目前最好的 Python 中文分詞組件,它主要有以下 3 種特性:
- 支持 3 種分詞模式:精確模式、全模式、搜索引擎模式
- 支持繁體分詞
- 支持自定義詞典
import jieba import jieba.posseg as pseg import jieba.analyse as anls
2. 分詞
可使用 jieba.cut
和 jieba.cut_for_search
方法進行分詞,兩者所返回的結構都是一個可迭代的 generator,可使用 for 循環來獲得分詞后得到的每一個詞語(unicode),或者直接使用 jieba.lcut
以及 jieba.lcut_for_search
直接返回 list。其中:
jieba.cut
和jieba.lcut
接受 3 個參數:- 需要分詞的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
- cut_all 參數:是否使用全模式,默認值為
False
- HMM 參數:用來控制是否使用 HMM 模型,默認值為
True
jieba.cut_for_search
和jieba.lcut_for_search
接受 2 個參數:- 需要分詞的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
- HMM 參數:用來控制是否使用 HMM 模型,默認值為
True
# 全模式 seg_list = jieba.cut("他來到上海交通大學", cut_all=True) print("【全模式】:" + "/ ".join(seg_list))
# 精確模式 seg_list = jieba.cut("他來到上海交通大學", cut_all=False) print("【精確模式】:" + "/ ".join(seg_list))
2.2 搜索引擎模式
# 搜索引擎模式 seg_list = jieba.cut_for_search("他畢業於上海交通大學機電系,后來在一機部上海電器科學研究所工作") print("【搜索引擎模式】:" + "/ ".join(seg_list))
2.3 HMM模型
# 未啟用 HMM seg_list = jieba.cut("他來到了網易杭研大廈", HMM=False) #默認精確模式和啟用 HMM print("【未啟用 HMM】:" + "/ ".join(seg_list)) 【未啟用 HMM】:他/ 來到/ 了/ 網易/ 杭/ 研/ 大廈 # 識別新詞 seg_list = jieba.cut("他來到了網易杭研大廈") #默認精確模式和啟用 HMM print("【識別新詞】:" + "/ ".join(seg_list)) 【識別新詞】:他/ 來到/ 了/ 網易/ 杭研/ 大廈
3 添加自定義字典
3.1 載入字典
使用 jieba.load_userdict(file_name)
即可載入詞典。
# 示例文本 sample_text = "周大福是創新辦主任也是雲計算方面的專家" # 未加載詞典 print("【未加載詞典】:" + '/ '.join(jieba.cut(sample_text))) 【未加載詞典】:周大福/ 是/ 創新/ 辦/ 主任/ 也/ 是/ 雲/ 計算/ 方面/ 的/ 專家 # 載入詞典 jieba.load_userdict("userdict.txt") # 加載詞典后 print("【加載詞典后】:" + '/ '.join(jieba.cut(sample_text))) 【加載詞典后】:周大福/ 是/ 創新辦/ 主任/ 也/ 是/ 雲計算/ 方面/ 的/ 專家
3.2 調整字典
使用 add_word(word, freq=None, tag=None)
和 del_word(word)
可在程序中動態修改詞典。
jieba.add_word('石墨烯') #增加自定義詞語 jieba.add_word('凱特琳', freq=42, tag='nz') #設置詞頻和詞性 jieba.del_word('自定義詞') #刪除自定義詞語
使用 suggest_freq(segment, tune=True)
可調節單個詞語的詞頻,使其能(或不能)被分出來。
# 調節詞頻前 print("【調節詞頻前】:" + '/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
4 關鍵詞提取
jieba 提供了兩種關鍵詞提取方法,分別基於 TF-IDF 算法和 TextRank 算法。
4.1 基於TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)是一種統計方法,用以評估一個詞語對於一個文件集或一個語料庫中的一份文件的重要程度
通過 jieba.analyse.extract_tags
方法可以基於 TF-IDF 算法進行關鍵詞提取,該方法共有 4 個參數:
- sentence:為待提取的文本
- topK:為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20
- withWeight:是否一並返回關鍵詞權重值,默認值為 False
- allowPOS:僅包括指定詞性的詞,默認值為空
4.2 基於TEXT-RANK
TextRank 是另一種關鍵詞提取算法,基於大名鼎鼎的 PageRank,其原理可參見論文—— TextRank: Bringing Order into Texts 。
通過 jieba.analyse.textrank
方法可以使用基於 TextRank 算法的關鍵詞提取,其與 'jieba.analyse.extract_tags' 有一樣的參數,但前者默認過濾詞性(allowPOS=('ns', 'n', 'vn', 'v')
)。
5 詞性標注
jieba.posseg.POSTokenizer(tokenizer=None)
新建自定義分詞器,
tokenizer
參數可指定內部使用的
jieba.Tokenizer
分詞器。
jieba.posseg.dt
為默認詞性標注分詞器。
words = pseg.cut("他改變了中國") for word, flag in words: print("{0} {1}".format(word, flag)) 他 r 改變 v 了 ul 中國 ns
6 並行分詞
將目標文本按行分隔后,把各行文本分配到多個 Python 進程並行分詞,然后歸並結果,從而獲得分詞速度的可觀提升。用法:
- jieba.enable_parallel(4):開啟並行分詞模式,參數為並行進程數
- jieba.disable_parallel() :關閉並行分詞模式
jieba.tokenize
方法可以返回詞語在原文的起止位置。
result = jieba.tokenize(u'上海益民食品一廠有限公司') print("【普通模式】") for tk in result: print("word: {0} \t\t start: {1} \t\t end: {2}".format(tk[0],tk[1],tk[2]))