繁体   English   中英

从sklearn TfidfVectorizer解释TF-IDF分数

[英]interpret TF-IDF scores from sklearn TfidfVectorizer

我正在努力想弄清楚如何解释和调和来自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。 我的问题是如何计算第一行中“狗”的0.433067号码?

您对tf-idf理解与sklearn实现不同。

根据文档 ,有三件事会导致您得到不同的结果:

  1. 术语频率计算为给定文档中术语的原始计数

  2. 平滑应用于IDF值

  3. 执行标准化

要重新审视您的示例,我们首先以这种方式修改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.2876821 + 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM