TF-IDF算法可用來提取文檔的關鍵詞,關鍵詞在文本聚類、文本分類、文獻檢索、自動文摘等方面有着重要應用。
算法原理
TF:Term Frequency,詞頻
IDF:Inverse Document Frequency,逆文檔頻率
詞頻(TF):某一個詞在該文件中出現的頻率
計算方法為:

逆文檔頻率(IDF):總文件數目除以包含該詞的文件數目
計算方法為:

分母加1是為了防止該詞不在語料庫中而導致被除數為零
最后,TF-IDF的計算方式為:
![]()
TF-IDF 的主要思想為:
如果某個詞在一篇文檔中出現的頻率高(即 TF 高),並且在語料庫中其他文檔中很少出現(即 IDF 高),則認為這個詞具有很好的類別區分能力
算法過程:先計算出文檔中每個詞的TF-IDF值,然后按降序排列,取排在最前面的幾個詞作為關鍵詞進行輸出
算法優點:
原理簡單,能滿足大多數實際需求
算法缺點:
- 單純以 “詞頻” 衡量一個詞的重要性,不夠全面(文檔頻率小的詞就越重要,文檔頻率大的詞就越無用,顯然這並不是完全正確的)
- TF-IDF值的計算沒有加入詞的位置信息,不夠嚴謹(出現在文檔標題、第一段、每一段的第一句話中的詞應給予較大的權重)
Python實現
jieba
jieba內置了TF-IDF算法,調用非常簡單,例:
sen = '自然語言處理是人工智能和語言學領域的分支學科,此領域探討如何處理及運用自然語言,包括多方面和步驟。'
print(' jieba extract:', jieba.analyse.extract_tags(sen, topK=topK)) # ['自然語言', '領域', '處理']
topK:返回 TF-IDF 值最大的關鍵詞個數,此處為 3
更詳細用法可參考官方文檔:https://github.com/fxsjy/jieba
sklearn
關鍵詞提取需用到 CountVectorizer 和 TfidfVectorizer,示例代碼:
corpus = [ # 語料
'自然語言處理是人工智能和語言學領域的分支學科,此領域探討如何處理及運用自然語言,包括多方面和步驟。',
'計算機視覺是一門研究如何使機器“看”的科學,用攝影機和計算機代替人眼對目標進行識別、跟蹤和測量。',
'機器學習是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。'
]
corpus = [jieba.lcut(sen) for sen in corpus]
with open('stop_words.txt', encoding='utf8') as f:
stop_words = [line.strip() for line in f.readlines()]
corpus = [' '.join(filter_stop_words(sen, stop_words)) for sen in corpus]
cvec = CountVectorizer()
cvec.fit_transform(corpus)
feature_words = cvec.get_feature_names()
feature_words = np.array(feature_words)
tvec = TfidfVectorizer()
tvec = tvec.fit_transform(corpus)
first_sen = tvec.toarray()[0]
max_indices = np.argsort(-first_sen)[:topK]
print('sklearn extract:', feature_words[max_indices]) # ['自然語言' '領域' '語言學']
完整項目地址:https://github.com/cyandn/DS/tree/master/TF-IDF
參考:
https://www.jianshu.com/p/b0ba00ccaf9c
http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
https://blog.csdn.net/Eastmount/article/details/50323063
https://blog.csdn.net/m0_37324740/article/details/79411651
