【NLP】Jieba中文分詞

【GitHub地址】https://github.com/fxsjy/jieba

特點

  • 支持三種分詞模式:

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

  • 支持自定義詞典

  • MIT 授權協議

安裝說明

代碼對 Python 2/3 均兼容

  • 全自動安裝:easy_install jieba 或者 pip install jieba / pip3 install jieba
  • 半自動安裝:先下載 http://pypi.python.org/pypi/jieba/ ,解壓後運行 python setup.py install
  • 手動安裝:將 jieba 目錄放置於當前目錄或者 site-packages 目錄
  • 通過 import jieba 來引用

下載壓縮包,解壓至E:\software\python\anaconda\pkgs\jieba-0.39

打開Anaconda Prompt,輸入e:,cd至以上文件夾

輸入dir,可以看到該文件夾內有setup.py這一安裝文件,輸入python setup.py install

 

主要功能

  1. 分詞

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))

【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學
【精確模式】: 我/ 來到/ 北京/ 清華大學
【默認精確】:他, 來到, 了, 網易, 杭研, 大廈    (此處,“杭研”並沒有在詞典中,但是也被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 爲默認分詞器,所有全局分詞相關函數都是該分詞器的映射。
import os
filelist = []
path = 'E:/work/92lucky/開發事宜/大數據平臺/5. 標籤設計/文本測試數據/微博/'
for filename in os.listdir(path):
    filestr = open(path + filename, encoding='UTF-8').read()
    filelist.append(filestr)
seg_list = jieba.cut(filelist[0], cut_all=False)
#seg_list = jieba.cut_for_search(filelist[0])  # 搜索引擎模式

, 【, #, 我, 有, 特別, 的, 推倒, 技巧, #, 之, 佟, 掌櫃, 收, 李逍遙, 】, @, 胡歌,  , 此前, 對南, 都, 稱, ,, “, 我要, 海陸空, 三棲, ”, ,, 可是, 還, 沒, 等, 他, 征服, 海陸空, 呢, ,, @, 素描, 閆妮,  , 就, 把, 他, 先收, 了, …, …, 他倆, 主演, 的, 電視劇, 《, 生活, 啓示錄, 》, 收視率, 穩居, 衛視, 黃金檔, 排行, 第, 1, 名, ,, 在, 豆瓣, 甚至, 被, 刷, 到, 了, 8,  , ., 6, 的, 高分, 。, 佟, 掌櫃, 是, 怎麼, 推倒, 李逍遙, 而, 又, 不, 違, 和, 的, ?, http, :, /, /, t, ., cn, /, Rvbj6oy
  1. 添加自定義詞典

#下載https://github.com/fxsjy/jieba/blob/master/test/userdict.txt到工程
#SyntaxError: from __future__ imports must occur at the beginning of the file
#from __future__ import print_function, unicode_literals
jieba.load_userdict("userdict.txt") #在此文件中將韓玉賞鑑 3 nz刪除,則分詞時韓玉賞鑑會分爲韓玉和賞鑑
jieba.add_word('石墨烯') #將此行註釋掉,則分詞時會分成石墨和烯
jieba.add_word('凱特琳')
jieba.del_word('自定義詞') #此句會促使自定義/詞庫的劃分
test_sent = (
"李小福是創新辦主任也是雲計算方面的專家; 什麼是八一雙鹿\n"
"例如我輸入一個帶“韓玉賞鑑”的標題,在自定義詞庫中也增加了此詞爲N類\n"
"「臺中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
words = jieba.cut(test_sent)
print('/'.join(words))

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

載入詞典

  • 開發者可以指定自己自定義的詞典,以便包含 jieba 詞庫裏沒有的詞。雖然 jieba 有新詞識別能力,但是自行添加新詞可以保證更高的正確率
  • 用法: jieba.load_userdict(file_name) # file_name 爲文件類對象或自定義詞典的路徑
  • 詞典格式和 dict.txt 一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name 若爲路徑或二進制方式打開的文件,則文件必須爲 UTF-8 編碼。
  • 詞頻省略時使用自動計算的能保證分出該詞的詞頻。
  • 更改分詞器(默認爲 jieba.dt)的 tmp_dir 和 cache_file 屬性,可分別指定緩存文件所在的文件夾及其文件名,用於受限的文件系統。

#工程下創建userdict2.txt,增加佟掌櫃、南都、生活啓示錄、第1名、違和
jieba.load_userdict("userdict2.txt")
seg_list = jieba.cut(filelist[0], cut_all=False)
print(", ".join(seg_list))

, 【, #, 我, 有, 特別, 的, 推倒, 技巧, #, 之, 佟掌櫃, 收, 李逍遙, 】, @, 胡歌,  , 此前, 對, 南都, 稱, ,, “, 我要, 海陸空, 三棲, ”, ,, 可是, 還, 沒, 等, 他, 征服, 海陸空, 呢, ,, @, 素描, 閆妮,  , 就, 把, 他, 先收, 了, …, …, 他倆, 主演, 的, 電視劇, 《, 生活啓示錄, 》, 收視率, 穩居, 衛視, 黃金檔, 排行, 第1名, ,, 在, 豆瓣, 甚至, 被, 刷, 到, 了, 8,  , ., 6, 的, 高分, 。, 佟掌櫃, 是, 怎麼, 推倒, 李逍遙, 而, 又, 不, 違和, 的, ?, http, :, /, /, t, ., cn, /, Rvbj6oy

調整詞典

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

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

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

代碼示例:

print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))
#使用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來
jieba.suggest_freq(('中', '將'), True)
print('/'.join(jieba.cut('如果放到post中將出錯。', HMM=False)))

