我正在努力弄清楚如何解释和调和sklearn TfidfVectorizer中的TF-IDF分数。 为了说明这一点,我有一个非常简单的示例:
from sklearn.feature_extraction.text import
TfidfVectorizer
data = ['dog is sitting on bed', 'cat is
sitting on sofa', 'where is that dog']
vector = TfidfVectorizer()
tfidf = vector.fit_transform(data)
df = pd.DataFrame(tfidf.toarray(), columns =
vector.get_feature_names())
df
结果是: print(df)
如果我在第一句话中手动计算“狗”的TF-IDF,我将计算TF 1/5 = 0.2,因为“狗”是5个单词中的一个。然后,我将计算“狗”的IDF:它出现在3个句子中的2个中log(3/2)= 0.176。 然后乘以0.2 * 0.176 = 0.0352。 我的问题是如何计算第一行中“ dog”的0.433067数字?
答案 0 :(得分:0)
您对tf-idf
的理解不同于sklearn
的实现。
对于documentation,三件事会导致您获得不同的结果:
术语频率是给定文档中术语的原始计数
对IDF值应用平滑处理
执行归一化
要重新查看您的示例,让我们首先以这种方式修改TfidfVectorizer
:
vector = TfidfVectorizer(norm=None)
执行fit_transform
之后,我们得到以下输出:
bed cat dog is on sitting sofa that where
0 1.693147 0.000000 1.287682 1.0 1.287682 1.287682 0.000000 0.000000 0.000000
1 0.000000 1.693147 0.000000 1.0 1.287682 1.287682 1.693147 0.000000 0.000000
2 0.000000 0.000000 1.287682 1.0 0.000000 0.000000 0.000000 1.693147 1.693147
对于第一个句子和单词dog
,术语频率为1,因为该单词出现一次。 IDF不等于log(3/2)
,而是log(4/3)
;分子和分母都加1可以防止被0除(可以通过传递smooth_idf=False
来禁用此行为)。
1 + log(4/3)
大约等于1.287682
。
然后我们执行L2归一化:
df.iloc[0] / ((df.iloc[0] ** 2).sum() ** 0.5)
我们看到与原始图像输出相同:
bed 0.569431
cat 0.000000
dog 0.433067
is 0.336315
on 0.433067
sitting 0.433067
sofa 0.000000
that 0.000000
where 0.000000
Name: 0, dtype: float64