使用tf-idf-Python

时间:2019-10-23 18:49:21

标签: python machine-learning tf-idf cosine-similarity tfidfvectorizer

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

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

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 here所述, TfidfVectorizer 产生归一化向量;因此linear_kernel结果可以用作余弦相似度。

cosine_sim_content = linear_kernel(tfidf_matrix_content, tfidf_matrix_content)


这就是我的困惑所在。

有效地,两个向量之间的余弦相似度是:

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

线性内核按照here

计算InnerProduct

Linear Kernel Formulae

所以问题是:

  1. 为什么我不将内积与矢量幅值的积相除?

  2. 为什么规范化使我免除此要求?

  3. 现在,如果我想计算ts-ss相似度,是否仍可以使用 标准化tf-idf矩阵余弦值(由 仅线性核)?

1 个答案:

答案 0 :(得分:0)

感谢@timleathart的回答here,我终于知道了原因。

归一化向量的大小为1,因此是否明确除以大小并不重要。这两种方法在数学上都是等效的。

tf-idf矢量化器对各个行(矢量)进行归一化,使其长度均为1。由于余弦相似度仅与角度有关,因此矢量的大小差异无关紧要。

使用ts-ss的主要原因是要同时考虑矢量的角度和大小差异。因此,即使使用归一化向量也没有错;但是,这超出了使用“三角形相似性”组件的全部目的。