基于内容的电影推荐系统:纯Python实现余弦相似度计算求助
解决方案
1. 重写余弦相似度函数(适配稠密向量)
原函数针对字典结构设计,现在需要处理CountVectorizer生成的稠密数组向量,修改后的函数如下:
from math import sqrt def cosine_similarity(vec1, vec2): dot_product = 0 norm1 = 0 norm2 = 0 # 遍历向量的每个维度,计算点积与范数 for v1, v2 in zip(vec1, vec2): dot_product += v1 * v2 norm1 += v1 ** 2 norm2 += v2 ** 2 # 处理零向量情况,避免除以0错误 if norm1 == 0 or norm2 == 0: return 0.0 return dot_product / (sqrt(norm1) * sqrt(norm2))
2. 适配本地数据的推荐生成函数
不再依赖外部API,直接使用你已有的movievector和newdata数据框生成推荐:
def generate_recommendations(movie_index, movievector, movie_data): # 获取目标电影的特征向量 target_vec = movievector[movie_index] similarities = [] # 计算所有电影与目标电影的相似度 for idx, vec in enumerate(movievector): if idx == movie_index: continue # 跳过电影自身 sim_score = cosine_similarity(target_vec, vec) similarities.append({ 'movie_index': idx, 'movie_details': movie_data.iloc[idx].to_dict(), 'similarity': sim_score }) # 按相似度降序排序,取前5个推荐 similarities.sort(key=lambda x: x['similarity'], reverse=True) return similarities[:5]
3. 使用示例
方式1:通过电影索引获取推荐
假设你想获取第0行电影的推荐:
# 生成推荐 top_recommendations = generate_recommendations(0, movievector, newdata) # 打印结果 for rec in top_recommendations: print(f"相似度: {rec['similarity']:.4f}") print(f"电影信息: {rec['movie_details']}\n")
方式2:通过电影ID获取推荐(如果newdata包含movie_id列)
先添加一个辅助函数根据ID查找索引:
def get_movie_index_by_id(target_id, movie_data): return movie_data[movie_data['movie_id'] == target_id].index[0]
然后调用:
target_movie_id = 123 # 替换为你的目标电影ID target_index = get_movie_index_by_id(target_movie_id, newdata) top_recommendations = generate_recommendations(target_index, movievector, newdata)
关键说明
- 适配了
CountVectorizer生成的稠密数组向量,利用zip遍历对应维度计算点积与范数 - 增加零向量判断,避免除以0的运行时错误
- 直接使用本地数据,无需依赖外部API接口
内容的提问来源于stack exchange,提问作者Yyagya
相关产品推荐
相关产品推荐

