3.TF-IDF算法介绍、应用、NLTK实现TF-IDF算法、Sklearn实现TF-IDF算法、算法的不足、算法改进
3.TF-IDF
3.1.TF-IDF算法介紹
3.2.TF-IDF應用
3.3.NLTK實現TF-IDF算法
3.4.Sklearn實現TF-IDF算法
3.5.Jieba實現TF-IDF算法
3.6.TF-IDF算法的不足
3.7.TF-IDF算法改進—TF-IWF算法
3.TF-IDF
以下轉自:https://blog.csdn.net/asialee_bird/article/details/81486700
3.1.TF-IDF算法介紹
TF-IDF(term frequency–inverse document frequency,詞頻-逆向文件頻率)是一種用于信息檢索(information retrieval)與文本挖掘(text mining)的常用加權技術。
TF-IDF是一種統計方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。
TF-IDF的主要思想是:如果某個單詞在一篇文章中出現的頻率TF高,并且在其它文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
(1)TF是詞頻(Term Frequency)
詞頻(TF)表示詞條(關鍵字)在文本中出現的頻率。
這個數字通常會被歸一化(一般是詞除以文章總詞數),以防止它偏向長的文件。
其中ni,j是該詞在文件dj中出現的次數,分母則是文件dj中所有詞匯出現的次數總和;
(2)IDF是逆向文件頻率(Inverse Document Frequency)
逆向文件頻率(IDF):某一特定詞語的IDF,可以由總文件數目除以包含該詞語的文件的數目,再將得到的商取對數得到。
如果包含詞條t的文檔越少,IDF越大,則說明詞條具有很好的類別區分能力。
其中,|D|是語料庫中的文件總和。 |{j:ti∈dj}|表示包含詞語ti的文件數目(即ni,j≠0的文件數目)。如果該詞語不在語料庫中,就會導致分母為零,因此一般情況下使用 1+|{j:ti∈dj}|
其中,|D| 是語料庫中的文件總數。 |{j:ti∈dj}| 表示包含詞語 ti 的文件數目(即 ni,j≠0 的文件數目)。如果該詞語不在語料庫中,就會導致分母為零,因此一般情況下使用 1+|{j:ti∈dj}|
即:
(3)TF-IDF實際上是:TF*IDF
某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產生出高權重的TF-IDF。因此,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。
公式:
注:TF-IDF算法非常容易理解,并且很容易實現,但是其簡單結構并沒有考慮詞語的語義信息,無法處理一詞多義與一義多詞的情況。
3.2.TF-IDF應用
(1)搜索引擎;(2)關鍵詞提取;(3)文本相似性;(4)文本摘要
3.3.NLTK實現TF-IDF算法
from nltk.text import TextCollection from nltk.tokenize import word_tokenize# 首先,構建語料庫corpus sents = ['this is sentence one', 'this is sentence two', 'this is sentence three'] sents = [word_tokenize(sent) for sent in sents] # 對每個句子進行分詞 print(sents) # 輸出分詞后的結果 ''' 輸出結果: [['this', 'is', 'sentence', 'one'], ['this', 'is', 'sentence', 'two'], ['this', 'is', 'sentence', 'three']] '''corpus = TextCollection(sents) # 構建語料庫 print(corpus) # 輸出分詞后的結果 ''' 輸出結果: <Text: this is sentence one this is sentence two...> '''# 計算語料庫中"one"的tf值 tf = corpus.tf('one', corpus) # 結果為: 1/12 print(tf) ''' 輸出結果: 0.08333333333333333 '''# 計算語料庫中"one"的idf值 idf = corpus.idf('one') # log(3/1) print(idf) """ 輸出結果: 1.0986122886681098 """# 計算語料庫中"one"的tf-idf值 tf_idf = corpus.tf_idf('one', corpus) print(tf_idf) ''' 輸出結果: 0.0915510240556758 '''3.4.Sklearn實現TF-IDF算法
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformerx_train = ['TF-IDF 主要 思想 是', '算法 一個 重要 特點 可以 脫離 語料庫 背景','如果 一個 網頁 被 很多 其他 網頁 鏈接 說明 網頁 重要'] x_test = ['原始 文本 進行 標記', '主要 思想']# 該類會將文本中的詞語轉換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文本下的詞頻 vectorizer = CountVectorizer(max_features=10) # 該類會統計每個詞語的tf-idf權值 tf_idf_transformer = TfidfTransformer() # 將文本轉為詞頻矩陣并計算tf-idf tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train)) print("--------------------------tf_idf-------------------------------") print(tf_idf) print('--------------------------x_train_weight-----------------------') # 將tf-idf矩陣抽取出來,元素a[i][j]表示j詞在i類文本中的tf-idf權重 x_train_weight = tf_idf.toarray() print(x_train_weight) print("---------------------------------------------------------------")# 對測試集進行tf-idf權重計算 tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test)) x_test_weight = tf_idf.toarray() # 測試集TF-IDF權重矩陣print('輸出x_train文本向量:') print(x_train_weight) print('輸出x_test文本向量:') print(x_test_weight)輸出結果:
--------------------------tf_idf-------------------------------(0, 2) 0.7071067811865476(0, 0) 0.7071067811865476(1, 9) 0.3349067026613031(1, 7) 0.4403620672313486(1, 6) 0.4403620672313486(1, 5) 0.4403620672313486(1, 3) 0.4403620672313486(1, 1) 0.3349067026613031(2, 9) 0.22769009319862868(2, 8) 0.29938511033757165(2, 4) 0.8981553310127149(2, 1) 0.22769009319862868 --------------------------x_train_weight----------------------- [[0.70710678 0. 0.70710678 0. 0. 0.0. 0. 0. 0. ][0. 0.3349067 0. 0.44036207 0. 0.440362070.44036207 0.44036207 0. 0.3349067 ][0. 0.22769009 0. 0. 0.89815533 0.0. 0. 0.29938511 0.22769009]] --------------------------------------------------------------- 輸出x_train文本向量: [[0.70710678 0. 0.70710678 0. 0. 0.0. 0. 0. 0. ][0. 0.3349067 0. 0.44036207 0. 0.440362070.44036207 0.44036207 0. 0.3349067 ][0. 0.22769009 0. 0. 0.89815533 0.0. 0. 0.29938511 0.22769009]] 輸出x_test文本向量: [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.][0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]3.5.Jieba實現TF-IDF算法
import jieba.analysetext='關鍵詞是能夠表達文檔中心內容的詞語,常用于計算機系統標引論文內容特征、信息檢索、系統匯集以供讀者檢閱。關鍵詞提取是文本挖掘領域的一個分支,是文本檢索、文檔比較、摘要生成、文檔分類和聚類等文本挖掘研究的基礎性工作'keywords=jieba.analyse.extract_tags(text, topK=20, withWeight=False, allowPOS=()) print(keywords)注:
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 為待提取的文本。
- topK 為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20
- withWeight為是否一并返回關鍵詞權重值,默認值為False
- allowPOS僅包括指定詞性的詞,默認為空,即不篩選
3.6.TF-IDF算法的不足
TF-IDF 采用文本逆頻率 IDF 對 TF 值加權取權值大的作為關鍵詞,但 IDF 的簡單結構并不能有效地反映單詞的重要程度和特征詞的分布情況,使其無法很好地完成對權值調整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是當文本集已經分類的情況下。
在本質上 IDF 是一種試圖抑制噪音的加權,并且單純地認為文本頻率小的單詞就越重要,文本頻率大的單詞就越無用。這對于大部分文本信息,并不是完全正確的。IDF 的簡單結構并不能使提取的關鍵詞, 十分有效地反映單詞的重要程度和特征詞的分布情 況,使其無法很好地完成對權值調整的功能。尤其是在同類語料庫中,這一方法有很大弊端,往往一些同類文本的關鍵詞被蓋。
TF-IDF算法實現簡單快速,但是仍有許多不足之處:
(1)沒有考慮特征詞的位置因素對文本的區分度,詞條出現在文檔的不同位置時,對區分度的貢獻大小是不一樣的。
(2)按照傳統TF-IDF,往往一些生僻詞的IDF(反文檔頻率)會比較高、因此這些生僻詞常會被誤認為是文檔關鍵詞。
(3)傳統TF-IDF中的IDF部分只考慮了特征詞與它出現的文本數之間的關系,而忽略了特征項在一個類別中不同的類別間的分布情況。
(4)對于文檔中出現次數較少的重要人名、地名信息提取效果不佳。
3.7.TF-IDF算法改進—TF-IWF算法
https://pdf.hanspub.org//CSA20130100000_81882762.pdf
總結
以上是生活随笔為你收集整理的3.TF-IDF算法介绍、应用、NLTK实现TF-IDF算法、Sklearn实现TF-IDF算法、算法的不足、算法改进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超市内可以蒸包子吗
- 下一篇: 加盟一个咖啡之翼一年能挣多少钱?