python Jieba分詞處理詳解【模式,詞庫的添加、刪除,自定義詞庫,失敗處理等】
Jieba(結(jié)巴)是一個中文分詞第三方庫,它可以幫助我們將一段中文文本分成一個個獨(dú)立的詞語。Jieba具有以下特點(diǎn):
- 簡單易用:Jieba提供了簡潔的API接口,易于使用和擴(kuò)展??梢钥焖俚貙?shí)現(xiàn)中文分詞功能。
- 高效準(zhǔn)確:Jieba采用了基于前綴詞典和動態(tài)規(guī)劃算法的分詞方法,能夠高效準(zhǔn)確地處理各種中文文本。
- 支持多種分詞模式:Jieba提供了三種分詞模式:精確模式、全模式和搜索引擎模式,可以根據(jù)不同的應(yīng)用場景選擇合適的模式。
- 支持用戶自定義詞典:Jieba允許用戶自定義詞典,可以根據(jù)實(shí)際需要添加新的詞語或調(diào)整已有詞語的詞頻和詞性等信息。
- 支持并發(fā)分詞:Jieba采用多進(jìn)程和協(xié)程的方式實(shí)現(xiàn)并發(fā)分詞,可以提高分詞速度和效率。
除了中文分詞功能之外,Jieba還提供了關(guān)鍵詞提取、詞性標(biāo)注、繁體轉(zhuǎn)簡體、詞語拼音轉(zhuǎn)換等功能??梢詽M足不同的中文文本處理需求。
1 Jieba的搜索模式
1.1 全模式
全模式會將需要分詞的文本中所有可能的詞語都進(jìn)行匹配,因此會產(chǎn)生大量的冗余詞語。使用Jieba的全模式,比如我們希望把美國數(shù)據(jù)倉庫巨頭發(fā)布開源模型,公開挑戰(zhàn)ChatGPT這句話進(jìn)行分詞:
import jieba
text = '美國數(shù)據(jù)倉庫巨頭發(fā)布開源模型,公開挑戰(zhàn)ChatGPT'
seg_list = jieba.cut(text, cut_all=True)
print("/".join(seg_list))在上述代碼中,cut_all=True指定了使用全模式進(jìn)行分詞,"/".join(seg_list)會將分詞結(jié)果以斜杠分隔輸出。這段的輸出結(jié)果為:
可以看到分詞結(jié)果中,數(shù)據(jù)倉庫被分為了數(shù)據(jù)、倉庫、數(shù)據(jù)倉庫三個獨(dú)立的詞語,因此會產(chǎn)生大量的冗余詞語。全模式適合于對文本中所有可能的詞語進(jìn)行匹配的場景,例如搜索引擎的索引處理、關(guān)鍵詞提取等。
1.2 精確模式
精確模式會將需要分詞的文本中可能存在的詞語都進(jìn)行匹配,但不會產(chǎn)生冗余詞語。使用Jieba的精確模式,可以通過以下方式實(shí)現(xiàn):
import jieba
text = '美國數(shù)據(jù)倉庫巨頭發(fā)布開源模型,公開挑戰(zhàn)ChatGPT'
seg_list = jieba.cut(text, cut_all=False)
print("/".join(seg_list))在上述代碼中,cut_all=False指定了使用精確模式進(jìn)行分詞。這段的輸出結(jié)果為:
可以看到,在精確模式下,Jieba會將數(shù)據(jù)倉庫作為一個詞語進(jìn)行匹配,不會產(chǎn)生冗余詞語。精確模式適合于對文本中存在的詞語進(jìn)行匹配的場景,例如文本分類、情感分析等。精確模式不會產(chǎn)生冗余詞語,因此可以得到準(zhǔn)確的分詞結(jié)果。
1.3 搜索引擎模式
搜索引擎模式使用了基于前綴匹配算法的正向最大匹配(FMM)和逆向最大匹配(RMM)算法,會對需要分詞的文本進(jìn)行分詞,并且盡可能多地匹配分詞結(jié)果。因此,在分詞時,搜索引擎模式會優(yōu)先匹配較長的詞語。使用Jieba的搜索引擎模式,可以通過以下方式實(shí)現(xiàn):
import jieba
text = '美國數(shù)據(jù)倉庫巨頭發(fā)布開源模型,公開挑戰(zhàn)ChatGPT'
seg_list = jieba.cut_for_search(text)
print("/".join(seg_list))這段函數(shù)的輸出結(jié)果為;

由于我們的實(shí)例文本過段,在這里的結(jié)果與全模式的分詞結(jié)果并未表現(xiàn)出區(qū)別。搜索引擎模式適合于對長文本進(jìn)行分詞的場景,例如自然語言處理、信息檢索等。搜索引擎模式使用了基于前綴匹配算法的正向最大匹配(FMM)和逆向最大匹配(RMM)算法,可以盡可能多地匹配分詞結(jié)果,但可能會對一些新詞造成誤判,需要進(jìn)行進(jìn)一步的處理和校對。
1.4 分詞結(jié)果的形式選擇
正常情況下,分詞結(jié)果將會以生成器的形式保存,這意味著,當(dāng)我們像上面一樣將分詞結(jié)果全部打印之后,這個生成器就不能二次使用了。
如果希望以列表的形式報(bào)錯結(jié)果??梢詫⑸善鬓D(zhuǎn)為list格式:
seg_list = jieba.cut(text) print(type(seg_list)) seg_list = list(seg_list) print(type(seg_list))

