利用結巴分詞來進行詞頻的統計,並輸出到文件中。
結巴分詞github地址:結巴分詞
結巴分詞的特點:
-
支持三種分詞模式:
- 精確模式,試圖將句子最精確地切開,適合文本分析;
- 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
- 搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。
-
支持繁體分詞
- 支持自定義詞典
- MIT 授權協議
算法:
- 基於前綴詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG)
- 采用了動態規划查找最大概率路徑, 找出基於詞頻的最大切分組合
- 對於未登錄詞,采用了基於漢字成詞能力的 HMM 模型,使用了 Viterbi 算法
分詞參數:
ieba.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
直接返回 listjieba.Tokenizer(dictionary=DEFAULT_DICT)
新建自定義分詞器,可用於同時使用不同詞典。jieba.dt
為默認分詞器,所有全局分詞相關函數都是該分詞器的映射。
用戶詞典:
載入詞典
- 開發者可以指定自己自定義的詞典,以便包含 jieba 詞庫里沒有的詞。雖然 jieba 有新詞識別能力,但是自行添加新詞可以保證更高的正確率
- 用法: jieba.load_userdict(file_name) # file_name 為文件類對象或自定義詞典的路徑
- 詞典格式和
dict.txt
一樣,一個詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name
若為路徑或二進制方式打開的文件,則文件必須為 UTF-8 編碼。 - 詞頻省略時使用自動計算的能保證分出該詞的詞頻。
-
調整詞典
- 使用
add_word(word, freq=None, tag=None)
和del_word(word)
可在程序中動態修改詞典。 -
使用
suggest_freq(segment, tune=True)
可調節單個詞語的詞頻,使其能(或不能)被分出來。 -
注意:自動計算的詞頻在使用 HMM 新詞發現功能時可能無效。
- 使用
用戶詞典:userdict.dict
雲計算 5
李小福 2 nr 創新辦 3 i easy_install 3 eng 好用 300 韓玉賞鑒 3 nz 八一雙鹿 3 nz 台中 凱特琳 nz Edu Trust認證 2000 石墨烯
分詞代碼:fenci.py
1 #encoding=utf-8 2 from __future__ import print_function, unicode_literals 3 import sys 4 sys.path.append("../") 5 import jieba 6 jieba.load_userdict("userdict.txt")#導入用戶自定義詞典 7 import jieba.posseg as pseg 8 9 # jieba.add_word('石墨烯')#動態添加自定義單詞 10 jieba.add_word('凱特琳') 11 jieba.del_word('自定義詞') 12 jieba.add_word("易風化") 13 14 test_sent = ( 15 "磷酸氫二鈉在空氣中易風化,常溫時放置於空氣中失去約5個結晶水而形成七水物,加熱至100℃時失去全部結晶水而成無水物\n" 16 "例如我輸入一個帶“韓玉賞鑒”的標題,在自定義詞庫中也增加了此詞為N類\n" 17 "「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。" 18 ) 19 words = jieba.cut(test_sent) 20 print('/'.join(words)) 21 22 print("="*40) 23 24 result = pseg.cut(test_sent) 25 26 for w in result: 27 print(w.word, "/", w.flag, ", ", end=' ')#標注詞性 28 29 print("\n" + "="*40) 30 31 terms = jieba.cut('easy_install is great') 32 print('/'.join(terms)) 33 terms = jieba.cut('python 的正則表達式是好用的') 34 print('/'.join(terms)) 35 36 print("="*40) 37 # test frequency tune 38 testlist = [ 39 ('今天天氣不錯', ('今天', '天氣')), 40 ('如果放到post中將出錯。', ('中', '將')), 41 ('我們中出了一個叛徒', ('中', '出')), 42 ] 43 44 for sent, seg in testlist: 45 print('/'.join(jieba.cut(sent, HMM=False))) 46 word = ''.join(seg) 47 print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True))) 48 print('/'.join(jieba.cut(sent, HMM=False))) 49 print("-"*40)
結果:
Building prefix dict from the default dictionary ... Loading model from cache c:\users\wangyuguang\appdata\local\temp\jieba.cache Loading model cost 0.363 seconds. Prefix dict has been built succesfully. 磷酸氫二鈉/在/空氣/中/易風化/,/常溫/時/放置/於/空氣/中/失去/約/5/個/結晶水/而/形成/七水物/,/加熱/至/100/℃/時/失去/全部/結晶水/而成/無水/物/ /例如/我/輸入/一個/帶/“/韓玉賞鑒/”/的/標題/,/在/自定義詞/庫中/也/增加/了/此/詞為/N/類/ /「/台中/」/正確/應該/不會/被/切開/。/mac/上/可/分出/「/石墨烯/」/;/此時/又/可以/分出/來/凱特琳/了/。 ======================================== 磷酸氫二鈉 / nz , 在 / p , 空氣 / n , 中 / f , 易風化 / x , , / x , 常溫 / n , 時 / n , 放置 / v , 於 / p , 空氣 / n , 中 / f , 失去 / v , 約 / d , 5 / m , 個 / m , 結晶水 / n , 而 / c , 形成 / v , 七 / m , 水物 / n , , / x , 加熱 / v , 至 / p , 100 / m , ℃ / x , 時 / n , 失去 / v , 全部 / n , 結晶水 / n , 而 / c , 成 / v , 無水 / v , 物 / zg , / x , 例如 / v , 我 / r , 輸入 / v , 一個 / m , 帶 / v , “ / x , 韓玉賞鑒 / nz , ” / x , 的 / uj , 標題 / n , , / x , 在 / p , 自定義詞 / n , 庫中 / nrt , 也 / d , 增加 / v , 了 / ul , 此 / r , 詞 / n , 為 / p , N / eng , 類 / q , / x , 「 / x , 台中 / s , 」 / x , 正確 / ad , 應該 / v , 不 / d , 會 / v , 被 / p , 切開 / ad , 。 / x , mac / eng , 上 / f , 可 / v , 分出 / v , 「 / x , 石墨烯 / x , 」 / x , ; / x , 此時 / c , 又 / d , 可以 / c , 分出 / v , 來 / zg , 凱特琳 / nz , 了 / ul , 。 / x , ======================================== easy_install/ /is/ /great python/ /的/正則表達式/是/好用/的 ======================================== 今天天氣/不錯 今天天氣 Before: 3, After: 0 今天天氣/不錯 ---------------------------------------- 如果/放到/post/中將/出錯/。 中將 Before: 763, After: 494 如果/放到/post/中/將/出錯/。 ---------------------------------------- 我們/中/出/了/一個/叛徒 中出 Before: 3, After: 3 我們/中/出/了/一個/叛徒 ---------------------------------------- Process finished with exit code 0