1. 程式人生 > >python機器學習庫——結巴中文分詞

python機器學習庫——結巴中文分詞

結巴中文分詞

安裝:

pip install jieba
  • 1

特點:

支援三種分詞模式:

精確模式,試圖將句子最精確地切開,適合文字分析; 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義; 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。 支援繁體分詞 支援自定義詞典 MIT 授權協議

演算法:

基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG) 採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合 對於未登入詞,採用了基於漢字成詞能力的 HMM 模型,使用了 Viterbi 演算法

分詞

  • jieba.cut 方法接受三個輸入引數: 需要分詞的字串;cut_all 引數用來控制是否採用全模式;HMM 引數用來控制是否使用 HMM 模型

  • jieba.cut_for_search 方法接受兩個引數:需要分詞的字串;是否使用 HMM模型。該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細

  • 待分詞的字串可以是 unicode 或 UTF-8 字串、GBK 字串。注意:不建議直接輸入 GBK字串,可能無法預料地錯誤解碼成 UTF-8

  • jieba.cut以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for迴圈來獲得分詞後得到的每一個詞語(unicode),或者用jieba.lcut 以及jieba.lcut_for_search 直接返回list

  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定義分詞器,可用於同時使用不同詞典。jieba.dt 為預設分詞器,所有全域性分詞相關函式都是該分詞器的對映。

  • 使用jieba.posseg分詞,可以檢視分詞的詞性

程式碼示例

# encoding=utf-8
import jieba

seg_list = jieba.cut("我來到北京清華大學", 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)) import jieba.posseg as pseg #檢視詞性 words = pseg.cut("我愛北京天安門") for word, flag in words: print('%s %s' % (word, flag))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

輸出結果

【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學

【精確模式】: 我/ 來到/ 北京/ 清華大學

【新詞識別】:他, 來到, 了, 網易, 杭研, 大廈    (此處,“杭研”並沒有在詞典中,但是也被Viterbi演算法識別出來了)

【搜尋引擎模式】: 小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

新增自定義詞典

新增自定義詞典以便能識別專業詞彙

載入詞典

  • 開發者可以指定自己自定義的詞典,以便包含 jieba 詞庫裡沒有的詞。雖然 jieba 有新詞識別能力,但是自行新增新詞可以保證更高的正確率

  • 用法: jieba.load_userdict(file_name) # file_name 為檔案類物件或自定義詞典的路徑

  • 詞典格式和 dict.txt一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name若為路徑或二進位制方式開啟的檔案,則檔案必須為 UTF-8 編碼。

  • 詞頻省略時使用自動計算的能保證分出該詞的詞頻。

例如:

創新辦 3 i
雲端計算 5
凱特琳 nz
臺中
  • 1
  • 2
  • 3
  • 4
  • 更改分詞器(預設為jieba.dt)的 tmp_dir 和 cache_file屬性,可分別指定快取檔案所在的資料夾及其檔名,用於受限的檔案系統。

示例自定義詞典userdict.txt

雲端計算 5
李小福 2 nr
創新辦 3 i
easy_install 3 eng
好用 300
韓玉賞鑑 3 nz
八一雙鹿 3 nz
臺中
凱特琳 nz
Edu Trust認證 2000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

示例程式碼

# 新增自定義專業詞彙
test_sent = (
"李小福是創新辦主任也是雲端計算方面的專家; 什麼是八一雙鹿\n"
"例如我輸入一個帶“韓玉賞鑑”的標題,在自定義詞庫中也增加了此詞為N類\n"
"「臺中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)

jieba.load_userdict("userdict.txt")  #從檔案中新增。每行為一個詞:詞語 詞頻 詞性

jieba.add_word('石墨烯')  #直接新增詞彙
jieba.add_word('凱特琳')  #直接新增詞彙
jieba.del_word('自定義詞') #直接刪除詞彙

words = jieba.cut(test_sent)
print(','.join(words))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

輸出結果

李小福,是,創新,辦,主任,也,是,雲,計算,方面,的,專家,;, ,什麼,是,八,一雙,鹿,
,例如,我,輸入,一個,帶,“,韓玉,賞鑑,”,的,標題,,,在,自定義詞,庫中,也,增加,了,此,詞為,N,類,
,「,臺,中,」,正確,應該,不會,被,切開,。,mac,上,可,分出,「,石墨,烯,」,;,此時,又,可以,分出,來凱,特琳,了,。
  • 1
  • 2
  • 3

調整詞典

  • 使用 add_word(word, freq=None, tag=None)和 del_word(word) 可在程式中動態修改詞典。

  • 使用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來。

  • 注意:自動計算的詞頻在使用 HMM 新詞發現功能時可能無效。

示例程式碼

print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
jieba.suggest_freq(('中', '將'), True)   #true若可以就將單詞分開,false若可以就將單詞合併
print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
print('/'.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False)))
jieba.suggest_freq('臺中', True)
print('/'.join(jieba.cut('「臺中」正確應該不會被切開', HMM=False)))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

