请使用余弦相似度计算任意两个用户之间的相似度
时间: 2025-06-22 20:38:56 浏览: 13
### 使用余弦相似度计算用户间相似性的方法
为了计算用户之间的相似性,可以采用基于文本数据的方法。具体来说,可以通过用户的评论、帖子或其他形式的文本表达来进行分析。这里介绍一种利用词嵌入(Word Embedding)和余弦相似度的技术方案。
#### 准备工作
首先加载预训练好的 GloVe 模型中的50维向量表示[^2]:
```python
import numpy as np
with open("./input/glove-global-vectors-for-word-representation/glove.twitter.27B.50d.txt", "rb") as lines:
w2v = {line.split()[0].decode("utf-8"): np.array([float(value) for value in line.split()[1:]])
for line in lines}
```
接着定义一个辅助函数用于获取句子中所有单词对应的平均向量作为该句的整体特征描述:
```python
def sentence_vector(sentence, word_vectors=w2v):
words = sentence.lower().split()
vectors = [word_vectors[word] for word in words if word in word_vectors]
if not vectors:
return None
avg_vector = sum(vectors) / len(vectors)
return avg_vector
```
#### 计算余弦相似度
有了上述准备之后就可以编写计算两个用户之间相似程度的核心部分——即通过他们各自发布的内容构建各自的语义空间位置并求解两者夹角余弦值来衡量其接近程度。下面给出具体的实现方式:
```python
from sklearn.metrics.pairwise import cosine_similarity
def compute_user_similarity(user_a_posts, user_b_posts):
vecs_a = [sentence_vector(post) for post in user_a_posts if sentence_vector(post) is not None]
vecs_b = [sentence_vector(post) for post in user_b_posts if sentence_vector(post) is not None]
if not vecs_a or not vecs_b:
return 0
sim_matrix = cosine_similarity(vecs_a, vecs_b)
average_similarities = []
for i in range(len(sim_matrix)):
row_mean = np.mean(sim_matrix[i])
average_similarities.append(row_mean)
overall_similarity_score = np.mean(average_similarities)
return overall_similarity_score
```
这段代码实现了如下功能:对于给定的一对用户A和B所发布的若干条消息组成的列表`user_a_posts` 和 `user_b_posts`, 将每篇文档转换成固定长度的实数向量;随后调用scikit-learn库内的cosine_similarity()函数得到两组向量间的相似矩阵;最后取均值得到最终得分以反映二者关系密切与否的程度。
阅读全文
相关推荐


















