Jieba 中文分詞-二- ——詞性標註與關鍵詞提取 - 閱坊
文章推薦指數: 80 %
extra_dict/idf.txt.big"); tags = jieba.analyse.extract_tags(content, topK=topK) print(", ".join(tags)) print('*'*40) # 關鍵詞提取所使用停止 ...
✕
Rust
架構
機器學習
Java
大數據
Javascript
Go
微服務
DDD
Twitter
Facebook
Feed
服務協議
聯繫我們
jieba分詞
上一篇jieba中文分詞(一)分詞與自定義字典已介紹了jieba中文分詞安裝,分詞原理,分詞方法,自定義字典,添加字典等多種常用分詞方法。
本篇將繼續介紹jieba分詞關鍵詞提取、詞性標註、及常見問題。
關鍵詞提取
關鍵詞提取,將文本中最能表達文本含義的詞語抽取出來,有點類似於論文的關鍵詞或者摘要。
關鍵詞抽取可以採取:
有監督學習:
文本作爲輸入,關鍵詞作爲標註,進行訓練得到模型。
此方法難點在於需要大量人工標註。
無監督學習:
先抽取出候選詞,對每個候選詞打分,取出前K個分值高的作爲最後的關鍵詞。
jieba分詞實現了基於TF-IDF和基於TextRank的關鍵詞抽取算法。
基於TF-IDF算法的關鍵詞抽取
基於TF-IDF的關鍵詞抽取算法,目標是獲取文本中詞頻高,也就是TF大的,且語料庫其他文本中詞頻低的,也就是IDF大的。
這樣的詞可以作爲文本的標誌,用來區分其他文本。
import jieba.analyse
jieba.analyse.extract_tags(sentence,
topK=20,
withWeight=False,
allowPOS=())
sentence:爲待提取的文本
topK:爲返回幾個TF/IDF權重最大的關鍵詞,默認值爲20
withWeight:爲是否一併返回關鍵詞權重值,默認值爲False
allowPOS:僅包括指定詞性的詞,默認值爲空,即不篩選
代碼示例:
import jieba
import jieba.analyse
topK = 5
file_name = 'test.txt'
"""
test.txt
西三旗硅谷先鋒小區半地下室出租,便宜可合租硅谷
工信處女幹事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作
"""
with open(file_name, 'rb') as f:
content = f.read()
tags = jieba.analyse.extract_tags(content, topK=topK)
print(", ".join(tags))
print('*'*40)
# 關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑
jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");
tags = jieba.analyse.extract_tags(content, topK=topK)
print(", ".join(tags))
print('*'*40)
# 關鍵詞提取所使用停止詞文本語料庫可以切換成自定義語料庫的路徑
jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")
jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");
tags = jieba.analyse.extract_tags(content, topK=topK)
print(", ".join(tags))
print('*'*40)
# 關鍵詞一併返回關鍵詞權重值示例
withWeight = True
tags = jieba.analyse.extract_tags(content, topK=topK, withWeight=withWeight)
for tag in tags:
print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
硅谷,西三旗,工信處,女幹事,24
硅谷,西三旗,先鋒,小區,合租
硅谷,西三旗,先鋒,小區,合租
tag:硅谷 weight:1.039545
tag:西三旗weight:0.519773
tag:先鋒 weight:0.519773
tag:小區 weight:0.519773
tag:合租 weight:0.519773
基於TextRank算法的關鍵詞抽取
jieba.analyse.textrank(sentence,
topK=20,
withWeight=False,
allowPOS=('ns', 'n', 'vn', 'v'))
sentence:爲待提取的文本
topK:爲返回幾個權重最大的關鍵詞,默認值爲20
withWeight:爲是否一併返回關鍵詞權重值,默認值爲False
allowPOS:僅包括指定詞性的詞,默認過濾詞性
算法論文:TextRank:BringingOrderintoTexts[1]
一般步驟:
先將文本進行分詞和詞性標註,將特定詞性的詞(比如名詞)作爲節點添加到圖中。
出現在一個窗口中的詞語之間形成一條邊,窗口大小可設置爲2~10之間,默認爲5,它表示一個窗口中有多少個詞語。
對節點根據入度節點個數以及入度節點權重進行打分,入度節點越多,且入度節點權重大,則打分高。
然後根據打分進行降序排列,輸出指定個數的關鍵詞。
代碼示例:
tags = jieba.analyse.textrank(content,
topK=5,
withWeight=True)
for tag in tags:
print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
tag:硅谷 weight:1.000000
tag:女幹事weight:0.847395
tag:技術性weight:0.800966
tag:器件 weight:0.794530
tag:交換機weight:0.766318
詞性標註
通過查詢字典的方式獲取識別詞的詞性,通過HMM隱馬爾科夫模型來獲取未登錄詞的詞性,從而完成整個語句的詞性標註。
但可以看到查詢字典的方式不能解決一詞多詞性的問題,也就是詞性歧義問題。
故精度上還是有所欠缺的。
標註句子分詞後每個詞的詞性,詞性標示兼容ICTCLAS漢語詞性標註集。
除了jieba默認分詞模式,提供paddle模式下的詞性標註功能。
代碼示例:
import jieba
import jieba.posseg as pseg
jieba.add_word('數據STUDIO')
words = pseg.cut("我關注了微信公衆號數據STUDIO")
print('jieba默認模式')
for word, flag in words:
print('%s %s' % (word, flag))
print('+'*10)
jieba.enable_paddle() #啓動paddle模式。
words = pseg.cut("我關注了微信公衆號數據STUDIO",use_paddle=True) #paddle模式
print('paddle模式')
for word, flag in words:
print('%s %s' % (word, flag))
print('+'*10)
jieba默認模式
我r
關注v
了ul
微信vn
公衆n
號m
數據STUDIOx
Paddleenabledsuccessfully......
paddle模式
我r
關注v
了u
微信公衆號數據STUDIOnz
默認模式詞性和專名類別標籤集合如下表。
t2Vhiq
paddle模式詞性和專名類別標籤集合如下表,其中詞性標籤24個(小寫字母),專名類別標籤4個(大寫字母)。
weJfnp
並行分詞
原理:將目標文本按行分隔後,把各行文本分配到多個Python進程並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升。
基於python自帶的multiprocessing模塊,目前暫不支持Windows。
jieba.enable_parallel(4)開啓並行分詞模式,參數爲並行進程數
jieba.disable_parallel()關閉並行分詞模式
Tokenize:返回詞語在原文的起止位置
注意,輸入參數只接受unicode
默認模式
import jieba
import jieba.posseg as pseg
from prettytable import PrettyTable
jieba.add_word('數據STUDIO')
jieba.add_word('微信公衆號')
result = jieba.tokenize(u'我關注了微信公衆號數據STUDIO')
x = PrettyTable(["word", "start", "end"])
x.align["word"] = "l"# 左對齊
x.padding_width = 2 # 列邊和內容之間有兩個空格(默認爲一個空格)
for tk in result:
x.add_row([tk[0], tk[1], tk[2]])
print(x)
kOiyOQ
搜索模式
result = jieba.tokenize(u'我關注了微信公衆號數據STUDIO', mode='search')
x = PrettyTable(["word", "start", "end"])
x.align["word"] = "l"# 左對齊
x.padding_width = 2 # 列邊和內容之間有兩個空格(默認爲一個空格)
for tk in result:
x.add_row([tk[0], tk[1], tk[2]])
print(x)
4sDPyr
延遲加載機制
jieba採用延遲加載,importjieba和jieba.Tokenizer()不會立即觸發詞典的加載,一旦有必要纔開始加載詞典構建前綴字典。
如果你想手工初始jieba,也可以手動初始化。
import jieba
jieba.initialize() # 手動初始化(可選)
有了延遲加載機制後,你可以改變主詞典的路徑:
下載你所需要的詞典,然後覆蓋jieba/dict.txt即可;
或者用:
jieba.set_dictionary('data/dict.txt.big')
常見問題
“臺中”總是被切成“臺中”?(以及類似情況)
P(臺中)<P(臺)×P(中),“臺中”詞頻不夠導致其成詞概率較低
解決方法:強制調高詞頻
jieba.add_word('臺中')或者jieba.suggest_freq('臺中',True)
“今天天氣不錯”應該被切成“今天天氣不錯”?(以及類似情況)
解決方法:強制調低詞頻
jieba.suggest_freq(('今天','天氣'),True)
或者直接刪除該詞jieba.del_word('今天天氣')
切出了詞典中沒有的詞語,效果不理想?
解決方法:關閉新詞發現
jieba.cut('豐田太省了',HMM=False)``jieba.cut('我們中出了一個叛徒',HMM=False)
更多問題[2]
參考資料
[1]TextRank算法論文:http://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf
[2]更多問題:https://github.com/fxsjy/jieba/issues?sort=updated&state=closed
本文由Readfog進行AMP轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/2p7dJg3zq-HcESjWOMLYSA
2021年04月24日
#詞性
#分詞
#關鍵
#文本
#默認
猜你喜歡
Jieba中文分詞-一-——分詞與自定義字典
手把手教會你使用Python進行jieba分詞
瞭解中文分詞編程技術
《谷歌的軟件工程》筆記-二-
Rust中的無鎖編程技術(二)
有贊移動性能監控平臺(二)
中文版K8s排障流程圖
Go-advice中文版本
RPC編程-二-:快速入門使用
Go工程化-二-項目目錄結構
Go中的併發
淺談JS中的遞歸
延伸文章資訊
- 1fxsjy/jieba: 结巴中文分词
Contribute to fxsjy/jieba development by creating an account on GitHub. ... 语料库示例:https://github....
- 2jieba 詳細介紹 - 程式庫
jieba. "結巴"中文分詞:做最好的Python中文分片語件"Jieba" ... 佔用記憶體較小的詞典檔案 https://github.com/fxsjy/jieba/raw/maste...
- 3Jieba 中文分詞-二- ——詞性標註與關鍵詞提取 - 閱坊
extra_dict/idf.txt.big"); tags = jieba.analyse.extract_tags(content, topK=topK) print(", ".join(t...
- 4結巴中文分詞的學習和使用 - 程式人生
jieba.cut 方法接受三個輸入引數: 需要分詞的字串;cut_all 引數用來控制 ... :https://github.com/fxsjy/jieba/blob/master/extr...
- 5【轉】jieba分詞詳解 - 台部落
jieba.cut 方法接受三個輸入參數: 需要分詞的字符串;cut_all 參數用來 ... :https://github.com/fxsjy/jieba/blob/master/extra...