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

时间:2016-10-06 14:18:29

标签: python scikit-learn tf-idf

如果我有两个包含相同单词的句子,并且这个单词在两个句子中都显示相同的计数(频率),那么为什么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)

然后我用他们的IDFs分数打印这些功能:

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

获得

  

[(u' black',1.4054651081081644),(u' jumper',1.4054651081081644),(u' knit',1.0),(u'毛衣&# 39;,1.4054651081081644)]

所以我们可以看到所有令牌都具有相同的IDF,除了' knit'都是合法的。

如果我现在要求打印计数矩阵和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得分将是术语频率的倍数(无论从计数/原始频率计算得出)和IDF,但我看到'编织'尽管频率相同,但在两个句子中得分不同。

那么我错过了什么/误会?

1 个答案:

答案 0 :(得分:0)

原因是,在进行了一些挖掘后,在TfIdfTransformer的默认配置中,得分在每个行的末尾以L2范数标准化。

事实上,kwarg normmoment.js中的文档,但在阅读时我并没有正确理解正常化的内容,也许还有一些单词会有所帮助。

报告了docs的逐步说明。