在 Python 中使用 TF-IDF 的文本文档之间的 TS-SS 和余弦相似度

数据挖掘 scikit-学习 推荐系统 信息检索 tfidf 类似文件
2021-10-03 16:20:25

计算基于文本的文档之间的余弦相似度的常用方法是计算 tf-idf,然后计算 tf-idf 矩阵的线性核。

TF-IDF 矩阵使用 TfidfVectorizer() 计算。

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix_content = tfidf.fit_transform(article_master['stemmed_content'])

这里的article_master是一个包含所有文档的文本内容的数据框。
正如 Chris Clark在这里所解释的,TfidfVectorizer生成归一化向量;因此,linear_kernel 结果可以用作余弦相似度。

cosine_sim_content = linear_kernel(tfidf_matrix_content, tfidf_matrix_content)


这就是我的困惑所在。

实际上,两个向量之间的余弦相似度为:

InnerProduct(vec1,vec2) / (VectorSize(vec1) * VectorSize(vec2))

线性内核计算 InnerProduct 如此处所述

线性核公式

所以问题是:

  1. 为什么我不将内积与向量大小的乘积相除?

  2. 为什么规范化免除了我的这个要求?

  3. 现在如果我想计算 ts-ss 相似度,我还能使用归一化的 tf-idf 矩阵余弦值(仅由线性核计算)吗?

1个回答

归一化向量的幅度为 1,因此是否明确除以幅度并不重要。无论哪种方式,它在数学上都是等价的。

我认为没有理由不能在 TS-SS 中使用归一化向量,但似乎首先使用 TS-SS 的主要动机是它对可能具有不同大小的向量更有意义。对于您的问题,我会同时尝试余弦相似度和 TS-SS,看看是否存在明显的性能差异。