Python中結巴分詞使用

概念介紹

分詞就是將連續(xù)的字序列按照一定的規(guī)范重新組合成詞序列的過程。英文是一個單詞,而中文是一個字。

數(shù)據(jù)來源可以是,一篇文章、爬蟲出來的一些數(shù)據(jù)、或者表格等內容

安裝方式 pip install jieba

jieba分詞算法使用了基于前綴詞典實現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能生成詞情況所構成的有向無環(huán)圖(DAG), 再采用了動態(tài)規(guī)劃查找最大概率路徑,找出基于詞頻的最大切分組合,對于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法。

支持四種分詞模式:
  • 精確模式,試圖將句子最精確地切開,適合文本分析;

  • 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非??欤遣荒芙鉀Q歧義;

  • 搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。

  • paddle模式,利用PaddlePaddle深度學習框架,訓練序列標注(雙向GRU)網(wǎng)絡模型實現(xiàn)分詞。同時支持詞性標注。paddle模式使用需安裝paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,請升級jieba,pip install jieba --upgrade 。PaddlePaddle官網(wǎng)

主要功能

jieba分詞的主要功能有如下幾種:

1、jieba.cut:該方法接受三個輸入?yún)?shù):需要分詞的字符串; cut_all 參數(shù)用來控制是否采用全模式;HMM參數(shù)用來控制是否適用HMM模型

jieba.cut(text, cut_all=False)

2、jieba.cut_for_search:該方法接受兩個參數(shù):需要分詞的字符串;是否使用HMM模型,該方法適用于搜索引擎構建倒排索引的分詞,粒度比較細。

jieba.cut_for_search(text)

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

4、jieba.cut 以及jieba.cut_for_search返回的結構都是可以得到的generator(生成器), 可以使用for循環(huán)來獲取分詞后得到的每一個詞語或者使用

5、jieb.lcut 以及 jieba.lcut_for_search 直接返回list

6、jieba.Tokenizer(dictionary=DEFUALT_DICT) 新建自定義分詞器,可用于同時使用不同字典,jieba.dt為默認分詞器,所有全局分詞相關函數(shù)都是該分詞器的映射。

算法
  • 基于前綴詞典實現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環(huán)圖 (DAG)

  • 采用了動態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合

  • 對于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法

代碼演示:

基本使用

使用文本:

text = '將T5表中的相對方銀行賬號信息與供應商銀行賬號信息表中的數(shù)據(jù)進行校驗'

代碼:

def use_jie(text):
    # 全模式
    segs = jieba.cut(text, cut_all=False)
    print("Full Mode:", "/ ".join(segs))
    
    # 精確模式
    segs = jieba.cut(text, cut_all=True)
    print("Default Mode:", "/ ".join(segs))

    # 搜索引擎模式
    segs = jieba.cut_for_search(text)
    print("search Mode:", "/ ".join(segs))

輸出結果:

Full Mode: 將/ T5/ 表中/ 的/ 相/ 對方/ 銀行賬號/ 信息/ 與/ 供應商/ 銀行賬號/ 信息/ 表中/ 的/ 數(shù)據(jù)/ 進行/ 校驗
Default Mode: 將/ T5/ 表/ 中/ 的/ 相對/ 對方/ 銀行/ 銀行賬/ 銀行賬號/ 賬號/ 信息/ 與/ 供應/ 供應商/ 商銀/ 銀行/ 銀行賬/ 銀行賬號/ 賬號/ 信息/ 表/ 中/ 的/ 數(shù)據(jù)/ 進行/ 校驗
Search Mode: 將/ T5/ 表中/ 的/ 相/ 對方/ 銀行/ 賬號/ 銀行賬/ 銀行賬號/ 信息/ 與/ 供應/ 供應商/ 銀行/ 賬號/ 銀行賬/ 銀行賬號/ 信息/ 表中/ 的/ 數(shù)據(jù)/ 進行/ 校驗

對比結果可以看出,全模式只匹配一次,精確模式會重復匹配

paddle模式
jieba.enable_paddle()  # 啟動paddle模式。 0.40版之后開始支持,早期版本不支持
seg_list = jieba.cut(text, use_paddle=True)  # 使用paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
Paddle Mode: 將/T/5/表/中/的/相/對方/銀行/賬號/信息/與/供應商/銀行/賬號/信息/表/中/的/數(shù)據(jù)/進行/校驗
調整詞典
  • 使用 add_word(word, freq=None, tag=None)del_word(word) 可在程序中動態(tài)修改詞典。
  • 使用 suggest_freq(segment, tune=True) 可調節(jié)單個詞語的詞頻,使其能(或不能)被分出來。
  • 注意:自動計算的詞頻在使用 HMM 新詞發(fā)現(xiàn)功能時可能無效。
