sklearn 中来自 TfIdfTransformer 的 TF-IDF 分数在相同频率的两个句子中的相同单词

TF-IDF score from TfIdfTransformer in sklearn on same word in two sentences with same frequency

如果我有两个句子包含同一个词,并且这个词在两​​个句子中出现的次数(频率)相同,为什么我得到的 Tf-Idf 分数不同?

考虑这个文本列表:

data = [
    'Jumper in knit.',
    'A sweater in knit, black sweater.',
]

并考虑我在其上安装和转换 CountVectorizerTfIdfTransformer,如

count_vec = CountVectorizer(stop_words='english')
tf_transformer = TfidfTransformer(use_idf=True)

X_counts = count_vec.fit_transform(x_data_manual)
X_tfidf = tf_transformer.fit_transform(X_counts)

然后我打印特征及其 IDF 分数:

print zip(count_vec.get_feature_names(), tf_transformer.idf_)

获得

[(u'black', 1.4054651081081644), (u'jumper', 1.4054651081081644), (u'knit', 1.0), (u'sweater', 1.4054651081081644)]

所以我们可以看到除了'knit'之外所有的代币都有相同的IDF,都是合法的。

如果我现在要求打印计数矩阵和 TF-IDF 矩阵,

print X_counts.todense()
print X_tfidf.todense()

我得到的分别是

[[0 1 1 0]
[1 0 1 2]]

(这是合法的),

[[ 0. 0.815 0.58 0. ]

[ 0.426 0. 0.303 0.852]]

现在,我认为 TF-IDF 分数将是词频(但是根据 count/raw 频率计算)和 IDF 的乘积,但我看到 'knit'尽管频率相同,但两个句子中的得分不同。

那我是什么missing/misunderstanding?

原因是,经过更多的挖掘,在 TfIdfTransformer 的默认配置中,分数在最后以 L2 范数归一化,每行。

事实上,kwarg normdocs 中的文档,但在阅读时我没有正确理解正在规范化的内容,也许多说几句会有帮助。

报告了一步一步的解释 here