我一直在努力确定一组文件之间的相似性,我正在使用的方法之一就是与TF-IDF结果的余弦相似性。
我尝试使用sklearn和gensim的实现,这给我类似的结果,但我自己的实现产生了不同的矩阵。
经过分析,我注意到他们的实现与我研究过的实现不同:
Sklearn和gensim使用原始计数作为TF,并应用L2规范 在得到的向量上。
另一方面,我发现的实现将规范化术语计数, 像
TF = term count / sum of all term counts in the document
我的问题是,他们的实施有什么不同?他们最终会为了聚类或其他目的而提供更好的结果吗?
编辑(所以问题更清楚): 规范化最终结果与规范化开始时的术语计数有什么区别?
答案 0 :(得分:1)
我最终理解为什么在tf-idf计算结束时进行归一化而不是在术语频率上进行归一化。
搜索后,我注意到他们使用L2归一化来促进余弦相似度计算。
因此,我们可以直接使用dot(vector1, vector2) / (norm(vector1) * norm(vector2))
函数的结果:fit_transform
,而不是使用公式tfidf * tfidf.T
来获得2个向量之间的相似性,而无需进行标准化,因为向量的范数已经是1。
我尝试在术语频率上添加标准化,但是在对整个向量进行标准化时最终会给出相同的结果,最终浪费时间。
答案 1 :(得分:0)
使用scikit-learn,您可以通过将TfidfTransformer()
设置为norm
,l1
或l2
来调用none
时根据需要设置规范化。
如果您使用none
尝试此操作,您可能会得到与您自己的手动tf-idf实现类似的结果。
标准化通常用于减少文档长度对特定tf-idf加权的影响,以便出现在短文档中的单词与更长文档中出现的单词更平等对待。