# 自定義添加詞典
def use_dict_jie(text):
    print('/'.join(jieba.cut(text, HMM=False)))
    jieba.suggest_freq('相對方', True)
    print('/'.join(jieba.cut(text, HMM=False)))
    jieba.add_word("相對方", freq=None, tag=None)
    print('/'.join(jieba.cut(text, HMM=False)))
    jieba.del_word("銀行賬號")
    print('/'.join(jieba.cut(text, HMM=False)))
將/T5/表/中/的/相/對方/銀行賬號/信息/與/供應商/銀行賬號/信息/表/中/的/數(shù)據(jù)/進行/校驗
將/T5/表/中/的/相對方/銀行賬號/信息/與/供應商/銀行賬號/信息/表/中/的/數(shù)據(jù)/進行/校驗
將/T5/表/中/的/相對方/銀行賬號/信息/與/供應商/銀行賬號/信息/表/中/的/數(shù)據(jù)/進行/校驗
將/T5/表/中/的/相對方/銀行/賬號/信息/與/供應商/銀行/賬號/信息/表/中/的/數(shù)據(jù)/進行/校驗

同樣也可以引入文本的形式來調整分詞

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

tf-idf(英語:term frequency–inverse document frequency)是一種用于信息檢索文本挖掘的常用加權技術。tf-idf是一種統(tǒng)計方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。tf-idf加權的各種形式常被搜索引擎應用,作為文件與用戶查詢之間相關程度的度量或評級。除了tf-idf以外,互聯(lián)網(wǎng)上的搜索引擎還會使用基于鏈接分析的評級方法,以確定文件在搜索結果中出現(xiàn)的順序。

即按照一定的標準來判斷一個詞在一個文本中出現(xiàn)的頻率。可以作為本文關鍵內容的判斷

參考維基百科https://zh.wikipedia.org/wiki/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 頻率文件
基本思想:
  1. 將待抽取關鍵詞的文本進行分詞
  2. 以固定窗口大小(默認為5,通過span屬性調整),詞之間的共現(xiàn)關系,構建圖
  3. 計算圖中節(jié)點的PageRank,注意是無向帶權圖
用法示例
 print('-' * 40)
    print('TF-IDF')
    print('-' * 40)

    # 關鍵詞抽取
    for x, w in jieba.analyse.extract_tags(text, withWeight=True):
        print('%s %s' % (x, w))

----------------------------------------
TF-IDF
----------------------------------------
表中 1.9924612504833332
銀行賬號 1.9330154265
T5 0.9962306252416666
校驗 0.9585651982666666
信息 0.875643448795
供應商 0.6491008593725
對方 0.5086497757658334
數(shù)據(jù) 0.3984463898658333
進行 0.3105937329183333
print('-' * 40)
print(' 關鍵字2統(tǒng)計')
print('-' * 40)
tags = jieba.analyse.extract_tags(sentence=text, topK=20)
# 全切詞,分別統(tǒng)計出這20個關鍵詞出現(xiàn)次數(shù),即詞頻,存為字典words_freq中
words = [word for word in jieba.cut(text, cut_all=True)]
words_freq = {}
for tag in tags:
    freq = words.count(tag)
    words_freq[tag] = freq

# 將該字典按詞頻排序
usedata = sorted(words_freq.items(), key=lambda d: d[1])
print(usedata)
for word in usedata:
    print('%s %s' % (word[0], word[1]))
----------------------------------------
 關鍵字2統(tǒng)計
----------------------------------------
[('Now', 1), ('suffer', 2), ('he', 2), ('heart', 2), ('insight', 2), ('was', 2), ('true', 2), ('upon', 2), ('any', 2), ('They', 2), ('yourself', 2), ('personal', 2), ('had', 3), ('who', 3), ('alone', 3), ('trying', 3), ('man', 4), ('way', 4), ('God', 6), ('his', 7)]
Now 1
suffer 2
he 2
heart 2
insight 2
was 2
true 2
upon 2
any 2
They 2
yourself 2
personal 2
had 3
who 3
alone 3
trying 3
man 4
way 4
God 6
his 7

可以通過此方法提取關鍵詞

基于 TextRank 算法的關鍵詞抽取
  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默認過濾詞性。
  • jieba.analyse.TextRank() 新建自定義 TextRank 實例

沒有輸出

基本思想:
  1. 將待抽取關鍵詞的文本進行分詞

  2. 以固定窗口大小(默認為5,通過span屬性調整),詞之間的共現(xiàn)關系,構建圖

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

