计算基于文本的文档之间的余弦相似度的一种常用方法是计算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 here所述,TfidfVectorizer产生归一化向量。因此linear_kernel结果可以用作余弦相似度。
cosine_sim_content = linear_kernel(tfidf_matrix_content, tfidf_matrix_content)
这就是我的困惑所在。
有效地,两个向量之间的余弦相似度为:
InnerProduct(vec1,vec2) / (VectorSize(vec1) * VectorSize(vec2))
线性内核按here所述计算InnerProduct
所以问题是:
为什么不将内积与向量的乘积相除?
为什么规范化使我免除此要求?
现在,如果我想计算ts-ss相似度,我是否仍可以使用
归一化的tf-idf矩阵和余弦值(通过
仅线性核)?
最佳答案
感谢@timleathart的回答here我终于知道了原因。
归一化向量的大小为1,因此是否明确除以大小并不重要。这两种方法在数学上都是等效的。
tf-idf矢量化器对各个行(矢量)进行归一化,以使它们的长度均为1。由于余弦相似度仅与角度有关,因此矢量的大小差异无关紧要。
使用ts-ss的主要原因是要同时考虑角度和矢量大小的差异。因此,即使使用归一化向量没有错;但是,这超出了使用“三角形相似性”组件的全部目的。