我正在努力弄清楚如何解释和调和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)

如果我在第一句话中手动计算“ dog”的TF-IDF,我将计算TF 1/5 = 0.2,因为“ dog”是5个单词中的一个。然后,我将计算“狗”的IDF:它出现在3个句子中的2个中log(3/2)= 0.176。
然后乘以0.2 * 0.176 = 0.0352。
我的问题是第一行中“ dog”的0.433067数字是如何计算的?

最佳答案

您对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

关于python - 从sklearn TfidfVectorizer解释TF-IDF分数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55292533/

10-12 21:40