1. 需求调研
- 电影推荐系统输出用户可能喜欢的电影列表。
- 用户可以对系统推荐的电影反馈喜欢或者不喜欢。
- 系统根据用户的反馈,更新模型,为下次推荐用户更喜欢的电影做准备。
- 用户选择喜欢的电影会加入收藏夹,用户在闲暇时间可以根据收藏夹里的电影去观看,解决用户在想看电影的时候,找不到喜欢的电影的问题。
2. 系统设计
2.1 系统设计图
2.2 模块详细设计
2.2.1 网站部分
- 前端采用微信小程序实现。主要页面如下:
- 注册页面。收集用户性别/爱好/年龄/地域等信息。
- 电影浏览页面。一级页面向用户展示电影封面/类型/评分等信息,在一级页面,用户可以左划/右划选择喜欢或者不喜欢,也可点击收藏。
- 电影详情页面。点击一级页面的电影封面,可以进入二级页面显示电影详情。
- 电影收藏夹。用户可以在该页面查看自己收藏的电影。
- 后端采用java web实现。
- 实现restful接口,支持小程序获取数据。
- 将用电影/用户/用户行为信息记录数据库和日志,供大数据平台训练模型。
2.2.2 推荐系统部分
- 召回模块
- 按热度召回
- 按FM召回
- ItemBase召回
- UserBase召回
- 过滤模块
过滤模块主要是去除近期内已经推荐过的电影 - 排序模块
排序采用CNN深度学习模型。
2.2.3 在线/离线
- 在线部分采用tensorflow serving提供微服务接口。
- 离线部分主要是更新模型,以及生成召回所需要的准备数据。(相似电影,热度电影)
3. 接口设计
3.1 前端vs后台接口
- 获取推荐电影列表
- 输入:用户ID
- 输出:电影列表,每一条电影为<电影id,电影名称,评分,图片url>
- 获取电影详情
- 输入:电影ID
- 输出:<电影名称,类别,主演,剧情介绍>
- 左划喜欢
- 输入:用户ID,电影ID
- 输出:无
- 右划不喜欢
- 输入:用户ID,电影ID
- 输出:无
- 获取收藏列表
- 输入:用户ID
- 输出:电影列表,每一条电影为<电影ID,电影名称,评分,类别,图片url>
- 用户注册
- 输入:微信id,昵称,年龄,性别
3.2 后台vs推荐系统接口
- 召回接口
- 输入:用户ID
- 输出:召回的电影列表,每条电影为<电影ID,名称,类别>
- 排序接口
- 输入:电影信息<电影ID,名称,类别>,用户信息<用户ID,年龄,性别>
- 输出:topK电影列表,每条电影为<电影ID,评分>
4. 数据库表设计
4.1 mysql数据库表
- 用户表 (user_info)
- 用户id (user_id)
- 微信id (weixin_id)
- 昵称 (username)
- 年龄 (age)
- 性别 (gender)
- 职业 (occupation)
- 城市 (city)
- 电影表 (movie_info)
- 电影id (move_id)
- 电影名称 (title)
- 电影类型 (genres)
- 评分(平均分)(score)
- 电影封面链接 (url)
- 电影收藏表 (favorites)
- 用户id (user_id)
- 电影id (movie_id)
4.2 redis表
- ItemBase CF得到的相似电影表(cf_similar_movies)
- 电影id (movie_id)
- 相似电影列表 (sim_movies)
- UserBase CF得到的相似用户表(fm_similar_users)
- 用户id (user_id)
- 相似用户列表 (sim_users)
- 基于FM特征向量得到的相似电影表(fm_similar_movies)
- 电影id(movie_id)
- 相似电影列表(sim_movies)
- 按年龄划分得到的热门电影(age_hot_movies)
- 用户年龄 (age)
- 热门电影列表 (hot_movies)
- 按性别划分得到的热门电影(sex_hot_movies)
- 性别(sex)
- 热门电影列表(hot_movies)
4.3 用户行为日志打印
- 喜欢/不喜欢 行为日志 (user_stroke.log)
user_id,user_age, user_gender, user_city, movie_id,movie_title, movie_genres, movie_score, [1:喜欢,0:不喜欢],timestamp