Scikit learn Sklearn和gensim';s TF-IDF的实现

Scikit learn Sklearn和gensim';s TF-IDF的实现,scikit-learn,tf-idf,gensim,Scikit Learn,Tf Idf,Gensim,我一直在尝试确定一组文档之间的相似性,我使用的方法之一是与TF-IDF结果的余弦相似性 我尝试使用sklearn和gensim的实现,它们给了我类似的结果,但我自己的实现在一个不同的矩阵中 在分析之后,我注意到他们的实现与我所研究和遇到的不同: Sklearn和gensim使用原始计数作为TF,并应用L2范数 关于结果向量 另一方面,我发现的实现将规范化术语计数, 像 我的问题是,它们的实现有什么不同?它们最终是否会提供更好的结果,用于聚类或其他目的 编辑(以便问题更清楚): 规范化最终结果与规

我一直在尝试确定一组文档之间的相似性,我使用的方法之一是与TF-IDF结果的余弦相似性

我尝试使用sklearn和gensim的实现,它们给了我类似的结果,但我自己的实现在一个不同的矩阵中

在分析之后,我注意到他们的实现与我所研究和遇到的不同:

Sklearn和gensim使用原始计数作为TF,并应用L2范数 关于结果向量

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

我的问题是,它们的实现有什么不同?它们最终是否会提供更好的结果,用于聚类或其他目的

编辑(以便问题更清楚):
规范化最终结果与规范化查询时的术语计数之间有什么区别?

使用scikit learn,您可以在调用
TfidTransformer()
时根据需要设置规范化,方法是将
norm
设置为
l1
l2
none

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


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

我最终理解了为什么标准化是在tf idf计算结束时进行的,而不是在术语频率上进行的

在四处搜索之后,我注意到他们使用L2规范化来简化余弦相似性计算

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


我试图在术语频率上添加规范化,但在对整个向量进行规范化时,它最终给出了相同的结果,结果是浪费时间。

是的,我在检查它们的实现时已经手动得到了类似的结果。我想我的问题没有明确,我是在问最终结果的规范化和术语频率的规范化之间有什么区别,因为这两种方法都将用于抵消文档长度。
TF = term count / sum of all term counts in the document