第2篇:三分鐘熱情學(xué)NLP-關(guān)鍵詞提取TF-IDF
一篇文章或1個文檔中窄陡,哪些詞對文章更重要永部?哪些詞可以作為關(guān)鍵詞?自動提取關(guān)鍵詞可以快速地從海量的信息中提取和獲取信息碱鳞,下面簡述下關(guān)鍵詞提取技術(shù)侵佃。
1麻昼、關(guān)鍵詞提取的機(jī)器學(xué)習(xí)方法
有監(jiān)督的機(jī)器學(xué)習(xí)方法:構(gòu)建1個豐富的詞表,判斷每個文檔與詞表中每個次的匹配程度馋辈,這種方法是準(zhǔn)確高抚芦;缺點是維護(hù)詞表和標(biāo)注的成本高;
無監(jiān)督的機(jī)器學(xué)習(xí)方法:2個常見算法是TF-IDF算法和TextRank算法
2、TF-IDF算法
TF-IDF詞頻-逆文檔概率叉抡,一般是指詞頻和逆文檔概率這2個度量的乘積尔崔,[參考閱讀]https://www.cntofu.com/book/85/nlp/tf-idf.md
基本理念是:
1、詞頻TF褥民。在1篇文檔中季春,1個詞出現(xiàn)次數(shù)越多,那么這個詞在這篇文章中約重要轴捎;
通俗點就是:越多越好
TF=該詞出現(xiàn)的次數(shù)/文檔中的總詞數(shù)
2鹤盒、逆文檔IDF蚕脏。在若干個文檔中侦副,1個詞,出現(xiàn)的次數(shù)較少驼鞭,那么這個詞越重要秦驯;這是衡量1個詞普遍重要的度量,或者說是衡量1個詞是否具有較好分類的1個度量挣棕。
通俗點就是:越少越好
IDF=log{文檔的個數(shù)/(該詞在多少個文檔中出現(xiàn)+1)}
舉例:
在某個語料庫中译隘,共有2000個文檔,標(biāo)記為d1洛心,d2固耘,d3……,d5000
其中d1文檔词身,共有1000個詞厅目,其中“自然語言處理”出現(xiàn)了33次;
全部5000個文檔中法严,“自然語言處理”這個詞损敷,在10個文檔中出現(xiàn)過;
則d1中的深啤,“自然語言處理的”的TF值為:33/1000=0.033拗馒;
在整個語料庫中,“自然語言處理”的IDF值就是:log(5000/11)=8.82
3溯街、TF-IDF算法實戰(zhàn)
本部分以Jieba分詞下的TF-IDF進(jìn)行實戰(zhàn)诱桂,摘選一段jieba的git上的對jieba.analyse.extract_tags的參數(shù)說明。
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 為待提取的文本
topK 為返回幾個 TF/IDF 權(quán)重最大的關(guān)鍵詞呈昔,默認(rèn)值為 20
withWeight 為是否一并返回關(guān)鍵詞權(quán)重值访诱,默認(rèn)值為 False
allowPOS 僅包括指定詞性的詞,默認(rèn)值為空韩肝,即不篩選
查看top20和top3的關(guān)鍵詞
import jieba.analyse
import math
text = '自然語言處理是計算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個重要方向,它研究能實現(xiàn)人與計算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法,自然語言處理是一門融語言學(xué)触菜、計算機(jī)科學(xué)、數(shù)學(xué)于一體的科學(xué)哀峻。'
keywords_all = jieba.analyse.extract_tags(text)
print('所有關(guān)鍵詞(默認(rèn)取top20):'+"/".join(keywords_all))
keywords_top = jieba.analyse.extract_tags(text,topK=3)
print('top3的關(guān)鍵詞:'+"/".join(keywords_top))
輸出
所有關(guān)鍵詞(默認(rèn)取top20):自然語言/計算機(jī)科學(xué)/領(lǐng)域/處理/人工智能/語言學(xué)/一體/一門/計算機(jī)/通信/數(shù)學(xué)/科學(xué)/方向/有效/理論/方法/實現(xiàn)/各種/之間/研究
top3的關(guān)鍵詞:自然語言/計算機(jī)科學(xué)/領(lǐng)域
由結(jié)果可以得出涡相,在不指定topK時哲泊,默認(rèn)取出了top20的關(guān)鍵詞;
查看下該段文本的總詞數(shù)
輸入:
print('總的詞數(shù):{}'.format(len(list(jieba.cut(text)))))
輸出
總的詞數(shù):48
返回top20關(guān)鍵詞的權(quán)重
輸入
keywords_weight = jieba.analyse.extract_tags(text,withWeight=True)
# withWeight=True催蝗,返回權(quán)重值
for item in keywords_weight:
print(item[0],item[1])
輸出
自然語言 1.1180294731285714
計算機(jī)科學(xué) 0.6969673518271428
領(lǐng)域 0.3865925387435714
處理 0.38648968981142856
人工智能 0.3377866569817857
語言學(xué) 0.31996554390607146
一體 0.2634684052082143
一門 0.2623328842917857
計算機(jī) 0.2430280153885714
通信 0.23719862585285714
數(shù)學(xué) 0.23601215985000001
科學(xué) 0.19919838444250001
方向 0.19094219187892855
有效 0.18915023044464285
理論 0.18780139184250003
方法 0.1774216082157143
實現(xiàn) 0.1670260813067857
各種 0.16528642764035714
之間 0.15934034996642857
研究 0.15441970035535715