如果/放到/post/中將/出錯/。
如果/放到/post/中/將/出錯/。
  1. 關鍵詞提取

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

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 爲待提取的文本
    • topK 爲返回幾個 TF/IDF 權重最大的關鍵詞,默認值爲 20
    • withWeight 爲是否一併返回關鍵詞權重值,默認值爲 False
    • allowPOS 僅包括指定詞性的詞,默認值爲空,即不篩選
['李逍遙', '海陸空', '推倒', '掌櫃', '黃金檔', '胡歌', '對南', '我要', '三棲', '閆妮', '先收', 'http', 'cn', 'Rvbj6oy', '豆瓣', '啓示錄', '收視率', '衛視', '高分', '穩居']

import jieba.analyse
jieba.load_userdict("userdict2.txt") #未使用自定義詞典時,自動選取出來的特徵如上
taglist = jieba.analyse.extract_tags(filelist[0], topK=20, withWeight=False, allowPOS=())
print(taglist)

['佟掌櫃', '李逍遙', '海陸空', '推倒', '黃金檔', '違和', '胡歌', '我要', '三棲', '閆妮', '先收', '生活啓示錄', '第1名', 'http', 'cn', 'Rvbj6oy', '豆瓣', '南都', '收視率', '衛視']
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 實例,idf_path 爲 IDF 頻率文件

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

關鍵詞提取所使用停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑

  1. 詞性標註

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數可指定內部使用的 jieba.Tokenizer分詞器。jieba.posseg.dt 爲默認詞性標註分詞器。
  • 標註句子分詞後每個詞的詞性,採用和 ictclas 兼容的標記法。
import jieba.posseg as pseg #詞性標註
result = pseg.cut(test_sent)
for w in result:
    print(w.word, w.flag)

李小福 nr
是 v
創新辦 i
主任 b
也 d
是 v
雲計算 x
方面 n
的 uj
專家 n

其他詞典

  1. 佔用內存較小的詞典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small

  2. 支持繁體分詞更好的詞典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big

下載你所需要的詞典,然後覆蓋 jieba/dict.txt 即可;或者用 jieba.set_dictionary('data/dict.txt.big')

發佈了13 篇原創文章 · 獲贊 21 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章