jieba 分詞使用入門


1. 介紹

JIEBA 是目前最好的 Python 中文分詞組件,它主要有以下 3 種特性:

  • 支持 3 種分詞模式:精確模式、全模式、搜索引擎模式
  • 支持繁體分詞
  • 支持自定義詞典
import jieba
import jieba.posseg as pseg 
import jieba.analyse as anls 

2. 分詞

  可使用 jieba.cutjieba.cut_for_search 方法進行分詞,兩者所返回的結構都是一個可迭代的 generator,可使用 for 循環來獲得分詞后得到的每一個詞語(unicode),或者直接使用 jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。其中:

  • jieba.cutjieba.lcut 接受 3 個參數:
    • 需要分詞的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
    • cut_all 參數:是否使用全模式,默認值為 False
    • HMM 參數:用來控制是否使用 HMM 模型,默認值為 True
  • jieba.cut_for_searchjieba.lcut_for_search 接受 2 個參數:
    • 需要分詞的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
    • HMM 參數:用來控制是否使用 HMM 模型,默認值為 True
2.1 全模式和精確模式
# 全模式
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 模型,即 隱馬爾可夫模型(Hidden Markov Model, HMM),是一種基於概率的統計分析模型,用來描述一個系統隱性狀態的轉移和隱性狀態的表現概率。在 jieba 中,對於未登錄到詞庫的詞,使用了基於漢字成詞能力的 HMM 模型和 Viterbi 算法,其大致原理是:
# 未啟用 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'))。

4.3 自定義語料庫
關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫和停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑。

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() :關閉並行分詞模式
7 返回文本原始的位置
使用  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]))

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM