TF-IDF介紹
TF-IDF(Term Frequency–Inverse Document Frequency)是一種用于資訊檢索與文本挖掘的常用加權(quán)技術(shù)。TF-IDF是一種統(tǒng)計方法,用以評估一個字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。TF-IDF加權(quán)的各種形式常被搜索引擎應用,作為文件與用戶查詢之間相關(guān)程度的度量或評級。
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。TF-IDF實際上是:TF * IDF
詞頻(Term Frequency,TF)
指的是某一個給定的詞語在該文件中出現(xiàn)的頻率。即詞w在文檔d中出現(xiàn)的次數(shù)count(w, d)和文檔d中總詞數(shù)size(d)的比值。
tf(w,d) = count(w, d) / size(d)
這個數(shù)字是對詞數(shù)(term count)的歸一化,以防止它偏向長的文件。(同一個詞語在長文件里可能會比短文件有更高的詞數(shù),而不管該詞語重要與否。)
逆向文件頻率(Inverse Document Frequency,IDF)
是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目,再將得到的商取對數(shù)得到。即文檔總數(shù)n與詞w所出現(xiàn)文件數(shù)docs(w, D)比值的對數(shù)。
idf(w) = log(n / docs(w, D))
上面的IDF公式已經(jīng)可以使用了,但是在一些特殊的情況會有一些小問題,比如某一個生僻詞在語料庫中沒有,這樣我們的分母為0, IDF沒有意義了。所以常用的IDF我們需要做一些平滑,使語料庫中沒有出現(xiàn)的詞也可以得到一個合適的IDF值。平滑的方法有很多種,最常見的IDF平滑后的公式之一為:
idf(w) = log[(n+1)/(docs(w,D)+1)] + 1
TF-IDF定義
TF-IDF(x) = TF(x)*IDF(x)
# 其中TF(x)指詞x在當前文本中的詞頻。
用sklearn進行TF-IDF處理
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
corpus=["I come to China to travel",
"This is a car polupar in China",
"I love tea and Apple ",
"The work is to write some papers in science"]
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
print(tfidf)
##############
# 得到語料庫所有不重復的詞
print(vectorizer.get_feature_names())
# 得到每個單詞對應的id值
print(vectorizer.vocabulary_)
# 得到每個句子所對應的向量
# 向量里數(shù)字的順序是按照詞語的id順序來的
print(tfidf.toarray())
# 注意一下
print(transformer)
#結(jié)果是: TfidfTransformer(norm='l2', smooth_idf=True, sublinear_tf=False, use_idf=True)

另一種寫法:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)
print(re)