趋近智
当项目描述通过 TF-IDF 等方法表示为数值向量时,量化它们之间的相似度就显得非常必要。在向量空间中,相似度有一个直接的几何解释:指向相似方向的向量代表内容相似的项目。余弦相似度是衡量这种关系的一种常用且有效的指标。
想象每个项目的 TF-IDF 向量都是高维空间中从原点 (0,0) 出发的箭头。两个项目之间的相似度可以通过它们各自箭头之间的夹角来确定。如果两个向量指向几乎相同的方向,它们之间的夹角就很小,表示相似度很高。如果它们指向完全不同的方向,夹角就很大,表示相似度很低。
余弦相似度通过计算两个向量之间夹角的余弦值来捕捉这种关系。它不关注向量的大小(或长度),只关注它们的方向。在处理文本数据时,这是一个很有用的特性。例如,一个篇幅较长的电影简介和一个较短的简介可能都在讲述同一个主题。它们的 TF-IDF 向量大小不同,但它们在向量空间中会指向相似的方向。通过忽略大小,余弦相似度能够准确地将它们识别为相似项目。
该图示展示了三个项目向量。项目 A 和项目 B 的向量靠得很近,夹角较小,余弦相似度较高。项目 C 的向量指向不同的方向,表明它与 A 和 B 的相似度都较低。
两个非零向量 和 之间的余弦相似度公式定义为向量的点积除以它们模的乘积。
让我们拆解其中的组成部分:
得到的分数范围在 -1 到 1 之间。由于 TF-IDF 向量只包含非负值,因此余弦相似度分数的范围通常在 0 到 1 之间:
虽然你可以使用 NumPy 等库从头开始实现该公式,但 scikit-learn 提供了一个高效且经过优化的函数 cosine_similarity,它是处理此任务的标准工具。它接受一个向量矩阵作为输入,并计算所有向量对之间的相似度。
假设你有一个 TF-IDF 矩阵 tfidf_matrix,其中每一行代表一部电影,每一列代表词汇表中的一个词项。
from sklearn.metrics.pairwise import cosine_similarity
# tfidf_matrix 是 TfidfVectorizer 的输出
# 假设它包含 3 部电影(行)和 5 个词汇(列)
# tfidf_matrix.shape -> (3, 5)
# 计算余弦相似度矩阵
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)
print(cosine_sim)
输出结果 cosine_sim 将是一个方阵,其中 cosine_sim[i][j] 是项目 i 和项目 j 之间的余弦相似度分数。该矩阵的维度将是 (项目数量, 项目数量)。
以下是三部电影的示例输出可能的样子:
[[1. 0.75368321 0.10540926]
[0.75368321 1. 0.15811388]
[0.10540926 0.15811388 1. ]]
请注意该矩阵的一些特性:
cosine_sim[0][1] 等于 cosine_sim[1][0])。这个相似度矩阵是我们基于内容的推荐系统的核心。有了它,我们可以针对任何给定的电影,立即查找并生成推荐给用户的相似电影排名列表。在接下来的部分中,我们将利用这个矩阵来构建用户画像并生成个性化推荐。
这部分内容有帮助吗?
cosine_similarity函数的官方文档,详细说明其用法和参数。© 2026 ApX Machine Learning用心打造