Sklearn和gensim的TF-IDF实施

时间:2017-05-21 20:56:02

标签: scikit-learn tf-idf gensim

我一直在努力确定一组文件之间的相似性,我正在使用的方法之一就是与TF-IDF结果的余弦相似性。

我尝试使用sklearn和gensim的实现,这给我类似的结果,但我自己的实现产生了不同的矩阵。

经过分析,我注意到他们的实现与我研究过的实现不同:

Sklearn和gensim使用原始计数作为TF,并应用L2规范 在得到的向量上。

另一方面,我发现的实现将规范化术语计数, 像

TF = term count / sum of all term counts in the document

我的问题是,他们的实施有什么不同?他们最终会为了聚类或其他目的而提供更好的结果吗?

编辑(所以问题更清楚): 规范化最终结果与规范化开始时的术语计数有什么区别?

2 个答案:

答案 0 :(得分:1)

我最终理解为什么在tf-idf计算结束时进行归一化而不是在术语频率上进行归一化。

搜索后,我注意到他们使用L2归一化来促进余弦相似度计算。

因此,我们可以直接使用dot(vector1, vector2) / (norm(vector1) * norm(vector2))函数的结果:fit_transform,而不是使用公式tfidf * tfidf.T来获得2个向量之间的相似性,而无需进行标准化,因为向量的范数已经是1。

我尝试在术语频率上添加标准化,但是在对整个向量进行标准化时最终会给出相同的结果,最终浪费时间。

答案 1 :(得分:0)

使用scikit-learn,您可以通过将TfidfTransformer()设置为norml1l2来调用none时根据需要设置规范化。

如果您使用none尝试此操作,您可能会得到与您自己的手动tf-idf实现类似的结果。

标准化通常用于减少文档长度对特定tf-idf加权的影响,以便出现在短文档中的单词与更长文档中出现的单词更平等对待。