jieba 中文分詞介紹及使用

 

目錄

 

基本介紹

功能及使用

1. 分詞

2. 添加自定義詞典

2.1 載入詞典

2.2 調整詞典

3. 關鍵詞提取

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

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

4. 詞性標註

5. 並行分詞

6. kenize:返回詞語在原文的起止位置


基本介紹

  1. 支持 3 種分詞模式
    1)精確模式:將句子最精確的分開,適合文本分析;
    2)全模式:句子中所有可以成詞的詞語都掃描出來,速度快,不能解決歧義;
    3)搜索引擎模式:在精確的基礎上,對長詞再次切分,提高召回;​​​​
  2. 支持繁體分詞
  3. 支持自定義詞典

功能及使用

1. 分詞

  • 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 爲默認分詞器,所有全局分詞相關函數都是該分詞器的映射。

代碼示例:

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

輸出:

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

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

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

【搜索引擎模式】: 小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造

2. 添加自定義詞典

2.1 載入詞典

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

  •  jieba.load_userdict(file_name) # file_name 爲文件類對象或自定義詞典的路徑;
  • 詞典格式和 dict.txt 一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒file_name 若爲路徑或二進制方式打開的文件,則文件必須爲 UTF-8 編碼。
  • 詞頻省略時使用自動計算的能保證分出該詞的詞頻。
  • 更改分詞器(默認爲 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
#encoding=utf-8
from __future__ import print_function, unicode_literals
import sys
sys.path.append("../")
import jieba

import jieba.posseg as pseg

jieba.add_word('石墨烯')
jieba.add_word('凱特琳')
jieba.del_word('自定義詞')

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

print("="*40+'after'+"="*40)

jieba.load_userdict("userdict.txt")
words_2 = jieba.cut(test_sent)
print('/'.join(words_2))

輸出:

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

2.2 調整詞典

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

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

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

示例:

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

3. 關鍵詞提取

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

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

    sentence 爲待提取的文本
    topK 爲返回幾個 TF/IDF 權重最大的關鍵詞,默認值爲 20
    withWeight 爲是否一併返回關鍵詞權重值,默認值爲 False
    allowPOS 僅包括指定詞性的詞,默認值爲空,即不篩選

  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 實例,idf_path 爲 IDF 頻率文件;

tf-idf:在詞袋方法基礎上的一種簡單擴展,它表示詞頻 - 逆文檔頻率。

bow(w, d) = 單詞 w 在文檔 d 中出現的次數
tf-idf(w, d) = bow(w, d) * N / ( 單詞 w 出現在其中的文檔數量 )

示例:

import jieba.analyse

print('關鍵詞提取 TF-IDF')
print('-'*40)

s = "此外,公司擬對全資子公司吉林歐亞置業有限公司增資4.3億元,增資後,吉林歐亞置業註冊資本由7000萬元增加到5億元。吉林歐亞置業主要經營範圍爲房地產開發及百貨零售等業務。目前在建吉林歐亞城市商業綜合體項目。2013年,實現營業收入0萬元,實現淨利潤-139.13萬元。"
for x, w in jieba.analyse.extract_tags(s, withWeight=True):
    print('%s %s' % (x, w))

輸出:

關鍵詞提取 TF-IDF
----------------------------------------
歐亞 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
  • 關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑
    用法: jieba.analyse.set_idf_path(file_name) # file_name爲自定義語料庫的路徑
  • 關鍵詞提取所使用停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑
    用法: jieba.analyse.set_stop_words(file_name)  # file_name爲自定義語料庫的路徑
  • 關鍵詞一併返回關鍵詞權重值示例

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

  • jieba.analyse.textrank(sentence,topK=20,withWeight=False,allowPOS=('ns','n','vn','v')) 直接使用,接口相同,注意默認過濾詞性。
  • jieba.analyse.TextRank() 新建自定義 TextRank 實例
  • 算法論文:TextRank: Bringing Order into Texts 
  • 基本思想:
    將待抽取關鍵詞的文本進行分詞;
    以固定窗口大小(默認爲5,通過span屬性調整),詞之間的共現關係,構建圖;
    計算圖中節點的PageRank,注意是無向帶權圖;

示例:

import jieba.analyse
print('關鍵詞提取 TextRank')
print('-'*40)
s = "此外,公司擬對全資子公司吉林歐亞置業有限公司增資4.3億元,增資後,吉林歐亞置業註冊資本由7000萬元增加到5億元。吉林歐亞置業主要經營範圍爲房地產開發及百貨零售等業務。目前在建吉林歐亞城市商業綜合體項目。2013年,實現營業收入0萬元,實現淨利潤-139.13萬元。"
for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))

輸出:

關鍵詞提取 TextRank
----------------------------------------
吉林 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

4. 詞性標註

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 爲默認詞性標註分詞器。
  • 標註句子分詞後每個詞的詞性,採用和 ictclas 兼容的標記法。

示例:

>>> import jieba.posseg as pseg
>>> words = pseg.cut("我愛北京天安門")
>>> for word, flag in words:
...    print('%s %s' % (word, flag))
...
我 r
愛 v
北京 ns
天安門 ns

這裏列出以上的詞性標註規範,其他見:https://blog.csdn.net/qq_35164554/article/details/90205175

詞性編碼 詞性名稱 註解
r 代詞 取英語代詞 pronoun的第2個字母,因p已用於介詞。
v 動詞 取英語動詞 verb的第一個字母。
ns 地名 名詞代碼 n和處所詞代碼s並在一起。

 

 

 

 

5. 並行分詞

  • 原理:將目標文本按行分隔後,把各行文本分配到多個 Python 進程並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升;
  • 基於 python 自帶的 multiprocessing 模塊,目前暫不支持 Windows:
    jieba.enable_parallel(4) # 開啓並行分詞模式,參數爲並行進程數;
    jieba.disable_parallel() # 關閉並行分詞模式
  • 注意:並行分詞僅支持默認分詞器 jieba.dt 和 jieba.posseg.dt

6. kenize:返回詞語在原文的起止位置

  • 注意,輸入參數只接受 unicode
  • 默認模式
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]))
word 永和		 start: 0 		 end:2
word 服裝		 start: 2 		 end:4
word 飾品		 start: 4 		 end:6
word 有限公司		 start: 6 		 end:10
  • 搜索模式
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:8
word 公司                start: 8                end:10
word 有限公司            start: 6                end:10

 

 

 

 

參考鏈接:https://github.com/fxsjy/jieba

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章