1. 项目概述:基于协同过滤的番茄小说推荐系统
作为一名长期从事推荐系统开发的工程师,我最近完成了一个结合协同过滤算法与Django框架的番茄小说智能推荐项目。这个系统不仅能根据用户行为生成个性化书单,还实现了阅读偏好的可视化分析,特别适合作为大数据或人工智能方向的毕业设计选题。
这个项目的核心价值在于将理论算法落地为实际可用的Web应用。我们使用Python+Django构建后端服务,采用基于用户的协同过滤算法处理用户-小说交互数据,最终通过直观的图表展示推荐结果和用户画像。整个系统包含用户管理、行为采集、推荐计算、可视化展示四大模块,完整覆盖了从数据收集到智能推荐的闭环流程。
提示:协同过滤算法是推荐系统领域的经典方法,特别适合处理用户对物品(如小说)的评分或点击数据。与基于内容的推荐相比,它不需要预先提取物品特征,仅通过用户历史行为就能发现相似用户群体。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 整体技术栈选型
项目采用典型的三层架构设计:
- 前端展示层:HTML5 + Bootstrap + ECharts
- 业务逻辑层:Django框架 + 协同过滤算法
- 数据存储层:MySQL + Redis缓存
选择Django而非Flask的主要考虑是其自带的管理后台和ORM系统,能快速构建用户认证、权限管理等基础功能。对于推荐算法部分,我们使用纯Python实现而非Spark等大数据框架,主要考虑到:
- 毕业设计场景下数据量通常在百万级以内
- 避免搭建复杂分布式环境
- 更易于调试和算法迭代
2.2 数据流设计
系统的核心数据流动路径如下:
- 用户登录后产生浏览/收藏行为
- 行为数据实时写入MySQL的user_behavior表
- 定时任务每小时运行一次协同过滤计算
- 推荐结果缓存到Redis并更新用户首页
- 管理员可查看全站推荐热力图和用户分群
python复制# 示例:Django中的行为记录模型
class UserBehavior(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
novel = models.ForeignKey(Novel, on_delete=models.CASCADE)
behavior_type = models.CharField(max_length=10) # view/collect/share
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
indexes = [
models.Index(fields=['user', 'created_at']),
]
3. 协同过滤算法实现细节
3.1 相似度计算优化
传统协同过滤使用余弦相似度计算用户相似性,但在实际应用中我们发现两个优化点:
- 时间衰减因子:三个月前的点击行为权重应低于近期行为
python复制def time_decay(days):
return 0.5 ** (days/30) # 半衰期30天
- 行为类型加权:收藏行为比浏览更具参考价值
python复制behavior_weights = {
'view': 1,
'collect': 3,
'share': 2
}
3.2 稀疏矩阵处理技巧
用户-小说矩阵通常非常稀疏(>95%零值),我们采用以下策略优化:
- 使用scipy.sparse的csr_matrix存储
- 仅计算Top 100活跃用户的相似度
- 对长尾小说进行降权处理
python复制from scipy.sparse import csr_matrix
# 构建稀疏矩阵示例
rows = [0, 0, 1, 2]
cols = [0, 1, 0, 2]
data = [1, 3, 2, 1] # 加权后的行为值
matrix = csr_matrix((data, (rows, cols)), shape=(3, 3))
4. 系统关键功能实现
4.1 实时推荐接口
为避免每次请求都重新计算,我们设计了两级缓存:
- Redis缓存每个用户的Top 20推荐结果(TTL 1小时)
- 本地内存缓存热门小说列表(TTL 5分钟)
python复制# Django视图函数示例
def get_recommendations(request):
user_id = request.user.id
cache_key = f"rec_{user_id}"
# 先尝试从Redis获取
if recs := cache.get(cache_key):
return JsonResponse(recs)
# 缓存未命中时计算推荐
recs = calculate_cf(user_id)
cache.set(cache_key, recs, timeout=3600)
return JsonResponse(recs)
4.2 可视化分析模块
使用ECharts实现三类分析视图:
- 用户兴趣雷达图:展示各类别小说阅读占比
- 相似用户群体热力图:使用层次聚类算法
- 推荐效果对比图:A/B测试不同算法效果
注意:可视化数据需要预先聚合,避免在前端做复杂计算。我们使用Django的annotate和aggregate方法在数据库层面完成统计。
5. 部署与性能优化
5.1 生产环境部署方案
推荐使用Docker Compose编排以下服务:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:alpine
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
5.2 性能瓶颈与解决方案
在压力测试中我们发现两个主要瓶颈:
- 推荐计算耗时:通过设置Celery异步任务解决
- 高并发查询:使用Django的select_related和prefetch_related优化查询
python复制# 优化后的查询示例
novels = Novel.objects.filter(
id__in=recommended_ids
).select_related('author').prefetch_related('tags')
6. 项目扩展方向
这个基础框架可以进一步扩展:
- 引入深度学习模型(如NCF)提升推荐精度
- 增加实时点击流处理(Kafka+Flink)
- 开发移动端APP接入推荐API
- 加入小说内容特征进行混合推荐
我在实现过程中最大的体会是:推荐系统既要考虑算法精度,也要重视工程实现。比如最初版本没有考虑缓存,导致接口响应超过2秒,加入Redis后降至200ms以内。另一个教训是要预留足够的日志字段,后期分析推荐效果时,详细的行为日志能帮大忙。
