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]]