也可以直接指定函數(shù)的返回為list,此時我們需要使用函數(shù)lcut
seg_list = jieba.lcut(text) print(type(seg_list))

2 詞庫的添加與刪除
在Jieba中,詞庫是指用于分詞的詞典,Jieba提供了內(nèi)置的詞典和用戶自定義的詞典。用戶可以通過添加或刪除詞語來定制自己的詞典。
2.1 添加單個詞語
在Jieba中,可以通過調(diào)用add_word(word, freq=None, tag=None)方法來向詞庫中添加單個詞語。其中,word為需要添加的詞語,freq為該詞語的詞頻,tag為該詞語的詞性。例如,假設(shè)需要將詞語開源模型添加到Jieba的詞庫中,可以通過如下代碼實(shí)現(xiàn):
import jieba
text = '美國數(shù)據(jù)倉庫巨頭發(fā)布開源模型,公開挑戰(zhàn)ChatGPT'
jieba.add_word("開源模型")
seg_list = jieba.cut(text)
print('/'.join(seg_list))此時,開源模型就被分為一個詞了:
2.2 添加自定義詞典
當(dāng)需要添加的詞過多時,建議使用添加詞典的方式。自定義詞典可以包含用戶自己添加的詞語及其詞頻和詞性等信息。添加自定義詞典的方法如下:
- 創(chuàng)建一個文本文件,例如
userdict.txt,用于存儲自定義詞典。每行格式為:詞語 詞頻 詞性。 - 將需要添加的詞語及其詞頻和詞性等信息寫入到
userdict.txt中,每個詞語一行。 - 調(diào)用Jieba的
load_userdict()方法加載自定義詞典文件。詞典示例如下:
開源模型 10 n 深度學(xué)習(xí) 8 n
其中,10和8為詞語的詞頻,n為詞語的詞性。之后調(diào)用詞典即可。
jieba.load_userdict("userdict.txt")詞典加入之后,再次進(jìn)行分詞,詞典中的內(nèi)容就可以被分出來了。
2.3 詞庫的刪除
在Jieba中,可以通過調(diào)用del_word(word)方法來刪除詞庫中的單個詞語。其中,word為需要刪除的詞語。剛剛我們在詞典中添加了開源模型這個詞,接下來我們將其刪除:
jieba.del_word("開源模型")
seg_list = jieba.cut(text)
print('/'.join(seg_list))
此時開源和模型就又變?yōu)閮蓚€詞了。
2.4 添加詞庫失效的情況
如果想要添加的詞包含標(biāo)點(diǎn)符號,則這個添加操作會失效(無論是添加單個的詞語還是使用自定義字典),比如:
import jieba
text = '美國數(shù)據(jù)倉庫巨頭發(fā)布<開源模型>,公開挑戰(zhàn)ChatGPT'
jieba.add_word("<開源模型>")
seg_list = jieba.cut(text)
print('/'.join(seg_list))這段代碼希望將<開源模型>分為一個詞,然而jieba默認(rèn)標(biāo)點(diǎn)符號會被單獨(dú)分割,因此這個添加詞庫的操作會失效,不但<開源模型>不能被分出來,開源模型也不能被分出來。
因此,在添加詞庫時要避免這種情況的出現(xiàn)。
python 結(jié)巴分詞具體下載與使用方法可參考github相關(guān)說明:
相關(guān)文章
pandas分組聚合(agg,transform,apply)
在SQL中我們經(jīng)常使用 GROUP BY 將某個字段,按不同的取值進(jìn)行分組, 在pandas中也有g(shù)roupby函數(shù),本文主要介紹了pandas分組聚合(agg,transform,apply),具有一定的參考價值,感興趣的可以了解一下2024-04-04
利用Python批量識別電子賬單數(shù)據(jù)的方法
這篇文章主要介紹了利用Python批量識別電子賬單數(shù)據(jù)的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
完美處理python與anaconda環(huán)境變量的沖突問題
這篇文章主要介紹了完美處理Python與anaconda環(huán)境變量的沖突問題,對anaconda感興趣的同學(xué),可以參考下2021-04-04
Pytorch實(shí)現(xiàn)圖像識別之?dāng)?shù)字識別(附詳細(xì)注釋)
這篇文章主要介紹了Pytorch實(shí)現(xiàn)圖像識別之?dāng)?shù)字識別(附詳細(xì)注釋),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
通過LyScript實(shí)現(xiàn)從文本中讀寫ShellCode
LyScript 插件通過配合內(nèi)存讀寫,可實(shí)現(xiàn)對特定位置的ShellCode代碼的導(dǎo)出。本文將利用這一特性實(shí)現(xiàn)從文本中讀寫ShellCode,感興趣的可以了解一下2022-08-08
Appium+python自動化之連接模擬器并啟動淘寶APP(超詳解)
這篇文章主要介紹了Appium+python自動化之 連接模擬器并啟動淘寶APP(超詳解)本文以淘寶app為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-06-06
Kwargs傳遞給Python 中的另一個函數(shù)實(shí)現(xiàn)方法
Python 列出了可以傳遞給程序中的函數(shù)的兩種類型的參數(shù), 非關(guān)鍵字參數(shù)**args和關(guān)鍵字參數(shù) **kwargs ,在本文中,我們將討論如何使用關(guān)鍵字參數(shù)及如何將關(guān)鍵字參數(shù)傳遞給另一個函數(shù),感興趣的朋友跟隨小編一起看看吧2023-08-08

