TF-IDF,即“詞頻-逆文本頻率”。它由兩部分組成,TF和IDF。
TF就是詞頻,我們之前做的向量化也就是做了文本中各個詞的出現頻率統計,並作爲文本特徵。
IDF反應了一個詞在所有文本中出現的頻率,如果一個詞在很多的文本中出現,那麼它的IDF值應該低。而反過來如果一個詞在比較少的文本中出現,那麼它的IDF值應該高,比如一些專業的名詞如“Machine Learning”,這樣的詞IDF值應該高。一個極端的情況,如果一個詞在所有的文本中都出現,那麼它的IDF值應該爲0。
這裏直接給出一個詞xx的IDF的基本公式如下:
其中,N代表語料庫中文本的總數,而N(x)代表語料庫中包含詞x的文本總數。
上面的IDF公式已經可以使用了,但是在一些特殊的情況會有一些小問題,比如某一個生僻詞在語料庫中沒有,這樣我們的分母爲0, IDF沒有意義了。所以常用的IDF我們需要做一些平滑,使語料庫中沒有出現的詞也可以得到一個合適的IDF值。平滑的方法有很多種,最常見的IDF平滑後的公式之一爲:
代碼:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
train = pd.read_csv('./data/train_set.csv', nrows=1000, index_col=None)
tfidf_model = TfidfVectorizer(max_features=10, min_df=1).fit_transform(train['article'])
print(tfidf_model.todense())
輸出:
[[0.81094896 0.03069051 0.10402692 ... 0.30445217 0.20972818 0.25778147]
[0.55069662 0.1056866 0.24308439 ... 0.49144636 0.1564821 0.50241498]
[0.60866709 0.11133641 0.14187214 ... 0.15113737 0.45383072 0.45390683]
...
[0.60949257 0.05016933 0.09717215 ... 0.24884174 0.24379703 0.54624834]
[0.3078827 0. 0.03272408 ... 0.15084168 0.38485338 0.52033483]
[0.58033419 0.03980768 0.07710283 ... 0.23693705 0.56219874 0.39008669]]