基于Python+Django协同过滤的个性化电影推荐系统

发布时间:2026/10/4 5:04:35
基于Python+Django协同过滤的个性化电影推荐系统 温馨提示本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片1. 项目背景与目标随着互联网视频平台的发展用户面对海量电影资源时往往难以快速找到感兴趣的内容。个性化推荐系统通过分析用户的历史行为数据主动为用户推荐可能感兴趣的电影能够显著提升用户体验和平台留存率。本项目基于 Python 和 Django 框架实现一个基于协同过滤算法的电影推荐系统核心目标包括构建用户-电影评分数据模型支持用户对电影进行评分操作。实现基于用户的协同过滤算法根据相似用户的评分偏好生成推荐列表。实现基于物品的协同过滤算法根据电影之间的相似度进行推荐。提供 Web 管理界面支持电影浏览、评分和个性化推荐展示。2. 技术选型本系统采用以下核心技术栈技术组件选型说明Python推荐算法实现与数据处理的主要语言DjangoWeb 后端框架负责路由、模型、视图和模板渲染SQLite / MySQL数据持久化存储默认使用 Django 内置 SQLitepandas / numpy评分矩阵构建与相似度计算的数值运算库scikit-learn提供余弦相似度等距离度量工具Bootstrap前端页面样式与响应式布局3. 系统架构设计系统整体采用 Django MTV 架构模式分为数据层、算法层和展示层三个层次数据层由 Django ORM 管理用户、电影、评分三类核心数据模型负责数据的增删改查。算法层独立封装协同过滤推荐引擎从数据库读取评分数据计算相似度并生成推荐结果。展示层通过 Django 视图和模板渲染电影列表、评分页面和推荐结果页面。推荐引擎与 Web 层解耦便于后续替换或扩展其他推荐算法如矩阵分解、深度学习模型。4. 数据库模型设计系统包含三个核心数据模型分别对应 Django 应用中的 models.py 文件from django.db import models from django.contrib.auth.models import User class Movie(models.Model): title models.CharField(max_length200, verbose_name电影名称) genre models.CharField(max_length100, verbose_name类型) release_year models.IntegerField(verbose_name上映年份, nullTrue, blankTrue) description models.TextField(verbose_name简介, blankTrue) poster_url models.URLField(verbose_name海报地址, blankTrue) def __str__(self): return self.title class Rating(models.Model): user models.ForeignKey(User, on_deletemodels.CASCADE, verbose_name用户) movie models.ForeignKey(Movie, on_deletemodels.CASCADE, verbose_name电影) score models.IntegerField(verbose_name评分, choices[(i, i) for i in range(1, 6)]) created_at models.DateTimeField(auto_now_addTrue) class Meta: unique_together (user, movie)/code/pre 其中 Rating 模型通过外键关联用户和电影并设置联合唯一约束确保同一用户对同一部电影只能有一条评分记录。 5. 协同过滤算法实现 协同过滤的核心思想是如果两个用户对若干电影的评分相似那么他们对其他电影的偏好也可能相似。本系统实现两种经典协同过滤算法。 5.1 基于用户的协同过滤 基于用户的协同过滤User-Based CF分为三个步骤构建用户-电影评分矩阵、计算用户间相似度、为目标用户生成推荐。核心代码如下 import numpy as np import pandas as pd from sklearn.metrics.pairwise import cosine_similarity def user_based_recommend(ratings_df, target_user_id, top_n10): # 构建用户-电影评分矩阵缺失值填 0 pivot ratings_df.pivot_table(indexuser_id, columnsmovie_id, valuesscore).fillna(0) # 计算用户之间的余弦相似度 user_sim cosine_similarity(pivot) user_sim_df pd.DataFrame(user_sim, indexpivot.index, columnspivot.index) 找到与目标用户最相似的 K 个用户 target_idx pivot.index.get_loc(target_user_id) similar_users user_sim_df[target_user_id].sort_values(ascendingFalse).drop(target_user_id).head(10) 收集相似用户评分过但目标用户未评分的电影 target_rated set(pivot.loc[target_user_id][pivot.loc[target_user_id] gt; 0].index) candidates {} for sim_user, sim_score in similar_users.items(): user_rated pivot.loc[sim_user][pivot.loc[sim_user] gt; 0] for movie_id, score in user_rated.items(): if movie_id not in target_rated: candidates.setdefault(movie_id, 0) candidates[movie_id] sim_score * score 按加权得分排序返回 Top-N 推荐 recommendations sorted(candidates.items(), keylambda x: x[1], reverseTrue)[:top_n] return [movie_id for movie_id, _ in recommendations]/code/pre 5.2 基于物品的协同过滤 基于物品的协同过滤Item-Based CF先计算电影之间的相似度再根据用户历史评分过的电影推荐相似电影。核心代码如下 def item_based_recommend(ratings_df, target_user_id, top_n10): # 构建电影-用户评分矩阵 pivot ratings_df.pivot_table(indexmovie_id, columnsuser_id, valuesscore).fillna(0) 计算电影之间的余弦相似度 item_sim cosine_similarity(pivot) item_sim_df pd.DataFrame(item_sim, indexpivot.index, columnspivot.index) 获取目标用户已评分的电影 user_ratings ratings_df[ratings_df[user_id] target_user_id] rated_movies user_ratings[movie_id].tolist() 对每个已评分电影找出最相似的未评分电影并加权累加 scores {} for movie_id in rated_movies: movie_score user_ratings[user_ratings[movie_id] movie_id][score].values[0] similar_items item_sim_df[movie_id].sort_values(ascendingFalse).drop(movie_id).head(10) for sim_movie, sim_score in similar_items.items(): if sim_movie not in rated_movies: scores.setdefault(sim_movie, 0) scores[sim_movie] sim_score * movie_score recommendations sorted(scores.items(), keylambda x: x[1], reverseTrue)[:top_n] return [movie_id for movie_id, _ in recommendations]/code/pre 6. Django 视图与推荐引擎集成 在 Django 视图中从数据库读取评分数据并调用推荐引擎将推荐结果传递给模板渲染。核心视图代码如下 from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from .models import Movie, Rating from .recommender import user_based_recommend, item_based_recommend import pandas as pd login_required def recommend_view(request): 从数据库读取全部评分数据 ratings Rating.objects.all().values(user_id, movie_id, score) ratings_df pd.DataFrame(list(ratings)) if ratings_df.empty: return render(request, recommend.html, {movies: [], message: 暂无评分数据}) 调用协同过滤算法 recommended_ids user_based_recommend(ratings_df, request.user.id, top_n10) movies Movie.objects.filter(id__inrecommended_ids) return render(request, recommend.html, {movies: movies}) login_required def rate_movie(request, movie_id): movie get_object_or_404(Movie, idmovie_id) if request.method POST: score int(request.POST.get(score, 0)) Rating.objects.update_or_create( userrequest.user, moviemovie, defaults{score: score} ) return redirect(movie_detail, movie_idmovie_id) 7. 前端页面展示 前端页面基于 Django 模板和 Bootstrap 构建主要包含三个页面电影列表页、电影详情与评分页、个性化推荐页。推荐页核心模板代码如下 div classcontainer mt-4 h2为你推荐的电影/h2 {% if message %} p classtext-muted{{ message }}/p {% endif %} div classrow {% for movie in movies %} div classcol-md-3 mb-3 div classcard img src{{ movie.poster_url }} classcard-img-top alt{{ movie.title }} div classcard-body h5 classcard-title{{ movie.title }}/h5 p classcard-text{{ movie.genre }} · {{ movie.release_year }}/p a href{% url movie_detail movie.id %} classbtn btn-primary btn-sm查看详情/a /div /div /div {% endfor %} /div /div 8. 冷启动与数据稀疏问题 协同过滤算法在实际应用中面临两个典型问题 冷启动问题新用户没有评分记录无法计算相似度。解决方案包括推荐热门电影作为默认推荐或引导用户先对若干电影进行评分。 数据稀疏问题当用户和电影数量庞大而评分记录较少时相似度计算准确性下降。可通过引入物品内容特征如类型、导演进行混合推荐来缓解。 9. 项目运行与测试 项目运行步骤如下 1. 创建虚拟环境并安装依赖 python -m venv venv source venv/bin/activate # Windows 下为 venv\Scripts\activate pip install django pandas numpy scikit-learn 2. 创建 Django 项目和应用 django-admin startproject movie_recommender cd movie_recommender python manage.py startapp recommender 3. 执行数据库迁移 python manage.py makemigrations python manage.py migrate 4. 创建超级用户并启动服务 python manage.py createsuperuser python manage.py runserver 启动后访问 http://127.0.0.1:8000 即可浏览电影、评分并查看个性化推荐结果。 10. 总结与展望 本项目基于 Python 和 Django 实现了完整的协同过滤电影推荐系统覆盖了数据建模、算法实现、Web 集成和前端展示全流程。后续可以从以下方向继续优化引入矩阵分解SVD提升推荐精度、结合电影内容特征构建混合推荐模型、使用 Redis 缓存相似度矩阵以提升响应速度以及通过 A/B 测试持续评估推荐效果。