1. 项目概述:基于用户偏好迁移的智能电影推荐系统
最近在开发一个能持续学习用户口味的电影推荐系统时,发现传统推荐算法存在明显的"兴趣固化"问题——系统总是推荐相似类型的影片,导致用户陷入信息茧房。这促使我设计了一套基于Python的偏好迁移推荐方案,通过动态捕捉用户兴趣演变轨迹,实现更智能的推荐体验。
这个系统包含三个核心技术模块:
- 用户兴趣向量建模(使用Word2Vec处理观影记录)
- 基于时间衰减的偏好迁移算法
- 混合推荐策略引擎(协同过滤+内容相似度)
整套方案采用Django构建后端,Vue.js开发管理后台,配合MySQL存储用户行为数据。最让我自豪的是系统具备"兴趣进化感知"能力——当用户开始对纪录片产生兴趣时,系统会逐步降低同类商业片的推荐权重,而不是突然改变推荐风格。
2. 核心数据库设计解析
2.1 用户行为存储方案
sql复制CREATE TABLE `user_feedback` (
`id` BIGINT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL COMMENT '用户ID',
`movie_id` INT NOT NULL COMMENT '电影ID',
`feedback_type` ENUM('like','dislike','ignore') NOT NULL COMMENT '反馈类型',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (movie_id) REFERENCES movies(id)
) ENGINE=InnoDB CHARSET=utf8mb4;
这个表设计有几个关键考量:
- 使用ENUM类型严格限制反馈类型,避免脏数据
- 时间戳自动记录用户行为发生时间
- 联合索引优化查询效率(实际项目中还添加了(user_id, created_at)的复合索引)
2.2 兴趣向量快照机制
python复制# 示例:用户兴趣向量生成代码
def generate_interest_vector(user_id):
history = UserFeedback.objects.filter(user_id=user_id).order_by('created_at')
vector = {}
for record in history:
decay = 0.9 ** ((timezone.now() - record.created_at).days / 7) # 周级衰减
movie_tags = MovieTags.objects.filter(movie_id=record.movie_id)
for tag in movie_tags:
vector[tag.tag] = vector.get(tag.tag, 0) + (1 if record.feedback_type == 'like' else -1) * decay
return json.dumps(vector)
这段代码实现了:
- 时间衰减因子(最近行为权重更高)
- 标签权重累计(喜欢加分,讨厌减分)
- JSON序列化存储
3. 推荐算法实现细节
3.1 混合推荐策略
python复制def hybrid_recommend(user_id, top_n=10):
# 获取用户当前兴趣向量
interest_vector = get_current_interest(user_id)
# 协同过滤推荐
cf_items = collaborative_filtering(user_id, top_n*2)
# 内容相似度推荐
content_items = content_based_recommend(interest_vector, top_n*2)
# 混合排序算法
all_items = list(set(cf_items + content_items))
scored_items = []
for movie in all_items:
cf_score = 0.7 if movie in cf_items else 0.3
content_score = calculate_similarity(movie, interest_vector)
final_score = 0.6*cf_score + 0.4*content_score
scored_items.append((movie, final_score))
return sorted(scored_items, key=lambda x: x[1], reverse=True)[:top_n]
关键提示:权重参数(0.6/0.4)需要通过AB测试持续优化,我们的实验表明新用户更适合0.7:0.3的比例
3.2 冷启动解决方案
对于新用户,系统采用三级降级策略:
- 首先询问3-5个偏好问题(喜欢哪些导演/演员)
- 然后展示热门影片获取即时反馈
- 最后混合内容相似推荐和趋势推荐
python复制def cold_start_recommend(answers=None):
if not answers:
return get_trending_movies()
# 基于问卷答案的推荐
director_movies = Movie.objects.filter(
director__in=answers['directors'])[:5]
actor_movies = Movie.objects.filter(
actors__name__in=answers['actors'])[:5]
return list(set(director_movies + actor_movies))
4. 管理后台开发要点
4.1 使用Django Admin定制
python复制# admin.py 配置示例
class MovieAdmin(admin.ModelAdmin):
list_display = ('title', 'director', 'rating')
search_fields = ('title', 'director__name')
list_filter = ('tags__tag',)
filter_horizontal = ('actors',)
def get_queryset(self, request):
qs = super().get_queryset(request)
if not request.user.is_superuser:
return qs.filter(is_approved=True)
return qs
实现功能:
- 多字段联合搜索
- 标签云过滤
- 权限控制(普通管理员只能看到审核通过的影片)
4.2 Vue.js管理界面
前端采用Vben Admin Pro框架,关键优化点:
- 异步加载推荐结果明细数据
- 可视化用户兴趣演变曲线
- A/B测试配置面板
javascript复制// 用户兴趣图谱组件
export default defineComponent({
setup() {
const userData = ref(null)
const fetchData = async (userId) => {
const res = await getInterestVectorHistory(userId)
userData.value = res.data.map(item => ({
date: dayjs(item.created_at).format('YYYY-MM-DD'),
vectors: JSON.parse(item.interest_vector)
}))
}
return { userData, fetchData }
}
})
5. 部署与性能优化
5.1 Docker部署方案
dockerfile复制# 后端服务Dockerfile
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi"]
常见问题解决:
- 若出现"virtualization support not detected"错误:
- BIOS中启用VT-x/AMD-V虚拟化
- Windows功能中开启Hyper-V
- 执行
bcdedit /set hypervisorlaunchtype auto
5.2 缓存策略设计
使用Redis三级缓存:
- 用户最近兴趣向量(TTL 10分钟)
- 热门推荐结果(TTL 1小时)
- 电影特征数据(持久化缓存)
python复制# Django缓存装饰器示例
@cache_page(60 * 15) # 15分钟缓存
@cache_control(private=True)
def get_recommendations(request, user_id):
...
6. 项目演进方向
在实际运行三个月后,我们发现几个优化点:
- 需要增加"意外惊喜"推荐(10%概率推荐差异较大但高质量影片)
- 社交关系权重引入(好友喜欢的影片适当加分)
- 片单场景化推荐(区分工作日/周末的不同推荐策略)
最近正在试验使用Transformer模型替代传统的协同过滤算法,初步测试显示CTR提升了18%。不过要注意模型复杂度与响应时间的平衡,当前保持在200ms以内的推荐响应延迟是关键指标。
