尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于Django与协同过滤的小说推荐系统设计与实现

基于Django与协同过滤的小说推荐系统设计与实现 1. 项目概述Python全栈小说推荐系统设计这个毕业设计项目构建了一个基于Django框架的完整小说推荐平台核心功能是通过协同过滤算法分析用户阅读行为实现个性化小说推荐。系统采用经典的全栈技术架构前端使用HTMLCSSJavaScript实现可视化交互界面后端采用PythonDjango处理业务逻辑数据存储使用MySQL关系型数据库推荐算法部分则运用了基于用户的协同过滤UserCF和基于物品的协同过滤ItemCF两种经典算法。提示协同过滤算法是推荐系统领域的经典方法不需要依赖复杂的机器学习模型就能获得不错的推荐效果特别适合作为毕业设计的算法实现方案。我在实际开发中发现Django框架自带的管理后台非常适合快速构建CMS内容管理系统可以大幅减少基础CRUD功能的开发工作量。系统还整合了ECharts可视化库将用户行为数据和推荐结果通过直观的图表展示这对毕业设计答辩时的演示环节非常有帮助。2. 系统架构设计2.1 技术栈选型前端技术栈基础框架Bootstrap 5响应式布局可视化库ECharts 5.3.2交互增强jQuery 3.6后端技术栈Web框架Django 4.1模板引擎Django Template异步任务Celery 5.2数据存储主数据库MySQL 8.0缓存层Redis 6.2算法实现基础库NumPy 1.22, pandas 1.4相似度计算SciPy 1.8降维可视化scikit-learn 1.02.2 系统模块划分├── novel_recommend # 主应用 │ ├── models.py # 数据模型 │ ├── views.py # 业务逻辑 │ ├── recommend.py # 推荐算法 │ └── utils.py # 工具函数 ├── novel_web # 前端展示 │ ├── templates # 模板文件 │ └── static # 静态资源 ├── config # 配置目录 │ └── settings.py # 项目配置 └── manage.py # 管理脚本3. 核心功能实现3.1 用户行为数据收集系统设计了完善的行为日志采集机制主要记录三种关键行为显式反馈评分1-5星收藏/取消收藏评论内容情感分析隐式反馈阅读时长分段记录章节完成度页面滚动深度# models.py 行为日志模型 class UserBehavior(models.Model): user models.ForeignKey(User, on_deletemodels.CASCADE) novel models.ForeignKey(Novel, on_deletemodels.CASCADE) behavior_type models.CharField(max_length20) # view/rating/favorite value models.FloatField() # 评分值或阅读时长 created_at models.DateTimeField(auto_now_addTrue) class Meta: indexes [ models.Index(fields[user, novel]), models.Index(fields[created_at]) ]3.2 协同过滤算法实现3.2.1 用户相似度计算采用改进的余弦相似度算法加入时间衰减因子def user_similarity(user1, user2): # 获取共同评分项 common_novels set(user1.ratings.keys()) set(user2.ratings.keys()) if not common_novels: return 0 # 计算时间衰减权重 time_weights [ 1 / (1 decay_rate * abs(user1.ratings[n].timestamp - user2.ratings[n].timestamp)) for n in common_novels ] # 加权余弦相似度 numerator sum( (user1.ratings[n].score - user1.avg_rating) * (user2.ratings[n].score - user2.avg_rating) * time_weights[i] for i, n in enumerate(common_novels) ) # 分母计算 sum1 sum(pow((user1.ratings[n].score - user1.avg_rating), 2) for n in common_novels) sum2 sum(pow((user2.ratings[n].score - user2.avg_rating), 2) for n in common_novels) return numerator / (sqrt(sum1) * sqrt(sum2))3.2.2 推荐生成逻辑def generate_recommendations(target_user, k20): # 找出相似用户 similarities [ (other_user, user_similarity(target_user, other_user)) for other_user in User.objects.exclude(idtarget_user.id) ] # 按相似度降序排序 similarities.sort(keylambda x: x[1], reverseTrue) # 取Top K相似用户 top_users [user for user, sim in similarities[:k] if sim 0] # 收集推荐候选 recommendations {} for user in top_users: for novel in user.ratings: if novel not in target_user.ratings: weight user_similarity(target_user, user) * user.ratings[novel].score recommendations[novel] recommendations.get(novel, 0) weight # 按权重排序 return sorted(recommendations.items(), keylambda x: x[1], reverseTrue)3.3 可视化展示实现使用ECharts实现三种核心可视化用户兴趣雷达图展示用户对不同类型小说的偏好程度基于历史行为数据计算推荐解释桑基图展示推荐结果的生成路径连接用户→相似用户→推荐小说热度趋势折线图展示小说随时间变化的阅读热度// 雷达图配置示例 function initRadarChart() { const chart echarts.init(document.getElementById(radar-chart)); const option { radar: { indicator: [ { name: 玄幻, max: 100 }, { name: 都市, max: 100 }, { name: 科幻, max: 100 }, { name: 历史, max: 100 }, { name: 言情, max: 100 } ] }, series: [{ type: radar, data: [{ value: [85, 60, 30, 45, 90], name: 兴趣分布 }] }] }; chart.setOption(option); }4. 系统优化策略4.1 冷启动解决方案针对新用户和新小说采用混合推荐策略新用户基于人口统计学推荐年龄/性别热门排行榜推荐随机试探性推荐新小说基于内容相似度推荐作者其他作品推荐类型排行榜推荐4.2 性能优化方案离线计算用户相似度矩阵每日凌晨计算使用Celery异步任务队列缓存策略Redis缓存热门推荐结果设置15分钟过期时间数据库优化读写分离配置关键查询添加索引# Celery任务示例 app.task def daily_similarity_update(): users User.objects.all() for user in users: similar_users calculate_similar_users(user) cache.set(fuser_{user.id}_similar, similar_users, 86400)5. 部署实施指南5.1 开发环境搭建安装Python 3.8和MySQL 8.0创建虚拟环境python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows安装依赖pip install django4.1 celery5.2 redis4.3 pip install numpy pandas scipy scikit-learn5.2 数据库配置# settings.py 数据库配置 DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: novel_recommend, USER: db_user, PASSWORD: secure_password, HOST: 127.0.0.1, PORT: 3306, OPTIONS: { charset: utf8mb4, init_command: SET sql_modeSTRICT_TRANS_TABLES } } }5.3 生产环境部署推荐使用Docker容器化部署# Dockerfile 示例 FROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD [gunicorn, --bind, 0.0.0.0:8000, config.wsgi]6. 常见问题与解决方案6.1 推荐结果不稳定现象相同用户在不同时间获得的推荐差异很大排查步骤检查用户行为数据是否完整验证相似度计算是否加入时间衰减确认随机种子设置解决方案# 在推荐函数中加入稳定性处理 def stable_recommend(user): recommendations generate_recommendations(user) # 混合10%的历史稳定推荐 stable cache.get(fuser_{user.id}_stable, []) if stable: return recommendations[:18] stable[:2] return recommendations6.2 内存占用过高现象用户量增长后服务器内存不足优化方案采用稀疏矩阵存储用户-物品矩阵分块计算用户相似度使用Redis存储中间结果# 稀疏矩阵实现示例 from scipy.sparse import lil_matrix def build_sparse_matrix(): users User.objects.all() novels Novel.objects.all() matrix lil_matrix((len(users), len(novels))) user_idx {user.id: i for i, user in enumerate(users)} novel_idx {novel.id: j for j, novel in enumerate(novels)} for behavior in UserBehavior.objects.all(): i user_idx[behavior.user_id] j novel_idx[behavior.novel_id] matrix[i, j] behavior.value return matrix.tocsr()7. 项目扩展方向7.1 引入深度学习模型可以在现有系统基础上集成神经协同过滤NCF使用TensorFlow/Keras构建双塔模型用户塔嵌入层全连接层物品塔嵌入层全连接层交互层点积或神经网络7.2 增加实时推荐改造现有离线推荐系统使用Kafka处理实时行为事件实现Flink实时计算管道短期兴趣与长期兴趣融合7.3 多策略融合推荐组合多种推荐策略协同过滤40%权重内容相似度30%权重热门榜单20%权重随机探索10%权重def hybrid_recommend(user): cf_rec collaborative_filtering(user) content_rec content_based(user) hot_rec get_hot_novels() random_rec get_random_novels() # 加权融合 recommendations [] recommendations.extend((item, weight*0.4) for item, weight in cf_rec) recommendations.extend((item, weight*0.3) for item, weight in content_rec) recommendations.extend((item, 0.2) for item in hot_rec[:5]) recommendations.extend((item, 0.1) for item in random_rec[:2]) return sorted(recommendations, keylambda x: x[1], reverseTrue)在实际开发过程中我发现Django的ORM性能在处理大规模用户行为数据时会成为瓶颈后来通过以下优化显著提升了系统响应速度使用select_related/prefetch_related优化查询对高频查询添加数据库索引将复杂计算逻辑移到存储过程采用分页加载推荐结果
返回列表