輸出結果

如果/放到/post/中將/出錯/。
如果/放到/post//將/出錯/。
「/臺中//正確/應該/不會/被/切開
「/臺中//正確/應該/不會/被/切開
  • 1
  • 2
  • 3
  • 4

關鍵詞提取

基於 TF-IDF 演算法的關鍵詞抽取

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

sentence:為待提取的文字
topK:為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
withWeight:為是否一併返回關鍵詞權重值,預設值為 False
allowPOS:僅包括指定詞性的詞,預設值為空,即不篩選
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

示例程式碼

s = "此外,公司擬對全資子公司吉林歐亞置業有限公司增資4.3億元,增資後,吉林歐亞置業註冊資本由7000萬元增加到5億元。吉林歐亞置業主要經營範圍為房地產開發及百貨零售等業務。目前在建吉林歐亞城市商業綜合體專案。2013年,實現營業收入0萬元,實現淨利潤-139.13萬元。"
for x, w in jieba.analyse.extract_tags(s, withWeight=True):   #sentence:待提取文字    topK:數量    withWeight:是否一併返回關鍵詞權重值    allowPOS:僅包括指定詞性的詞,預設值為空,即不篩選
    print('%s %s' % (x, w))
  • 1
  • 2
  • 3

輸出結果

歐亞 0.7300142700289363
吉林 0.659038184373617
置業 0.4887134522112766
萬元 0.3392722481859574
增資 0.33582401985234045
4.3 0.25435675538085106
7000 0.25435675538085106
2013 0.25435675538085106
139.13 0.25435675538085106
實現 0.19900979900382978
綜合體 0.19480309624702127
經營範圍 0.19389757253595744
億元 0.1914421623587234
在建 0.17541884768425534
全資 0.17180164988510638
註冊資本 0.1712441526
百貨 0.16734460041382979
零售 0.1475057117057447
子公司 0.14596045237787234
營業 0.13920178509021275
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

基於 TextRank 演算法的關鍵詞抽取

jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,介面相同,注意預設過濾詞性。
  • 1

示例程式碼

for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))
  • 1
  • 2

輸出結果

吉林 1.0
歐亞 0.9966893354178172
置業 0.6434360313092776
實現 0.5898606692859626
收入 0.43677859947991454
增資 0.4099900531283276
子公司 0.35678295947672795
城市 0.34971383667403655
商業 0.34817220716026936
業務 0.3092230992619838
在建 0.3077929164033088
營業 0.3035777049319588
全資 0.303540981053475
綜合體 0.29580869172394825
註冊資本 0.29000519464085045
有限公司 0.2807830798576574
零售 0.27883620861218145
百貨 0.2781657628445476
開發 0.2693488779295851
經營範圍 0.2642762173558316
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

基本思想:

  1. 將待抽取關鍵詞的文字進行分詞

  2. 以固定視窗大小(預設為5,通過span屬性調整),詞之間的共現關係,構建圖

  3. 計算圖中節點的PageRank,注意是無向帶權圖

並行分詞

原理:將目標文字按行分隔後,把各行文字分配到多個 Python 程序並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升

基於 python 自帶的 multiprocessing 模組,目前暫不支援 Windows

用法:只要在開始分詞之前呼叫如下程式碼就可以實現並行分詞

jieba.enable_parallel(4)# 開啟並行分詞模式,引數為並行程序數

jieba.disable_parallel() # 關閉並行分詞模式
  • 1
  • 2
  • 3

實驗結果:在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程序版的 3.3 倍。

注意:並行分詞僅支援預設分詞器 jieba.dt 和jieba.posseg.dt。

Tokenize:返回詞語在原文的起止位置

注意,輸入引數只接受 unicode

示例程式碼

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]))
  • 1
  • 2
  • 3

輸出結果

word 永和      start: 0        end:2

word 服裝      start: 2        end:4

word 飾品      start: 4        end:6

word 有限公司        start: 6        end:10
  • 1
  • 2
  • 3
  • 4