Jieba 中文分詞-一- ——分詞與自定義字典 - 閱坊
文章推薦指數: 80 %
jieba 分詞特點----------支持四種分詞模式:精確模式試圖將句子最精確地切開 ... 開發者可以指定自己自定義的詞典,以便包含jieba 詞庫裏沒有的詞。
✕
Rust
架構
機器學習
Java
大數據
Javascript
Go
微服務
DDD
Twitter
Facebook
Feed
服務協議
聯繫我們
jieba分詞特點
支持四種分詞模式:
精確模式
試圖將句子最精確地切開,適合文本分析;
全模式
把句子中所有的可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義;
搜索引擎模式
在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。
paddle模式
利用PaddlePaddle深度學習框架,訓練序列標註(雙向GRU)網絡模型實現分詞。
同時支持詞性標註。
paddle模式使用需安裝paddlepaddle-tiny.
jieba分詞安裝
全自動安裝:
pipinstalljieba(window環境)
pip3installjieba(Linux環境)
半自動安裝:
先下載http://pypi.python.org/pypi/jieba/
解壓後運行pythonsetup.pyinstall
手動安裝:
將jieba目錄放置於當前目錄或者site-packages目錄
通過importjieba來引用
如果需要使用paddle模式下的分詞和詞性標註功能,請先安裝paddlepaddle-tiny,pipinstallpaddlepaddle-tiny==1.6.1。
主要功能
分詞
1、基本步驟
初始化
初始化時,先加載詞典文件dict.txt,遍歷每一行,生成詞語-詞數的鍵值對和總詞數,並將生成結果保存到cache中,下次直接從cache中讀取即可。
初始化可以簡單理解爲,讀取詞典文件,構建詞語-詞數鍵值對,方便後面步驟中查詞典,也就是字符串匹配。
切分短語
首先進行將語句轉換爲UTF-8或者GBK。
然後根據用戶指定的模式,是否全模式,是否採用HMM隱馬爾科夫,來設置cut方式。
然後根據正則,將輸入文本分爲一個個語句。
最後遍歷語句,對每個語句單獨進行分詞。
構建DAG
看構建DAG的過程。
先遍歷一個個切分好的短語,對這些短語來進行分詞。
首先要構建短語的有向無環圖DAG。
查詞典進行字符串匹配的過程中,可能會出現好幾種可能的切分方式,將這些組合構成有向無環圖,如下圖所示:
得到語句的有向無環圖DAG,DAG中記錄了某個詞的開始位置和它可能的結束位置。
開始位置作爲key,結束位置是一個list。
上面語句的完整DAG爲:
{0:[1,2], 1:[2], 2:[3,4,5], 3:[4], 4:[5]}
比如位置0的DAG表達爲{0:[1,2]},也就是說0位置爲詞的開始位置時,1,2位置都有可能是詞的結束位置。
動態規劃構建Route,計算從語句末尾到語句起始,DAG中每個節點到語句結束位置的最大路徑概率,以及概率最大時節點對應詞語的結束位置。
def calc(self, sentence, DAG, route):
N = len(sentence)
route[N] = (0, 0)
logtotal = log(self.total)
for idx in xrange(N - 1, -1, -1):
# route[idx] = (該漢字到最後一個漢字的最大路徑概率,
# 最大路徑概率時該漢字對應的詞語結束位置).
# 遍歷DAG中該漢字節點的結束位置,也就是DAG[idx],
# 計算idx到x之間構成的詞語的概率,然後乘以x到語句結束位置的最大概率,
# 即可得到idx到語句結束的路徑最大概率.
route[idx] = max(
(log(self.FREQ.get(sentence[idx:x + 1]) or 1)
- log(total)
+ route[x + 1][0]
, x) for x in DAG[idx])
# 每個詞的概率 = 字典中該詞的詞數 / 字典總詞數。
對於上圖構建每個節點的最大路徑概率的過程如下:
p(5)=1,p(4)=max(p(5)*p(4->5)),
p(3)=max(p(4)*p(3->4)),
p(2)=max(p(3)*p(2->3), p(4)*p(2->4), p(5)*p(2->5)),
對於節點2,他有2->3,2->4,2->4三條路徑,我們取概率最大的路徑作爲節點2的路徑概率,並記下概率最大時節點2的結束位置。
p(1)=max(p(2)*p(1->2))p(0)=max(p(1)*p(0->1), p(2)*p(0->2))
遍歷每個節點的Route,組裝詞語組合。
如果詞語不在字典中,也就是新詞,使用HMM隱馬爾科夫模型進行分割。
通過yield將詞語逐個返回。
2、基本方法
待分詞的字符串可以是unicode或UTF-8字符串、GBK字符串。
注意:不建議直接輸入GBK字符串,可能無法預料地錯誤解碼成UTF-8。
jieba.cut(sentence,
cut_all=False,
HMM=True,
use_paddle=False)
sentence: 需要分詞的字符串
cut_all: 用來控制是否採用全模式
HMM:用來控制是否使用HMM模型
use_paddle:用來控制是否使用paddle模式下的分詞模式,paddle模式採用延遲加載方式,通過enable_paddle接口
jieba.cut_for_search(sentence, HMM=True)
該方法適合用於搜索引擎構建倒排索引的分詞,粒度比較細。
sentence:分詞的字符串
HMM:使用HMM模型
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
jieba.enable_paddle()# 啓動paddle模式。
strs=["我關注了數據STUDIO","我是數據分析師","四川大學"]
for str in strs:
seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
seg_list = jieba.cut("我畢業於四川大學,我關注了數據STUDIO", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我畢業於四川大學,我關注了數據STUDIO", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精確模式
seg_list = jieba.cut("他來到了網易杭研大廈") # 默認是精確模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("我是雲朵君,我關注了數據STUDIO") # 搜索引擎模式
print(", ".join(seg_list))
Paddleenabledsuccessfully......
PaddleMode:我/關注/了/數據/STUDIO
PaddleMode:我/是/數據/分析師
PaddleMode:四川大學
FullMode:我/畢業/於/四川/四川大學/大學/,/我/關注/了/數據/STUDIO
DefaultMode:我/畢業/於/四川大學/,/我/關注/了/數據/STUDIO
他,來到,了,網易,杭研,大廈
我,是,雲朵,君,,,我,關注,了,數據,STUDIO
添加自定義詞典
1、原始詞典
詞典是基於字符串匹配的分詞算法的關鍵所在,決定了最終分詞的準確度。
jieba詞典dict.txt是jieba作者採集了超大規模的語料數據,統計得到的。
有5M,包含349,046條詞語。
每一行對應一個詞語,包含詞語詞數詞性三部分。
2、載入詞典
開發者可以指定自己自定義的詞典,以便包含jieba詞庫裏沒有的詞。
雖然jieba有新詞識別能力,但是自行添加新詞可以保證更高的正確率。
jieba.load_userdict(file_name)
詞典格式和dict.txt一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。
file_name爲文件類對象或自定義詞典的路徑,若爲路徑或二進制方式打開的文件,則文件必須爲UTF-8編碼。
詞頻省略時使用自動計算的能保證分出該詞的詞頻。
例如:
創新辦 3 i
雲計算 5
凱特琳 nz
臺中
更改分詞器(默認爲jieba.dt)的tmp_dir和cache_file屬性,可分別指定緩存文件所在的文件夾及其文件名,用於受限的文件系統。
代碼示例:
#encoding=utf-8
import sys
sys.path.append("../")
import jieba
import jieba.posseg as pseg
test_sent = (
"李小福是創新辦主任也是雲計算方面的專家; 什麼是八一雙鹿\n"
"例如我輸入一個帶“韓玉賞鑑”的標題,在自定義詞庫中也增加了此詞爲N類\n"
"「臺中」正確應該不會被切開。
mac上可分出「石墨烯」;此時又可以分出來凱特琳了。
"
)
words = jieba.cut(test_sent)
print("使用默認詞庫:\n {}".format('/'.join(words)))
print("="*40)
jieba.load_userdict("userdict.txt")
"""
userdict.txt
雲計算 5
李小福 2 nr
創新辦 3 i
pip_install 3 eng
好用 300
韓玉賞鑑 3 nz
八一雙鹿 3 nz
臺中
凱特琳 nz
Edu Trust認證 2000
"""
jieba.add_word('石墨烯')
jieba.add_word('凱特琳')
jieba.del_word('自定義詞')
words = jieba.cut(test_sent)
print("加載自定義詞庫後: \n{}".format('/'.join(words)))
print("="*40)
# 帶有詞性的分詞
result = pseg.cut(test_sent)
for w in result:
print(w.word, "/", w.flag, ", ", end=' ')
print("\n" + "="*40)
terms = jieba.cut('pip_install is great')
print('/'.join(terms))
terms = jieba.cut('python 的正則表達式是好用的')
print('/'.join(terms))
print("="*40)
使用默認詞庫::
李小福/是/創新/辦/主任/也/是/雲/計算/方面/的/專家/
加載自定義詞庫後:
李小福/是/創新辦/主任/也/是/雲計算/方面/的/專家/
3、調整詞典
使用add_word(word,freq=None,tag=None)和del_word(word)可在程序中動態修改詞典。
使用get_FREQ(word)用來統計當前詞的詞頻。
使用suggest_freq(segment,tune=True)可調節單個詞語的詞頻,使其能(或不能)被分出來。
注意:自動計算的詞頻在使用HMM新詞發現功能時可能無效。
代碼示例:
# test frequency tune
testlist = [
('今天天氣不錯', ('今天', '天氣')),
('如果放到post中將出錯。
', ('中', '將')),
('我們中出了一個叛徒', ('中', '出')),
]
for sent, seg in testlist:
print('/'.join(jieba.cut(sent, HMM=False)))
word = ''.join(seg)
print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))
print('/'.join(jieba.cut(sent, HMM=False)))
print("-"*40)
今天天氣/不錯
今天天氣Before:3,After:0
今天/天氣/不錯
如果/放到/post/中將/出錯/
中將Before:763,After:494
如果/放到/post/中/將/出錯/。
我們/中/出/了/一個/叛徒
中出Before:3,After:3
我們/中/出/了/一個/叛徒
通過用戶自定義詞典來增強歧義糾錯能力[2]
參考資料
[1]jieba分詞:https://github.com/fxsjy/jieba
[2]用戶自定義詞典:https://github.com/fxsjy/jieba/issues/14
本文由Readfog進行AMP轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/iYmwqXt6HeKHSnWdth2YMA
2021年04月24日
#分詞
#詞典
#詞語
#模式
#自定義
猜你喜歡
Jieba中文分詞-二-——詞性標註與關鍵詞提取
手把手教會你使用Python進行jieba分詞
瞭解中文分詞編程技術
《谷歌的軟件工程》筆記-一-
有贊移動性能監控平臺(一)
RPC編程-一-:初步瞭解RPC
編寫與優化Go代碼-一-
中文版K8s排障流程圖
Gin框架-一-:快速入門
Go可用性-一-隔離設計
從分層架構到微服務架構(一)
Go-advice中文版本
延伸文章資訊
- 1Python - 知名Jieba 中文斷詞工具教學
今天要介紹的這個算是很知名的中文斷詞工具,這個是大陸人發明的工具,並且將其開源 ... 如果Jieba 內建詞庫沒有你要的詞,可以建立自定義的詞典.
- 2載入詞,修改詞頻,定義詞庫| jieba自訂詞庫 - 旅遊日本住宿評價
jieba自訂詞庫,大家都在找解答。跳到載入自定義詞庫- jieba.load_userdict(filename)#filename為檔案路徑詞典格式和dict.txt一樣,一詞一行,每行分三...
- 3Jieba 中文分詞-一- ——分詞與自定義字典 - 閱坊
jieba 分詞特點----------支持四種分詞模式:精確模式試圖將句子最精確地切開 ... 開發者可以指定自己自定義的詞典,以便包含jieba 詞庫裏沒有的詞。
- 4中文斷詞 - iT 邦幫忙
開發者可以指定自己自定義的詞典,以便包含jieba詞庫裡沒有的詞。 · 用法:jieba.load_userdict(file_name)#file_name為文件類對像或自定義詞典的路徑 ...
- 5jieba 自訂詞庫斷詞
jieba 自訂詞庫斷詞 ... 在進行中文Text Mining 前處理時,必須先經過斷詞處理。社群當中存在相當好的斷詞處理工具,如jieba。但斷詞時常遇到一個問題:文本 ...