1. TF-IDF概述
TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與文本挖掘的常用加權技術。TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜索引擎應用,作為文件與用戶查詢之間相關程度的度量或評級。除了TF-IDF以外,互聯網上的搜索引擎還會使用基於連結分析的評級方法,以確定文件在搜尋結果中出現的順序。
(1)TF
TF: Term Frequency, 用於衡量一個詞在一個文件中的出現頻率。因為每個文檔的長度的差別可以很大,因而一個詞在某個文檔中出現的次數可能遠遠大於另一個文檔,所以詞頻通常就是一個詞出現的次數除以文檔的總長度,相當於是做了一次歸一化。
TF(t) = (詞t在文檔中出現的總次數) / (文檔的詞總數).
(2)IDF
IDF: 逆向文件頻率,用於衡量一個詞的重要性。計算詞頻TF的時候,所有的詞語都被當做一樣重要的,但是某些詞,比如”is”, “of”, “that”很可能出現很多很多次,但是可能根本並不重要,因此我們需要減輕在多個文檔中都頻繁出現的詞的權重。
ID(t) = log(總文檔數/詞t出現的文檔數)
TF-IDF:上面兩個乘起來,就是TF-IDF TF-IDF = TF * IDF
sklearn.feature_extraction.text.TfidfVectorizer:可以把一大堆文檔轉換成TF-IDF特征的矩陣。
Convert a collection of raw documents to a matrix of TF-IDF features.
Equivalent to CountVectorizer followed by TfidfTransformer.
舉例:
# 初始化TfidfVectorizer
vectorizer = TfidfVectorizer(tokenizer=tok,stop_words=stop_words)
labels = list()
# 特征提取
data = vectorizer.fit_transform(load_data(labels))
# 初始化LogisticRegression模型
log_reg= LogisticRegression(class_weight="balanced")
# 訓練模型
log_reg.fit(data, numpy.asarray(labels))
# 根據輸入預測
log_reg.predict_proba(input)
2.文本特征提取:
將文本數據轉化成特征向量的過程,比較常用的文本特征表示法為詞袋法
詞袋法: 不考慮詞語出現的順序,每個出現過的詞匯單獨作為一列特征 這些不重復的特征詞匯集合為詞表 每一個文本都可以在很長的詞表上統計出一個很多列的特征向量 如果每個文本都出現的詞匯,一般被標記為 停用詞 不計入特征向量
3.TF-IDF的預處理
在scikit-learn中,有兩種方法進行TF-IDF的預處理。
第一種方法是在用CountVectorizer類向量化之后再調用TfidfTransformer類進行預處理。
CountVectorizer:只考慮詞匯在文本中出現的頻率
TfidfVectorizer:除了考量某詞匯在文本出現的頻率,還關注包含這個詞匯的所有文本的數量,能夠削減高頻沒有意義的詞匯出現帶來的影響, 挖掘更有意義的特征
(1)CountVectorizer
CountVectorizer單獨求詞頻
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(type(X))
print(vectorizer.get_feature_names())
![]()
print(X.toarray())

X的第一行5個1顯示了corpus的第一行數據在排列中的相應位置,數字表示出現的次數。
CountVectorizer和TfidfTransformer搭配計算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)

tfidf結果如下:

(2)TfidfVectorizer
第二種方法是直接用TfidfVectorizer完成向量化與TF-IDF預處理。
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)
print(re)
由於第二種方法比較的簡潔,因此在實際應用中推薦使用,一步到位完成向量化,TF-IDF與標准化。

4. TF-IDF小結
TF-IDF是非常常用的文本挖掘預處理基本步驟,但是如果預處理中使用了Hash Trick,則一般就無法使用TF-IDF了,因為Hash Trick后我們已經無法得到哈希后的各特征的IDF的值。使用了TF-IDF並標准化以后,我們就可以使用各個文本的詞特征向量作為文本的特征,進行分類或者聚類分析。當然TF-IDF不光可以用於文本挖掘,在信息檢索等很多領域都有使用。因此值得好好的理解這個方法的思想。
參考文獻:
