新闻推荐系统基本流程
近期参加了DataWhale组织的组队学习,加入了其中的新闻推荐系统的学习,专门开了一个分类来记录学习的过程!
项目地址:Fun-rec。
先给出整个新闻推荐系统的框架:
可以很清楚地看到,整个系统被划分成两个部分:offline,online。
offline
offline部分主要包含:
- 新闻物料的爬取
- 物料画像处理
- 用户画像更新
- 生成推荐页列表
- 生成热门页列表
新闻物料的爬取
每天23点爬取新浪新闻当天的新闻数据,因为晚上的物料更多一些。爬取的新闻物料存入MongoDB数据库中。爬取的过程:
- 每天定时从新浪新闻上面爬取当天的新闻,并将新闻存入到mongodb数据库中
- 爬取新闻是一个增量的过程,每天只爬取当天的新闻
- 新闻爬取的时候需要提前之前物料池中的所有物料的标题给存下来用来去重
物料画像处理
这一部分将爬取到的新闻物料放入物料池,并对物料池(包括之前已经在物料池的新闻)中的物料进行画像(包括新闻的静态特征,以及动态特征,如点赞数等)处理。主要过程:
- 将爬取的新闻原始数据处理成画像数据
- 将处理好的特征画像中需要展示的数据放到redis中
用户画像更新
更新注册了的用户的画像(存放在MongoDB中),画像特征有:
- 基本属性特征,如用户名、性别、城市等
- 动态特征:历史喜欢最多的Top3的新闻类别、历史喜欢新闻的Top3的关键词、用户喜欢新闻的平均热度、用户15天内喜欢的新闻数量
关于物料的离线部分到此为止,接下来就是离线生成展示内容了,先看一下本项目中的新闻推荐系统的界面:
从上面可以看出,每个用户登陆后会有两个列表:一个是推荐列表、一个是热门列表。
- 推荐列表是“千人千面”的,每个用户的推荐列表都是不一样的,注意在离线部分,会为每个用户生成推荐列表(新用户则根据冷启动方法生成,老用户则按照推荐算法生成)
- 在离线部分,热门列表是事先生成好的。离线部分会对物料池中新闻(并不是所有新闻,二十经过过滤后的新闻,比如最近10天内的新闻)计算热度值,再排序得到一个热门新闻列表,这个列表作为每个用户热门列表的模板(这里说它是“模板”是因为每个用户的热门列表是不一样的,“模板”作为用户的初始热门列表,当给用户曝光时,还需要去除用户已经看过的新闻)
所谓热门页, 就是对于每篇文章,会根据它的发布时间,用户对它的行为记录(获得的点赞数,收藏数和阅读数)去计算该文章的热度信息, 然后根据热度值进行排序得到, 所以计算文章的热门记录, 只需要文章画像的动静态信息即可,天级更新。
至此,offline部分结束了!!!
online
线上是为用户在使用系统的过程中触发的行为提供一系列服务,使用流程:
- 当用户刚进入系统的时候,会进入新闻的推荐页面,此时系统会为该用户获取推荐页文章并进行展示
- 当用户进入热门页, 系统就会为该用户获取热门页列表并进行展示
以下这段内容引用自这里。
-
获取推荐页列表:这个服务在用户刚进入系统,以及在推荐页中浏览文章刷新下拉过程中进行触发,当系统触发该服务的时候,首先会判断该用户是新用户还是老用户
- 如果是新用户,就从离线存储好的冷启动列表(离线部分生成)中读取推荐列表,选择指定的数目(比如一次触发给用户推荐10篇)的文章推荐,但推荐之前,需要去除已曝光的文章(避免重复曝光,影响用户体验),所以对于每个用户,我们还会记录一份已曝光列表,方便我们去重,同时,当批文章曝光出去,还要即使更新我们的曝光列表。
- 如果是老用户,就从离线存储好的个性化推荐列表中读取, 和上面一样, 选择指定数目的文章,去掉曝光,生成最终推荐列表,同时更新用户曝光记录。
-
获取热门页列表: 这个服务是用户点击热门页,以及在热门页中浏览文章刷新下来过程中进行触发,当该服务触发的时候,依然会判断新用户和老用户
- 如果是新用户,需要从离线存储好的公共冷启动模板中为该用户生成一份热门页列表,然后获取,选择指定数目文章推荐,和上面一样,去曝光,生成最终推荐列表,更新曝光记录。
- 如果是老用户,从离线存储好的该用户热门列表中读取,选择指定数目文章推荐,去曝光,生成最终推荐列表,更新曝光记录。
服务端代码
源码地址:news_rec_server。
整理后的服务器端代码结构:
具体的代码分析就留在后续的任务中慢慢做吧。