Python的jieba分詞及TF-IDF和TextRank 演算法提取關鍵字
阿新 • • 發佈:2018-12-09
參考文章:Github上的專案———jieba
中文分詞
對於NLP(自然語言處理)來說,分詞是一步重要的工作,市面上也有各種分詞庫,11款開放中文分詞系統比較。
1.基於詞典:基於字典、詞庫匹配的分詞方法;(字串匹配、機械分詞法)
2.基於統計:基於詞頻度統計的分詞方法;
3.基於規則:基於知識理解的分詞方法。
- 第一類方法應用詞典匹配、漢語詞法或其它漢語語言知識進行分詞,如:最大匹配法、最小分詞方法等。這類方法簡單、分詞效率較高,但漢語語言現象複雜豐富,詞典的完備性、規則的一致性等問題使其難以適應開放的大規模文字的分詞處理。
- 第二類基於統計的分詞方法則基於字和詞的統計資訊,如把相鄰字間的資訊、詞頻及相應的共現資訊等應用於分詞,由於這些資訊是通過調查真實語料而取得的,因而基於統計的分詞方法具有較好的實用性。
jieba分詞,完全開源,有整合的python庫,簡單易用。
jieba分詞是基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG),動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合
安裝jieba
在安裝有python3 和 pip 的機子上,安裝jieba庫很簡單,使用pip即可:
pip install jieba
- 1
jieba分詞特性
支援三種分詞模式:
- 精確模式,試圖將句子最精確地切開,適合文字分析;
- 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
- 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。
支援繁體分詞
- 支援自定義詞典
- MIT 授權協議
主要功能
分詞
- jieba.cut : 方法接受三個輸入引數: 需要分詞的字串;cut_all 引數用來控制是否採用全模式;HMM 引數用來控制是否使用 HMM 模型
- jieba.cut_for_search : 方法接受兩個引數:需要分詞的字串;是否使用 HMM 模型。該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細
- 待分詞的字串可以是 unicode 或 UTF-8 字串、GBK 字串。注意:不建議直接輸入 GBK 字串,可能無法預料地錯誤解碼成 UTF-8
- 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
seg_list = jieba.cut("我來到北京清華大學", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精確模式
seg_list = jieba.cut("他來到了網易杭研大廈") # 預設是精確模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造") # 搜尋引擎模式
print(", ".join(seg_list))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學
【精確模式】: 我/ 來到/ 北京/ 清華大學
【新詞識別】:他, 來到, 了, 網易, 杭研, 大廈 (此處,“杭研”並沒有在詞典中,但是也被Viterbi演算法識別出來了)
【搜尋引擎模式】: 小明, 碩士, 畢業, 於, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 後, 在, 日本, 京都, 大學, 日本京都大學, 深造
關鍵詞提取
基於 TF-IDF(term frequency–inverse document frequency) 演算法的關鍵詞抽取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence :為待提取的文字
- topK: 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
- withWeight : 為是否一併返回關鍵詞權重值,預設值為 False
- allowPOS : 僅包括指定詞性的詞,預設值為空,即不篩選
# 基於TF-IDF演算法的關鍵詞抽取
import jieba
import jieba.analyse
sentence = '全國港澳研究會會長徐澤在會上發言指出,學習系列重要講話要深刻領會 主席關於香港迴歸後的憲制基礎和憲制秩序的論述,這是過去20年特別是中共十八大以來"一國兩制"在香港實踐取得成功的根本經驗。首先,要在夯實 香港的憲制基礎、鞏固香港的憲制秩序上著力。只有牢牢確立起"一國兩制"的憲制秩序,才能保證"一國兩制"實踐不走樣 、不變形。其次,要在完善基本法實施的制度和機制上用功。中央直接行使的權力和特區高度自治權的結合是特區憲制秩 序不可或缺的兩個方面,同時必須切實建立以行政長官為核心的行政主導體制。第三,要切實加強香港社會特別是針對公 職人員和青少年的憲法、基本法宣傳,牢固樹立"一國"意識,堅守"一國"原則。第四,要努力在全社會形成聚焦發展、抵 制泛政治化的氛圍和勢能,全面準確理解和落實基本法有關經濟事務的規定,使香港繼續在國家發展中發揮獨特作用並由 此讓最廣大民眾獲得更實在的利益。'
keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n','nr','ns'))
# print(type(keywords))
# <class 'list'>
for item in keywords:
print(item[0],item[1])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
執行結果:
基於 TextRank 演算法的關鍵詞抽取
- jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,介面相同,注意預設過濾詞性。
- jieba.analyse.TextRank() 新建自定義 TextRank 例項
基本思想:
- 將待抽取關鍵詞的文字進行分詞
- 以固定視窗大小(預設為5,通過span屬性調整),詞之間的共現關係,構建圖
- 計算圖中節點的PageRank,注意是無向帶權圖
# 基於TextRank演算法的關鍵詞抽取
keywords = jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('n','nr','ns'))
# type(keywords)
# <class 'list'>
for item in keywords:
print(item[0],item[1])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
執行結果:
詞性標註
- jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 引數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為預設詞性標註分詞器。
- 標註句子分詞後每個詞的詞性,採用和 ictclas 相容的標記法。
# 官方例程
import jieba.posseg as pseg
words = pseg.cut("我愛北京天安門")
# words類別為:generator
for word, flag in words:
print('%s %s' % (word, flag))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
執行結果:
我 r
愛 v
北京 ns
天安門 ns
詞性對照表
- 名詞 (1個一類,7個二類,5個三類)
名詞分為以下子類:
n 名詞
nr 人名
nr1 漢語姓氏
nr2 漢語名字
nrj 日語人名
nrf 音譯人名
ns 地名
nsf 音譯地名
nt 機構團體名
nz 其它專名
nl 名詞性慣用語
ng 名詞性語素 - 時間詞(1個一類,1個二類)
t 時間詞
tg 時間詞性語素 - 處所詞(1個一類)
s 處所詞 - 方位詞(1個一類)
f 方位詞 - 動詞(1個一類,9個二類)
v 動詞
vd 副動詞
vn 名動詞
vshi 動詞“是”
vyou 動詞“有”
vf 趨向動詞
vx 形式動詞
vi 不及物動詞(內動詞)
vl 動詞性慣用語
vg 動詞性語素 - 形容詞(1個一類,4個二類)
a 形容詞
ad 副形詞
an 名形詞
ag 形容詞性語素
al 形容詞性慣用語 - 區別詞(1個一類,2個二類)
b 區別詞
bl 區別詞性慣用語 - 狀態詞(1個一類)
z 狀態詞 - 代詞(1個一類,4個二類,6個三類)
r 代詞
rr 人稱代詞
rz 指示代詞
rzt 時間指示代詞
rzs 處所指示代詞
rzv 謂詞性指示代詞
ry 疑問代詞
ryt 時間疑問代詞
rys 處所疑問代詞
ryv 謂詞性疑問代詞
rg 代詞性語素 - 數詞(1個一類,1個二類)
m 數詞
mq 數量詞 - 量詞(1個一類,2個二類)
q 量詞
qv 動量詞
qt 時量詞 - 副詞(1個一類)
d 副詞 - 介詞(1個一類,2個二類)
p 介詞
pba 介詞“把”
pbei 介詞“被” - 連詞(1個一類,1個二類)
c 連詞
cc 並列連詞 - 助詞(1個一類,15個二類)
u 助詞
uzhe 著
ule 了 嘍
uguo 過
ude1 的 底
ude2 地
ude3 得
usuo 所
udeng 等 等等 云云
uyy 一樣 一般 似的 般
udh 的話
uls 來講 來說 而言 說來
uzhi 之
ulian 連 (“連小學生都會”) - 嘆詞(1個一類)
e 嘆詞 - 語氣詞(1個一類)
y 語氣詞(delete yg) - 擬聲詞(1個一類)
o 擬聲詞 - 字首(1個一類)
h 字首 - 字尾(1個一類)
k 字尾 - 字串(1個一類,2個二類)
x 字串
xx 非語素字
xu 網址URL - 標點符號(1個一類,16個二類)
w 標點符號
wkz 左括號,全形:( 〔 [ { 《 【 〖 〈 半形:( [ { <
wky 右括號,全形:) 〕 ] } 》 】 〗 〉 半形: ) ] { >
wyz 左引號,全形:“ ‘ 『
wyy 右引號,全形:” ’ 』
wj 句號,全形:。
ww 問號,全形:? 半形:?
wt 歎號,全形:! 半形:!
wd 逗號,全形:, 半形:,
wf 分號,全形:; 半形: ;
wn 頓號,全形:、
wm 冒號,全形:: 半形: :
ws 省略號,全形:…… …
wp 破折號,全形:—— -- ——- 半形:— —-
wb 百分號千分號,全形:% ‰ 半形:%
wh 單位符號,全形:¥ $ £ ° ℃ 半形:$
轉自https://blog.csdn.net/sinat_34022298/article/details/75943272 侵請聯刪