Python 結巴分詞(1)分詞


利用結巴分詞來進行詞頻的統計,並輸出到文件中。

結巴分詞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 直接返回 list
  • jieba.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

 


免責聲明!

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



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