用法示例
 print('-' * 40)
    print(' TextRank')
    print('-' * 40)

    for x, w in jieba.analyse.textrank(text, withWeight=True):
        print('%s %s' % (x, w))
詞性標注
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數(shù)可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為默認詞性標注分詞器。
  • 標注句子分詞后每個詞的詞性,采用和 ictclas 兼容的標記法。
  • 除了jieba默認分詞模式,提供paddle模式下的詞性標注功能。paddle模式采用延遲加載方式,通過enable_paddle()安裝paddlepaddle-tiny,并且import相關代碼;
用法示例
 print('=' * 40)
    print('4. 詞性標注')
    print('-' * 40)

    words = jieba.posseg.cut(text)
    for word, flag in words:
        print('%s %s' % (word, flag))
4. 詞性標注
----------------------------------------
神愛世人 nr
, x
甚至 d
將 d
祂 yg
獨一 b
的 uj
兒子 n
賜給 v
他們 r
, x
叫 v
一切 r
信 n
祂 y
的 uj
人 n
不致 c
滅亡 v
, x
反 zg
得 ud
永生 b

paddle模式詞性標注對應表如下:

paddle模式詞性和專名類別標簽集合如下表,其中詞性標簽 24 個(小寫字母),專名類別標簽 4 個(大寫字母)。

標簽 含義 標簽 含義 標簽 含義 標簽 含義
n 普通名詞 f 方位名詞 s 處所名詞 t 時間
nr 人名 ns 地名 nt 機構名 nw 作品名
nz 其他專名 v 普通動詞 vd 動副詞 vn 名動詞
a 形容詞 ad 副形詞 an 名形詞 d 副詞
m 數(shù)量詞 q 量詞 r 代詞 p 介詞
c 連詞 u 助詞 xc 其他虛詞 w 標點符號
PER 人名 LOC 地名 ORG 機構名 TIME 時間
Tokenize:返回詞語在原文的起止位置
 print('=' * 40)
    print('6. Tokenize: 返回詞語在原文的起止位置')
    print('-' * 40)
    print(' 默認模式')
    print('-' * 40)

    result = jieba.tokenize(text)
    for tk in result:
        print("word %s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))

    print('-' * 40)
    print(' 搜索模式')
    print('-' * 40)

    result = jieba.tokenize(text, mode='search')
    for tk in result:
        print("word %s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))


========================================
6. Tokenize: 返回詞語在原文的起止位置
----------------------------------------
 默認模式
----------------------------------------
word 神愛世人        start: 0        end:4
word ,       start: 4        end:5
word 甚至      start: 5        end:7
word 將       start: 7        end:8
word 祂       start: 8        end:9
word 獨一      start: 9        end:11
word 的       start: 11       end:12
word 兒子      start: 12       end:14
word 賜給      start: 14       end:16
word 他們      start: 16       end:18
word ,       start: 18       end:19
word 叫       start: 19       end:20
word 一切      start: 20       end:22
word 信       start: 22       end:23
word 祂       start: 23       end:24
word 的       start: 24       end:25
word 人       start: 25       end:26
word 不致      start: 26       end:28
word 滅亡      start: 28       end:30
word ,       start: 30       end:31
word 反       start: 31       end:32
word 得       start: 32       end:33
word 永生      start: 33       end:35
----------------------------------------
 搜索模式
----------------------------------------
word 世人      start: 2        end:4
word 神愛世人        start: 0        end:4
word ,       start: 4        end:5
word 甚至      start: 5        end:7
word 將       start: 7        end:8
word 祂       start: 8        end:9
word 獨一      start: 9        end:11
word 的       start: 11       end:12
word 兒子      start: 12       end:14
word 賜給      start: 14       end:16
word 他們      start: 16       end:18
word ,       start: 18       end:19
word 叫       start: 19       end:20
word 一切      start: 20       end:22
word 信       start: 22       end:23
word 祂       start: 23       end:24
word 的       start: 24       end:25
word 人       start: 25       end:26
word 不致      start: 26       end:28
word 滅亡      start: 28       end:30
word ,       start: 30       end:31
word 反       start: 31       end:32
word 得       start: 32       end:33
word 永生      start: 33       end:35

其他:

使用的文本

s_text = '將T5表中的相對方銀行賬號信息與供應商銀行賬號信息表中的數(shù)據(jù)進行校驗'
b_text = '神愛世人,甚至將祂獨一的兒子賜給他們,叫一切信祂的人不致滅亡,反得永生'
b_e_text = 'God so loved the world that he gave his one and only Son. Anyone who believes in him will not die but will have eternal life.'

參考內容:https://github.com/fxsjy/jieba/

2021/03/16于成都

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容