1. 程式人生 > >中文分詞的演算法與實現(結巴分詞)

中文分詞的演算法與實現(結巴分詞)

       宣告:程式碼的執行環境為Python3。Python3與Python2在一些細節上會有所不同,希望廣大讀者注意。本部落格以程式碼為主,程式碼中會有詳細的註釋。相關文章將會發布在我的個人部落格專欄《Python自然語言處理》,歡迎大家關注。

 

       結巴分詞支援三種分詞模式:1.精確模式,試圖將句子最精確的切開,適合文字分析;2.全模式,把句子中所有的可以成詞的詞語都掃描出來,速度非常快,但是不能解釋歧義;3.搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。

一、分詞

from __future__ import unicode_literals
import sys
import jieba
import jieba.posseg
import jieba.analyse

# 分詞,可以使用cut()和lcut()兩種方法
seg_list = jieba.lcut("我來到北京清華大學", cut_all=True)
print("Full Mode:", ",".join(seg_list))  # 全模式

seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print("Default Mode:", ",".join(seg_list))  # 精確模式

seg_list = jieba.cut("他來到了網易杭研大廈")  # 預設是精確模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造")  # 搜尋引擎模式
print(", ".join(seg_list))
Full Mode: 我,來到,北京,清華,清華大學,華大,大學
Default Mode: 我,來到,北京,清華大學
他, 來到, 了, 網易, 杭研, 大廈
小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, ,, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造

 

二、新增詞典

# 新增詞典
jieba.load_userdict("d:/data/dict.txt")

 

三、調整詞典

# 調整詞典
print(','.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
jieba.suggest_freq(('中', '將'), True)
print(','.join(jieba.cut('如果放到post中將出錯。', HMM=False)))

print(','.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False)))
jieba.suggest_freq('臺中', True)
print(','.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False)))
如果,放到,post,中將,出錯,。
如果,放到,post,中,將,出錯,。
「,臺,中,」,正確,應該,不會,被,切開
「,臺中,」,正確,應該,不會,被,切開

 

四、關鍵詞提取

# 關鍵詞提取
s = '''
此外,公司擬對全資子公司吉林歐亞置業有限公司增資4.3億元,增資後,吉林歐亞置業註冊
資本由7000萬元增加到5億元。吉林歐亞置業主要經營範圍為房地產開發及百貨零售等業務。
目前在建吉林歐亞城市商業綜合體專案。2013年,實現營業收入0萬元,實現淨利潤-139.13萬元。
'''
# tf-idf
for x, w in jieba.analyse.extract_tags(s, topK=20, withWeight=True):  # topK預設提取多少個關鍵詞,withWeight是否返回關鍵詞的權重值
    print('%s %s' % (x, w))

# textrank
for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))
歐亞 0.7148056394033334
吉林 0.6453082221991667
置業 0.478531921956875
萬元 0.33220407634875
增資 0.3288276861054167
4.3 0.24905765631041665
7000 0.24905765631041665
2013 0.24905765631041665
139.13 0.24905765631041665
實現 0.19486376152458332
綜合體 0.19074469840854166
經營範圍 0.18985803977479165
億元 0.18745378397625
在建 0.17176428835750002
全資 0.16822244884583334
百貨 0.163858254571875
註冊 0.15190267518354167
零售 0.14443267604520835
子公司 0.14291960962
營業 0.13630174790083333

歐亞 1.0
吉林 0.8789102185873989
置業 0.6632552273555545
實現 0.5594840789490926
收入 0.41421237233070557
增資 0.38649739942877126
子公司 0.3369458567319608
城市 0.3336549476141939
商業 0.3321326523190795
在建 0.30622998871047585
零售 0.2909936174579653
百貨 0.290324963335001
資本 0.2884140004696881
營業 0.28780582798670107
全資 0.28655198294847095
綜合體 0.2804051042482387
開發 0.27110208243505346
業務 0.2685461768277592
有限公司 0.26500710953857665
經營範圍 0.25427993286840744

 

五、詞性標註

# 詞性標註
words = jieba.posseg.cut("我愛北京天安門")
for word, flag in words:
    print('%s %s' % (word, flag))
我 r
愛 v
北京 ns
天安門 ns

 

六、Tokenize

# Tokenize
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]))

result = jieba.tokenize(u'永和服裝飾品有限公司', mode='search')
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: 0 		 end:2
word 服裝		 start: 2 		 end:4
word 飾品		 start: 4 		 end:6
word 有限		 start: 6 		 end:8
word 公司		 start: 8 		 end:10
word 有限公司		 start: 6 		 end:10

       此外,結巴分詞還可以通過呼叫jieba.analyse.set_idf_path(file_name)和jieba.analyse.set_stop_words(file_name)兩個方法來實現設定idf路徑和設定停用詞的功能。