1. 项目概述:基于用户行为的新闻推荐系统
这个Python+Django的新闻推荐系统毕业设计,本质上是在解决信息过载时代的个性化阅读需求。系统通过记录用户的点击、停留时长、点赞等行为数据,运用协同过滤算法建立用户兴趣模型,实现千人千面的新闻推送。我在实际开发中发现,这种推荐系统最难的不是算法实现,而是如何平衡热点新闻与长尾内容的推荐权重。
系统采用典型的三层架构:前端用Bootstrap+ECharts实现响应式布局和数据可视化,后端Django处理业务逻辑,MySQL+Redis做数据存储和缓存。特别要说明的是,我们选择Django而非Flask,主要是看中其自带的Admin后台和ORM系统,这对需要快速开发的管理系统非常友好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心技术实现方案
2.1 用户行为数据采集设计
在用户行为埋点方案上,我们采用无侵入式采集策略:
python复制# 在base.html中植入JS采集脚本
document.addEventListener('DOMContentLoaded', function() {
// 记录页面停留时间
let enterTime = new Date();
window.addEventListener('beforeunload', function() {
navigator.sendBeacon('/log/behavior/', {
event_type: 'page_stay',
duration: (new Date() - enterTime)/1000,
news_id: {{ news.id|default:0 }}
});
});
// 点赞等交互事件
$('.like-btn').click(function() {
axios.post('/log/behavior/', {
event_type: 'like',
news_id: $(this).data('id')
});
});
});
重要提示:实际部署时要考虑数据清洗问题,我们遇到过因浏览器插件导致的大量异常短时访问记录,需要在后端添加过滤逻辑:
python复制# views.py 中的数据处理
if duration < 0.5 or duration > 600: # 过滤停留时间异常数据
return JsonResponse({'status': 'invalid'})
2.2 协同过滤算法优化
基础的用户协同过滤算法存在冷启动问题,我们采用混合策略:
- 新用户推荐:基于内容相似度(TF-IDF+余弦相似度)
- 老用户推荐:改进的UserCF算法
python复制# 改进的UserCF核心代码
def user_similarity(user1, user2):
# 加入时间衰减因子
time_decay = 1/(1 + math.log(1 + abs(user1.last_active - user2.last_active)))
# 加入行为权重(阅读=1,点赞=3,收藏=5)
weight = {'view':1, 'like':3, 'collect':5}
# 计算修正后的相似度
return sum(weight[act] for act in common_acts) * time_decay / math.sqrt(len(user1.acts)*len(user2.acts))
实测发现,单纯使用协同过滤会导致推荐结果趋同,我们最终采用30%协同过滤+40%内容推荐+30%热点补充的混合策略。
3. 系统关键模块实现
3.1 实时推荐引擎架构
![推荐系统架构图]
(说明:此处应为架构图描述)
- 数据层:MySQL存储用户画像,Redis缓存实时行为数据
- 计算层:Celery异步任务处理推荐计算
- 服务层:Django REST framework提供API接口
3.2 可视化分析看板
使用ECharts实现的多维度数据分析:
javascript复制// 用户兴趣标签分布雷达图
option = {
radar: {
indicator: [
{ name: '科技', max: 100 },
{ name: '体育', max: 100 },
// ...其他标签
]
},
series: [{
type: 'radar',
data: [{
value: [89, 34, 72, 55, 61],
name: '用户A'
}]
}]
};
4. 部署与性能优化
4.1 生产环境配置要点
在阿里云ECS上的实测配置:
- Nginx配置:
nginx复制location /recommend {
proxy_pass http://django_backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache recommend_cache;
proxy_cache_valid 200 5m; # 推荐结果缓存5分钟
}
- Django性能优化关键参数:
python复制# settings.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'MAX_ENTRIES': 1000 # 控制缓存大小
}
}
}
4.2 典型问题排查记录
-
推荐结果重复问题:
- 现象:用户连续收到相同新闻
- 排查:发现Redis缓存未设置过期时间
- 解决:添加推荐历史记录校验
-
新用户推荐质量差:
- 现象:新用户首屏内容不相关
- 优化:增加基于IP地理位置的初始推荐
5. 项目扩展方向
在实际开发中,我们还尝试接入了大模型优化推荐解释性:
python复制def generate_recommend_reason(user, news):
prompt = f"根据用户历史浏览{user.history},解释为什么推荐{news.title}"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role":"user","content":prompt}]
)
return response.choices[0].message.content
这个毕业设计项目最让我意外的发现是:简单的算法配合良好的工程实现,往往比复杂算法更能带来用户体验的提升。在最终答辩时,评委特别肯定了我们在推荐多样性方面的处理方案。
