jieba 中文分词
這里寫目錄標題
- 介紹 Introduction
- 模塊安裝 Install
- 導入模塊 Import
- 機制 Mechanism
- 功能詳解 Function
- 分詞
- 添加自定義詞典
- 載入自定義詞典【詞典 = 默認詞典 + 自定義詞典】 —————— `“給機器加詞典(臨時)”`
- 使用自定義詞典【使用詞典 = 自定義詞典】 —————— `“給機器換詞典(臨時)”`
- 詞典格式
- 調整詞典(添加、刪除、調整詞頻)
- Tokenize:分詞后返回詞語在原文的起止位置
- 詞性標注
- 提取關鍵詞
- 其他詞典
介紹 Introduction
“結巴”中文分詞:做最好的 Python 中文分詞組件
特點
- 【支持四種分詞模式】:
- 【精確模式】,試圖將句子根據詞典中有的詞最精確地切開,適合文本分析;
- 【全模式】,把句子中所有的詞典中存在的詞語都掃描出來, 速度非常快,但是不能解決歧義;
- 【搜索引擎模式】,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
- paddle模式,利用PaddlePaddle深度學習框架,訓練序列標注(雙向GRU)網絡模型實現分詞。同時支持詞性標注。paddle模式使用需安裝paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,請升級jieba,pip install jieba --upgrade 。PaddlePaddle官網【目前paddlepaddle-tiny僅支持python 3.7及以前部分版本,即python3.8及以上版本不支持通過paddlepaddle-tiny使用該模式】
- 【支持繁體分詞】
- 【支持自定義詞典】
- MIT 授權協議
算法
- 基于前綴詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG)
- 采用了動態規劃查找最大概率路徑, 找出基于詞頻的最大切分組合
- 對于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法
功能
- 【分詞】
- 【添加自定義詞典】
- 【關鍵詞提取】
- 【詞性標注】
- 【并行分詞】 —— 不說明
- 【Tokenize:返回詞語在原文的起止位置】
- 【ChineseAnalyzer for Whoosh 搜索引擎】 —— 不說明
- 【命令行分詞】 —— 不說明
分詞速度
測試環境: Intel? Core? i7-2600 CPU @ 3.4GHz;《圍城》.txt
- 全模式:1.5 MB/s
- 默認模式:400 KB/s
模塊安裝 Install
pip install jieba導入模塊 Import
import jieba機制 Mechanism
分詞操作通過分詞器進行,分詞器可以配置詞典。分詞時,分詞器根據詞典內所含有的詞語,對輸入的中文文字,通過全模式或精確模式或搜索模式進行分詞。模塊本身提供了一個默認分詞器(jieba = jieba.dt = jieba.Tokenizer()),該默認分詞器內內置有一個默認詞典。當你對默認分詞器和詞典不滿意時,你可以新建一個包含新詞典的分詞器,或者為默認分詞器添加新詞典,或者替換默認分詞器的詞典(不完全替換:使用類方法 和 完全替換:文件覆蓋),從而達到個性化的分詞體驗。
功能詳解 Function
分詞
-
jieba.cut(sentence, cut_all=False, HMM=True, use_paddle=False)
分詞的主要函數。
==> jieba.dt.cut(sentence, cut_all=False, HMM=True, use_paddle=False)
-
參數
【sentence】:str。要進行分詞的句子或文段。
【cut_all=False】:默認為False,精確模式。True表示全模式,False表示精確模式。
HMM=True:默認為True,使用HMM模型,即會自動發現新詞,一般是使用的,即保持默認值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
use_paddle=False:默認為False,不使用paddle模式,不怎么使用,即保持默認,可忽略。True表示使用paddle模式,False表示不使用paddle模式。
-
返回
返回可迭代的生成器。
-
示例
---代碼---# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 精確模式 result = jieba.cut(sentence, cut_all=False) # 未處理結果 print(result) # 處理結果 print(list(result))# 全模式 result = jieba.cut(sentence, cut_all=True) # 未處理結果 print(result) # 處理結果 print(list(result))---結果---精確模式未處理結果:<generator object Tokenizer.cut at 0x00000217B912FA50> 精確模式處理結果: ['本學期', '校內', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行通知', '。']全模式未處理結果:<generator object Tokenizer.cut at 0x00000217B959D2E0> 全模式處理結果: ['本學期', '學期', '校內', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調整', '將', '另行', '另行通知', '通知', '。']
-
-
jieba.cut_for_search(sentence, HMM=True)
搜索引擎模式。為搜索引擎提供更精細的細分,該方法適合用于搜索引擎構建倒排索引的分詞,粒度比較細
==> jieba.dt.cut_for_search(sentence, HMM=True)
-
參數
【sentence】:str。要進行分詞的句子或文段。
HMM=True:默認為True,使用HMM模型,一般是使用的,即保持默認值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
-
返回
返回可迭代的生成器。
-
示例
---代碼---# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 搜索引擎模式 result = jieba.cut_for_search(sentence) # 未處理結果 print(result) # 處理結果 print(list(result))---結果---搜索引擎模式未處理結果:<generator object Tokenizer.cut_for_search at 0x00000213FECAFA50> 搜搜引擎模式處理結果: ['學期', '本學期', '校內', '選修', '修課', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行', '通知', '另行通知', '。']
-
-
jieba.lcut(sentence, cut_all=False, HMM=True, use_paddle=False)
分詞列表模式。
==> jieba.dt.lcut(sentence, cut_all=False, HMM=True, use_paddle=False)
-
==>list(jieba.cut(sentence, cut_all=False, HMM=True, use_paddle=False))
-
返回
列表
-
示例
---代碼---# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 精確模式列表模式 result = jieba.lcut(sentence, cut_all=False) # 結果 print(result)# 全模式列表模式 result = jieba.lcut(sentence, cut_all=True) # 結果 print(result)---結果---精確模式列表模式: ['本學期', '校內', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行通知', '。']全模式列表模式: ['本學期', '學期', '校內', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調整', '將', '另行', '另行通知', '通知', '。']
-
-
jieba.lcut_for_search(sentence, HMM=True)
搜索引擎模式列表模式。
==> jieba.dt.lcut_for_search(sentence, HMM=True)
-
==>list(jieba.cut_for_search(sentence, HMM=True))
-
返回
列表
-
示例
---代碼---# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 搜索引擎模式列表模式 result = jieba.lcut_for_search(sentence) # 結果 print(result)---結果---搜索引擎模式列表模式: ['學期', '本學期', '校內', '選修', '修課', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行', '通知', '另行通知', '。']
-
-
jieba.Tokenizer(dictionary=DEFAULT_DICT) —————— “換機器”
自定義分詞器,這是一個分詞器的類對象,以上分詞函數都是該類的方法。上面出現的jieba.dt == jieba.Tokenizer(dictionary=DEFAULT_DICT)就是一個默認分詞器,默認分詞器使用默認詞典。
【通俗說,分詞器是一個機器,而以上各函數方法是這個機器的按鈕,使用哪個函數就進行何種操作。而jieba直接調用以上函數方法,使用的就是默認分詞器。所以jieba.cut() == jieba.dt.cut() == jieba.Tokenizer().cut()】
-
參數
dictionary=DEFAULT_DICT:str。分詞器使用的詞典,默認為模塊自帶的默認詞典。需使用自編詞典時,值替換為自編詞典路徑。
-
返回
創建分詞器對象。
-
示例
---默認分詞器本質---# 創建分詞器 dt = jieba.Tokenizer() # 分詞器操作 dt.cut() dt.lcut() dt.cut_for_search() dt.lcut_for_search()---如何自建分詞器---# 自編詞典路徑 dic = “自建詞典路徑” # 如何自建詞典暫不予以說明 # 創建分詞器 tokenizer = jieba.Tokenizer(dictionary=dic) # 分詞器操作 tokenizer.cut() tokenizer.lcut() tokenizer.cut_for_search() tokenizer.lcut_for_search()
添加自定義詞典
載入自定義詞典【詞典 = 默認詞典 + 自定義詞典】 —————— “給機器加詞典(臨時)”
開發者可以指定自己自定義的詞典,以便包含 jieba 詞庫里沒有的詞。雖然 jieba 有新詞識別能力,但是自行添加新詞可以保證更高的正確率。
jieba.load_userdict(file_name)
==> jieba.dt.load_userdict(file_name)
載入附加一個自定義詞典,將自定義詞典臨時附加到分詞器(一般默認分詞器),將會產生臨時緩存文件。
-
參數
file_name:str or _io.TextIOWrapper。自定義詞典的文件路徑或open()打開的文件類對象。若為路徑或二進制方式打開的文件,則文件必須為 UTF-8 編碼。
-
返回
None。
-
示例
---代碼---# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 不載入自定義詞典進行全模式分詞操作 result = jieba.lcut(sentence, cut_all=True) # 結果 print(result)# 載入自定義詞典(如自定義詞典dic.txt在同目錄下,詞典包含內容“行通 100 n”,該詞在jieba默認詞典中不具有) jieba.load_userdict("dic.txt") # 載入自定義詞典后進行全模式分詞操作 result = jieba.lcut(sentence, cut_all=True) # 結果 print(result)---結果---不載入自定義詞典進行全模式分詞操作: ['本學期', '學期', '校內', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調整', '將', '另行', '另行通知', '通知', '。']載入自定義詞典后進行全模式分詞操作: ['本學期', '學期', '校內', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調整', '將', '另行', '另行通知', '行通', '通知', '。']可見載入自定義詞典后進行的分詞結果中出現了默認詞典中不具有的“行通”一詞。
使用自定義詞典【使用詞典 = 自定義詞典】 —————— “給機器換詞典(臨時)”
jieba.set_dictionary(dictionary_path)
==> jieba.dt.set_dictionary(dictionary_path)
等效于 jieba.Tokenizer(dictionary="詞典路徑"), 但直接更改分詞器詞典,不需要創建新的分詞器。
詞典格式
和 dict.txt【jieba模塊文件夾中的默認詞典】 一樣,一個詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。詞頻省略時使用自動計算的能保證分出該詞的詞頻。
-
默認詞典路徑(通常)
C:\Users\“用戶名”\AppData\Local\Programs\Python\Python38\Lib\site-packages\jieba\dict.txt
獲取方式:
jieba.get_dict_file()
==> jieba.dt.get_dict.file()
獲取分詞器所使用的詞典,返回文件類對象。默認返回默認詞典。
---代碼---result = jieba.get_dict_file() print(result.name)---結果---'C:\\Users\\Harrison\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\jieba\\dict.txt' -
示例
創新辦 3 i 云計算 5 凱特琳 nz 臺中 -
詞性(部分)
標簽含義標簽含義標簽含義標簽含義 n 普通名詞 f 方位名詞 s 處所名詞 t 時間 nr 人名 ns 地名 nt 機構名 nw 作品名 nz 其他專名 v 普通動詞 vd 動副詞 vn 名動詞 a 形容詞 ad 副形詞 an 名形詞 d 副詞 m 數量詞 q 量詞 r 代詞 p 介詞 c 連詞 u 助詞 xc 其他虛詞 w 標點符號 PER 人名 LOC 地名 ORG 機構名 TIME 時間
調整詞典(添加、刪除、調整詞頻)
-
-
jieba.add_word(word, freq=None, tag=None)
==> jieba.dt.add_word(word, freq=None, tag=None)
向分詞器使用詞典中添加新詞
-
參數
word:str。希望向詞典中添加的詞。
freq=None: 指定新詞詞頻,默認為None。詞頻為None時使用自動計算的能保證分出該詞的詞頻。
tag=None:指定新詞詞性,默認為None。
-
返回
None。
-
-
jieba.del_word(word)
==> jieba.dt.del_word(word)
刪除分詞器使用詞典中的某個詞
-
參數
word:str。希望從詞典中刪除的詞。
-
返回
None。
-
-
jieba.suggest_freq(segment, tune=False)
==> jieba.dt.suggest_freq(segment, tune=False)
調節單個詞語的詞頻,使其能(或不能)被分出來。(不會改變分詞器使用詞典內容)
-
參數
segment:tuple or str。一個詞期待被分成的片段,此時輸入為片段的元組;如果希望該詞視為整體,則輸入為字符串。
tune=False:是否調整詞頻,默認為False。一般使用True。
-
返回
計算機計算的詞頻。注意:自動計算的詞頻在使用 HMM 新詞發現功能時可能無效。建議分詞時HMM=False。
-
示例
---代碼---# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 不調整詞頻精確模式列表模式 result = jieba.lcut(sentence) # 結果 print(result)jieba.suggest_freq("第3周", tune=True) # 調整詞頻精確模式列表模式:"第","3","周" —— "第三周" result = jieba.lcut(sentence, HMM=False) # 結果 print(result)jieba.suggest_freq(("日","起"), tune=True) # 調整詞頻精確模式列表模式:"日起" —— "日","起" result = jieba.lcut(sentence, HMM=False) # 結果 print(result)---結果---不調整詞頻精確模式列表模式: ['本學期', '校內', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行通知', '。']調整詞頻精確模式列表模式:"第","3","周" —— "第3周" ['本學期', '校內', '選修課', '暫定', '于', '第3周', '2022', '年', '3', '月', '7', '日', '起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行通知', '。']調整詞頻精確模式列表模式:"日起" —— "日","起" ['本學期', '校內', '選修課', '暫定', '于', '第3周', '2022', '年', '3', '月', '7', '日', '起', '開始', '上課', ',', '如', '有', '特殊', '調整', '將', '另行通知', '。']
-
Tokenize:分詞后返回詞語在原文的起止位置
jieba.tokenize(sentence, mode="default", HMM=True)
==> jieba.dt.tokenize(sentence, mode="default", HMM=True)
- 參數
? sentence:str。要進行分詞的字符串。
? mode="default":默認模式“default”,搜索模式“search”,默認為默認模式。
? HMM=True:默認為True,使用HMM模型,一般是使用的,即保持默認值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
-
返回
(word,start,end)的生成器,start是word在輸入字符串中的開始位置,end是word在輸入字符串中的結束位置。
-
示例
---代碼---# 默認模式 result = jieba.tokenize('永和服裝飾品有限公司') print(result) for tk in result:print(tk)# 搜索模式 result = jieba.tokenize('永和服裝飾品有限公司', mode="search") print(result) for tk in result:print(tk)---結果---默認模式: <generator object Tokenizer.tokenize at 0x0000016E5F89FA50> ('永和', 0, 2) ('服裝', 2, 4) ('飾品', 4, 6) ('有限公司', 6, 10)搜索模式: <generator object Tokenizer.tokenize at 0x0000016E5FCFBD60> ('永和', 0, 2) ('服裝', 2, 4) ('飾品', 4, 6) ('有限', 6, 8) ('公司', 8, 10) ('有限公司', 6, 10)
?
詞性標注
jieba.posseg.lcut(sentence) = list(jieba.posseg.cut(sentence))
分詞后標注每個詞的詞性,返回jieba.posseg.pair對象(該對象可看成是一個元組)的列表或生成器。
---代碼---# 導入 import jieba.posseg# 待分詞文段 sentence = "本學期校內選修課暫定于第3周2022年3月7日起開始上課,如有特殊調整將另行通知。"# 返回列表 result = jieba.posseg.lcut(sentence) # 結果 print(result)# 返回生成器 result = jieba.posseg.cut(sentence) # 結果 print(result)---結果---返回列表: [pair('本學期', 'n'), pair('校內', 's'), pair('選修課', 'v'), pair('暫定', 'd'), pair('于', 'p'), pair('第', 'm'), pair('3', 'm'), pair('周', 'nr'), pair('2022', 'm'), pair('年', 'm'), pair('3', 'm'), pair('月', 'm'), pair('7', 'm'), pair('日', 'm'), pair('起', 'v'), pair('開始', 'v'), pair('上課', 'v'), pair(',', 'x'), pair('如', 'v'), pair('有', 'v'), pair('特殊', 'a'), pair('調整', 'vn'), pair('將', 'd'), pair('另行通知', 'i'), pair('。', 'x')]返回生成器: <generator object cut at 0x00000240C15F5350>提取關鍵詞
導入
import jieba.analyse
基于 TF-IDF 算法的關鍵詞抽取
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
-
參數
sentence:str。為待提取的文本。
topK=20:返回TF/IDF 權重最大的關鍵詞的數目,默認值為 20。
withWeight=False:是否一并返回關鍵詞權重值,默認值為 False。
allowPOS=():僅包括指定詞性的詞,即篩選,默認值為空,即不篩選。
-
返回
列表
基于 TextRank 算法的關鍵詞抽取
其思想是:通過詞之間的相鄰關系構建網絡,然后用PageRank迭代計算每個節點的rank值,排序rank值即可得到關鍵詞。
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
-
參數
sentence
topK=20
withWeight=False
allowPOS=('ns', 'n', 'vn', 'v'):僅包括指定詞性的詞,即篩選,默認值為(‘ns’, ‘n’, ‘vn’, ‘v’)。
-
返回
列表
其他詞典
占用內存較小的詞典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
支持繁體分詞更好的詞典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big
總結
以上是生活随笔為你收集整理的jieba 中文分词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Expresso学习.net正则表达
- 下一篇: JAVA四种基本排序总结