詳解Python中文分詞而生的jieba庫
jieba庫
中文分詞,通俗來說,就是將一句(段)話按一定的規(guī)則(算法)拆分成詞語、成語、單個文字。 中文分詞是很多應(yīng)用技術(shù)的前置技術(shù),如搜索引擎、機器翻譯、詞性標注、相似度分析等,都是先對文本信息分詞處理,再用分詞結(jié)果來搜索、翻譯、對比等。
在Python中,最好用的中文分詞庫是jieba。用“結(jié)巴”給一個中文分詞庫命名,非常生動形象,同時還帶有一種程序員式的幽默感。
一、最好的Python中文分詞組件
“結(jié)巴”中文分詞:做最好的 Python 中文分詞組件
這是jieba分詞的slogan,打開jieba分詞的GitHub、PyPI源,都會在簡介里看到這句標語。這充分體現(xiàn)了jieba開發(fā)團隊的愿景和目標,在目前看來,jieba已經(jīng)稱得上最好的Python中文分詞庫。 2022年4月寫本文時,jieba在GitHub上已經(jīng)獲得了28.3K的Star,而且數(shù)量正在快速增長,足夠證明jieba的受歡迎程度非常高。 jieba除了有Python語言的版本,也有C++、JAVA、iOS等十幾門編程語言的版本,從PC端到移動端,都可以支持。這點值得給jieba的維護團隊點贊,說不定未來,jieba可以做所有語言里最好的中文分詞組件。
二、jieba的使用方法
Step1. 安裝jieba
pip install jieba
jieba是第三方庫,需要先安裝才能使用,直接使用pip安裝即可,jieba兼容Python2和Python3,安裝命令都一樣。如果安裝慢,可以添加-i參數(shù)指定鏡像源。
Step2. 調(diào)用jieba進行分詞
import jieba test_content = '迅雷不及掩耳盜鈴兒響叮當(dāng)仁不讓世界充滿愛之勢' cut_res = jieba.cut(test_content, cut_all=True) print(list(cut_res))
運行結(jié)果:
['迅雷', '迅雷不及', '迅雷不及掩耳', '不及', '掩耳', '掩耳盜鈴',
'兒', '響叮當(dāng)', '叮當(dāng)', '當(dāng)仁不讓', '不讓', '世界', '充滿', '愛',
'之', '勢']
jieba分詞的使用非常簡單,直接導(dǎo)入jieba庫,調(diào)用cut()方法,傳入需要切分的內(nèi)容,即可返回分詞結(jié)果。返回結(jié)果是一個可迭代的生成器generator,可以進行遍歷,也可以轉(zhuǎn)換成list打印出結(jié)果。
三、jieba分詞的四種模式
jieba分詞支持四種分詞模式:
1.精確模式:
試圖將句子最精確地切開,適合文本分析。
cut_res = jieba.cut(test_content, cut_all=False) print('[精確模式]:', list(cut_res)) cut_res = jieba.cut(test_content, cut_all=False, HMM=False) print('[精確模式]:', list(cut_res))
[精確模式]: ['迅雷不及', '掩耳盜鈴', '兒響', '叮', '當(dāng)仁不讓', '世界', '充滿', '愛之勢']
[精確模式]: ['迅雷不及', '掩耳盜鈴', '兒', '響', '叮', '當(dāng)仁不讓', '世界', '充滿', '愛', '之', '勢']
精確模式是最常用的分詞模式,分詞結(jié)果不存在冗余數(shù)據(jù)。 HMM參數(shù)默認為True,根據(jù)HMM模型(隱馬爾可夫模型)自動識別新詞。如上面的例子中,HMM為True,結(jié)果中將“兒響”、“愛之勢”識別成了新詞,HMM為False,這些字只能單獨成詞,分成單個文字。
2.全模式:
把句子中所有可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義。
cut_res = jieba.cut(test_content, cut_all=True) print('[全模式]:', list(cut_res))
結(jié)果
[全模式]: ['迅雷', '迅雷不及', '迅雷不及掩耳', '不及', '掩耳', '掩耳盜鈴',
'兒', '響叮當(dāng)', '叮當(dāng)', '當(dāng)仁不讓', '不讓', '世界', '充滿', '愛', '之', '勢']
全模式從待分詞內(nèi)容的第一個字開始遍歷,將每一個字作為詞語的第一個字,返回所有可能的詞語,會重復(fù)利用詞語和字,因此也可能會出現(xiàn)多種含義。 cut_all參數(shù)默認為False,即默認不是全模式,將cut_all設(shè)置為True,則采用全模式分詞。
3.搜索引擎模式:
在精確模式的基礎(chǔ)上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
cut_res = jieba.cut_for_search(test_content) print('[搜索引擎模式]:', list(cut_res))
結(jié)果
[搜索引擎模式]: ['迅雷', '不及', '迅雷不及', '掩耳', '掩耳盜鈴', '兒響',
'叮', '不讓', '當(dāng)仁不讓', '世界', '充滿', '愛之勢']
搜索引擎模式在精確模式的基礎(chǔ)上,對精確模式中的長詞,再按照全模式進一步分詞,用于搜索時可以匹配到更多的結(jié)果。
4.paddle模式:
利用PaddlePaddle深度學(xué)習(xí)框架,訓(xùn)練序列標注(雙向GRU)網(wǎng)絡(luò)模型實現(xiàn)分詞。同時支持詞性標注。 paddle模式使用需先安裝paddlepaddle-tiny,安裝命令:pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。
jieba v0.40以下版本,請升級jieba,pip install jieba --upgrade 。 上面是官方的描述,但是,當(dāng)前已經(jīng)找不到paddlepaddle-tiny鏡像源了,感興趣可以去PaddlePaddle官網(wǎng)找找方法。 通常不會使用到paddle模式,所以我們了解前面三種模式即可。
5.小結(jié)
cut()方法有四個參數(shù),
- sentence接收待分詞的內(nèi)容;
- cut_all設(shè)置是否使用全模式;
- HMM設(shè)置是否使用HMM模型識別新詞;
- use_paddle設(shè)置是否使用panddle模式。
cut_for_search()有兩個參數(shù),
sentence和HMM。
cut()和cut_for_search()都是返回generator
如果想直接返回列表,可以使用對應(yīng)的lcut()和lcut_for_search(),用法完全相同。
四、自定義分詞詞典
使用jieba分詞時,分詞結(jié)果需要與jieba的詞典庫進行匹配,才能返回到分詞結(jié)果中。因此有些詞需要用戶自定義,才能識別到。
1.添加自定義詞語到詞典中
jieba.add_word('鈴兒響叮當(dāng)') jieba.add_word('讓世界充滿愛') jieba.add_word('迅雷不及掩耳之勢') lcut_res = jieba.lcut(test_content, cut_all=True, HMM=False) print('[添加自定義詞語]:', lcut_res)
結(jié)果
[添加自定義詞語]: ['迅雷', '迅雷不及', '迅雷不及掩耳', '不及', '掩耳', '掩耳盜鈴',
'鈴兒響叮當(dāng)', '響叮當(dāng)', '叮當(dāng)', '當(dāng)仁不讓', '不讓', '讓世界充滿愛', '世界',
'充滿', '愛', '之', '勢']
add_word()有三個參數(shù),分別是添加的詞語、詞頻和詞性,詞頻和詞性可以省略。 添加自定義詞語后,自定義詞語如果能匹配到,就會返回到分詞結(jié)果中。如果自定義詞語在待分詞語句中沒有連續(xù)的匹配結(jié)果,分詞結(jié)果中不會體現(xiàn)。
2.添加指定的文件作為分詞詞典
自定義詞典格式要和默認詞典dict.txt一樣,一個詞占一行,每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name若為路徑或二進制方式打開的文件,則文件必須為UTF-8編碼。 本文自定義一個mydict.txt文本文件,內(nèi)容如下:
迅雷不及掩耳之勢 3 a
掩耳盜鈴 3 a
鈴兒響叮當(dāng) 3 a
當(dāng)仁不讓 3 a
讓世界充滿愛 3 n
文件編碼要設(shè)置成UTF-8,在PyCharm可以點擊File>Settings>File Encodings,將Global Encoding和Project Encoding設(shè)置成UTF-8。
然后使用load_userdict()加載自定義詞典。
jieba.load_userdict('mydict.txt') lcut_res = jieba.lcut(test_content, cut_all=True, HMM=False) print('[使用自定義詞典]:', lcut_res)
結(jié)果
[使用自定義詞典]: ['迅雷', '迅雷不及', '迅雷不及掩耳', '不及', '掩耳', '掩耳盜鈴',
'鈴兒響叮當(dāng)', '響叮當(dāng)', '叮當(dāng)', '當(dāng)仁不讓', '不讓', '讓世界充滿愛', '世界',
'充滿', '愛', '之', '勢']
使用了自定義詞典,會同時根據(jù)jieba的默認詞典和自定義詞典進行分詞。添加自定義詞典和添加單個詞語的效果一樣,區(qū)別是可以批量添加,而不用重復(fù)調(diào)用add_word()。
3.從詞典中刪除詞語
jieba.del_word('不及') jieba.del_word('不讓') jieba.del_word('之') lcut_res = jieba.lcut(test_content, cut_all=True, HMM=False) print('[刪除詞語]:', lcut_res)
結(jié)果
[刪除詞語]: ['迅雷', '迅雷不及', '迅雷不及掩耳', '掩耳', '掩耳盜鈴', '兒',
'響叮當(dāng)', '叮當(dāng)', '當(dāng)仁不讓', '世界', '充滿', '愛', '之', '勢']
刪除的詞語一般是語氣助詞、邏輯連接詞等,這些詞對于文本分析沒有實際意義,反而會成為干擾。 在設(shè)置刪除的詞語后,結(jié)果中不再有刪除的詞語,但對于單個字,會獨立成詞,所以刪除后在結(jié)果中也還存在。
4.調(diào)整詞語的詞頻
調(diào)整詞語的詞頻,調(diào)整其在結(jié)果中被分出來的可能性,使分詞結(jié)果滿足預(yù)期。分兩種情況,一種是將分詞結(jié)果中的一個長詞拆分成多個詞,另一種是將分詞結(jié)果中的多個詞組成一個詞。
lcut_res = jieba.lcut(test_content, cut_all=False, HMM=False) print('[設(shè)置前]:', lcut_res) jieba.suggest_freq('讓世界充滿愛', True) lcut_res = jieba.lcut(test_content, cut_all=False, HMM=False) print('[設(shè)置后]:', lcut_res)
結(jié)果
[設(shè)置前]: ['迅雷不及', '掩耳盜鈴', '兒', '響', '叮', '當(dāng)仁不讓', '世界', '充滿', '愛', '之', '勢']
[設(shè)置后]: ['迅雷不及', '掩耳盜鈴', '兒', '響叮當(dāng)', '仁', '不', '讓世界充滿愛', '之', '勢']
suggest_freq()有兩個參數(shù),segment參數(shù)表示分詞的片段,如果是將一個詞拆開,則傳入拆開后的元組,如果是指定某個詞要作為一個整體,則傳入字符串;tune參數(shù)為True,則調(diào)整詞語的詞頻。 注意:自動計算的詞頻在使用HMM新詞發(fā)現(xiàn)功能時可能無效。
五、關(guān)鍵詞提取
關(guān)鍵詞提取使用jieba中的analyse模塊,基于兩種不同的算法,提供了兩個不同的方法。
1.基于TF-IDF算法的關(guān)鍵詞提取
from jieba import analyse key_word = analyse.extract_tags(test_content, topK=3) print('[key_word]:', list(key_word)) key_word = analyse.extract_tags(test_content, topK=3, withWeight=True) print('[key_word]:', list(key_word))
結(jié)果
[key_word]: ['迅雷不及', '兒響', '愛之勢']
[key_word]: [('迅雷不及', 1.7078239289857142), ('兒響', 1.7078239289857142), ('愛之勢', 1.7078239289857142)]
extract_tags()方法有四個參數(shù),sentence為待提取的文本;topK為返回最大權(quán)重關(guān)鍵詞的個數(shù),默認值為20;withWeight表示是否返回權(quán)重,是的話返回(word, weight)的list,默認為False;allowPOS為篩選指定詞性的詞,默認為空,即不篩選。
2.基于TextRank算法的關(guān)鍵詞提取
key_word = analyse.textrank(test_content, topK=3) print('[key_word]:', list(key_word)) allow = ['ns', 'n', 'vn', 'v', 'a', 'm', 'c'] key_word = analyse.textrank(test_content, topK=3, allowPOS=allow) print('[key_word]:', list(key_word))
結(jié)果
[key_word]: ['兒響', '世界']
Prefix dict has been built successfully.
[key_word]: ['充滿', '兒響', '世界']
textrank()方法與extract_tags()方法用法相似,需要注意的是allowPOS有默認值(‘ns’, ‘n’, ‘vn’, ‘v’),默認篩選這四種詞性的詞,可以自己設(shè)置。其他參數(shù)都與extract_tags()方法相同。
六、詞性標注
詞性標注使用jieba中的posseg模塊,標注分詞后每個詞的詞性,采用和ictclas兼容的標記法。
from jieba import posseg pos_word = posseg.lcut(test_content) print(pos_word)
結(jié)果
[pair('迅雷不及', 'i'), pair('掩耳盜鈴', 'i'), pair('兒響', 'n'),
pair('叮', 'v'), pair('當(dāng)仁不讓', 'i'), pair('世界', 'n'),
pair('充滿', 'a'), pair('愛', 'v'), pair('之', 'u'), pair('勢', 'ng')]
posseg.lcut()有兩個參數(shù),sentence和HMM。 詞性和詞性標簽參考下表:
標簽 | 含義 | 標簽 | 含義 | 標簽 | 含義 | 標簽 | 含義 |
n | 普通名詞 | f | 方位名詞 | s | 處所名詞 | t | 時間 |
nr | 人名 | ns | 地名 | nt | 機構(gòu)名 | nw | 作品名 |
nz | 其他專名 | v | 普通動詞 | vd | 動副詞 | vn | 名動詞 |
a | 形容詞 | ad | 副形詞 | an | 名形詞 | d | 副詞 |
m | 數(shù)量詞 | q | 量詞 | r | 代詞 | p | 介詞 |
c | 連詞 | u | 助詞 | xc | 其他虛詞 | w | 標點符號 |
PER | 人名 | LOC | 地名 | ORG | 機構(gòu)名 | TIME | 時間 |
七、返回詞語在原文的起止位置
返回詞語在原文的起止位置使用jieba中的Tokenize模塊,實際調(diào)用時使用tokenize()方法。
res = jieba.tokenize(test_content) for r in res: if len(r[0]) > 3: print('word:{}\t start:{}\t end:{}'.format(*r)) elif len(r[0]) > 1: print('word:{}\t\t start:{}\t end:{}'.format(*r)) else: print('word:{}\t\t\t start:{}\t end:{}'.format(*r))
結(jié)果
word:迅雷不及 start:0 end:4
word:掩耳盜鈴 start:4 end:8
word:兒響 start:8 end:10
word:叮 start:10 end:11
word:當(dāng)仁不讓 start:11 end:15
word:世界 start:15 end:17
word:充滿 start:17 end:19
word:愛之勢 start:19 end:22
tokenize()方法有三個參數(shù),unicode_sentence為待分詞內(nèi)容,注意,只接受unicode編碼內(nèi)容;mode參數(shù)為指定分詞模式,如需要使用搜索引擎模式,則設(shè)置mode=‘search’;HMM默認為True。 以上就是jieba分詞的常用功能介紹,更多用法請從下方參考文檔訪問GitHub。
到此這篇關(guān)于詳解Python中文分詞而生的jieba庫的文章就介紹到這了,更多相關(guān)Python的jieba庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 實現(xiàn)繪制子圖及子圖刻度的變換等問題
這篇文章主要介紹了Python 實現(xiàn)繪制子圖及子圖刻度的變換等問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python入門開發(fā)教程 windows下搭建開發(fā)環(huán)境vscode的步驟詳解
大家都知道Python是跨平臺的,它可以運行在Windows、Mac和各種Linux/Unix系統(tǒng)上。在Windows上寫Python程序,放到Linux上也是能夠運行的,今天給大家分享Python開發(fā)環(huán)境搭建vscode的步驟,一起看看吧2021-07-07Python使用struct處理二進制(pack和unpack用法)
這篇文章主要介紹了Python使用struct處理二進制(pack和unpack用法),幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11python利用WordCloud模塊實現(xiàn)詞云繪制
wordcloud是詞云繪圖模塊,封裝了WordCloud詞云類,是詞云的基本載體,下面小編就來和大家詳細講講如何利用WordCloud模塊實現(xiàn)詞云繪制吧,希望對大家有所幫助2023-10-10關(guān)于使用OpenCsv導(dǎo)入大數(shù)據(jù)量報錯的問題
這篇文章主要介紹了使用OpenCsv導(dǎo)入大數(shù)據(jù)量報錯的問題 ,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08關(guān)于Python中compile() 函數(shù)簡單實用示例詳解
這篇文章主要介紹了關(guān)于compile() 函數(shù)簡單實用示例,compile() 函數(shù)將一個字符串編譯為字節(jié)代碼,compile將代碼編譯為代碼對象,應(yīng)用在代碼中可以提高效率,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-05-05