TF-IDF介紹
TF-IDF(Term Frequency–Inverse Document Frequency)是一種用于資訊檢索與文本挖掘的常用加權(quán)技術(shù)。TF-IDF是一種統(tǒng)計(jì)方法匈挖,用以評(píng)估一個(gè)字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度苍鲜。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加思灰,但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降。TF-IDF加權(quán)的各種形式常被搜索引擎應(yīng)用混滔,作為文件與用戶查詢之間相關(guān)程度的度量或評(píng)級(jí)官辈。
TF-IDF的主要思想是:如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn)遍坟,則認(rèn)為此詞或者短語(yǔ)具有很好的類別區(qū)分能力拳亿,適合用來(lái)分類。TF-IDF實(shí)際上是:TF * IDF
詞頻(Term Frequency愿伴,TF)
指的是某一個(gè)給定的詞語(yǔ)在該文件中出現(xiàn)的頻率肺魁。即詞w在文檔d中出現(xiàn)的次數(shù)count(w, d)和文檔d中總詞數(shù)size(d)的比值。
tf(w,d) = count(w, d) / size(d)
這個(gè)數(shù)字是對(duì)詞數(shù)(term count)的歸一化隔节,以防止它偏向長(zhǎng)的文件鹅经。(同一個(gè)詞語(yǔ)在長(zhǎng)文件里可能會(huì)比短文件有更高的詞數(shù),而不管該詞語(yǔ)重要與否怎诫。)
逆向文件頻率(Inverse Document Frequency瘾晃,IDF)
是一個(gè)詞語(yǔ)普遍重要性的度量。某一特定詞語(yǔ)的IDF幻妓,可以由總文件數(shù)目除以包含該詞語(yǔ)之文件的數(shù)目蹦误,再將得到的商取對(duì)數(shù)得到。即文檔總數(shù)n與詞w所出現(xiàn)文件數(shù)docs(w, D)比值的對(duì)數(shù)。
idf(w) = log(n / docs(w, D))
上面的IDF公式已經(jīng)可以使用了强胰,但是在一些特殊的情況會(huì)有一些小問(wèn)題舱沧,比如某一個(gè)生僻詞在語(yǔ)料庫(kù)中沒(méi)有,這樣我們的分母為0偶洋, IDF沒(méi)有意義了熟吏。所以常用的IDF我們需要做一些平滑,使語(yǔ)料庫(kù)中沒(méi)有出現(xiàn)的詞也可以得到一個(gè)合適的IDF值玄窝。平滑的方法有很多種牵寺,最常見(jiàn)的IDF平滑后的公式之一為:
idf(w) = log[(n+1)/(docs(w,D)+1)] + 1
TF-IDF定義
TF-IDF(x) = TF(x)*IDF(x)
# 其中TF(x)指詞x在當(dāng)前文本中的詞頻。
用sklearn進(jìn)行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)
##############
# 得到語(yǔ)料庫(kù)所有不重復(fù)的詞
print(vectorizer.get_feature_names())
# 得到每個(gè)單詞對(duì)應(yīng)的id值
print(vectorizer.vocabulary_)
# 得到每個(gè)句子所對(duì)應(yīng)的向量
# 向量里數(shù)字的順序是按照詞語(yǔ)的id順序來(lái)的
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)