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