Press "Enter" to skip to content

原力计划【新闻推荐系统】(task1)系统搭建基本流程

 

学习总结

 

文章目录

 

一、学习版图

 

回顾之前学习王喆老师的《深度学习推荐系统》的sparrow recsys电影推荐系统,大家都会很着急地了解最新的推荐架构中的神经网络模型,如下图的经典推荐模型。整个深度学习推荐模型的演化过程,是从最经典的多层神经网络向不同方向开枝散叶,比如结合协同过滤发展出了 NerualCF,加入 Embedding 层发展出以 Deep Crossing 为代表的 Embedding+MLP 的结构,以及把深度神经网络和单层网络结合起来发展出 Wide&Deep 模型等等。

但再从“宏观”的角度看,推荐系统不仅结合推荐算法, 还和工程紧密结合,之前的sparrow电影推荐架构(离线数据处理部分,推荐系统模型和线上服务器部分,还有前端),作为推荐算法工程师虽然重点关注召回层、排序层、再排序层等,但系统中相关工程也最好掌握,如图:

那幺其实类似地,sparrow电影推荐系统和我们本次要搭建的新闻推荐系统类似:

 

(1)首先是离线处理部分:

 

获取数据:爬取数据后画像处理。用户画像和物品画像,物料存入MongoDB中的SinaNews
数据库中;MongoDB中的用户画像,来自mysql中的用户注册表和用户日志数据(如阅读量、点赞数、收藏数等)。这里我们用MongoDB是因为其文档类似于JSON对象,增删字段非常方便。处理完的物料会存入redis中(直接从MongoDB拉去会比较卡),前端展示。

 

PS:这里为了方便搭建,数据并不是实时在线获得,但是每晚固定时间会爬取数据。

 

(2)然后是线上服务器处理部分:

 

OnlineServer:sparrow电影推荐系统,为了搭建工业级高并发服务器,是用了java的Jetty嵌入式服务器框架(用到Servlet 服务),类似的,这里的新闻推荐系统搭建的服务器供线上服务,在获取推荐页列表和热门页列表中,就是含有召回层、排序层、再排序层的“过滤”过程。

 

RecsysServer:根据用户的各种请求(注册、登录、推荐等请求),服务器接收请求后进行处理。

 

【本次学习目标】熟悉项目大部分的代码,并能理解下面这张图的流程、含义。

二、新闻推荐系统

 

可以先看下实现的项目效果:http://47.108.56.188:8686/

 

如果在电脑上打开,需要按F12键转为移动端:


登录之后的效果如下,查看network:

能看到多了个login
(从后端得到的),前后端通过json交互:

另外的rec_list?user_id=andyguo
是一坨json格式,我们可以复制扔到菜鸟教程的JSON在线解析器
转换(结果如下图右侧),其中data
是一个数组,每个元素对应一条新闻。

小结:前后端通过URL发送的信息交互。

 

历史信息:用户、物料、用户日志信息。

 

三、前端部分

 

路径:news_rec_web/Vue-newsinfo/src

 

登录后通过post请求,进行push等,需要明白前后端对应的URL分别是啥。

 

四、后端部分

 

server路径:news_rec_server/server.py

 

爬虫框架:materials/news_scrapy

 

对爬取的数据进行画像处理:scheduler/offline_material_and_user_process.sh

 

轻量级python程序应用框架Flask,可参考教程:https://www.w3cschool.cn/flask/。

 

五、数据库部分

 

数据库配置:news_rec_server/conf/dao_config.py

 

有介绍各个数据库(mysql、MongoDB、redis)数据表的简要信息。

 

# 数据库相关的配置文件
user_info_db_name = "userinfo" # 用户数据相关的数据库
register_user_table_name = "register_user" # 注册用户数据表
user_likes_table_name = "user_likes" # 用户喜欢数据表
user_collections_table_name = "user_collections" # 用户收藏数据表
user_read_table_name = "user_read"   # 用户阅读数据表
exposure_table_name_prefix = "exposure" # 用户曝光数据表的前缀
# log数据,每天都会落一个盘,并由时间信息进行命名
loginfo_db_name = "loginfo" # log数据库
loginfo_table_name_prefix = "log" # log数据表的前缀
# 默认配置
mysql_username = "root"
mysql_passwd = "123456"
mysql_hostname = "localhost"
mysql_port = "3306"
# MongoDB
mongo_hostname = "127.0.0.1"
mongo_port = 27017
# Sina原始数据
sina_db_name= "SinaNews"
sina_collection_name_prefix= "news"
# 物料池db name 
material_db_name = "NewsRecSys"
# 特征画像 集合名称
feature_protrail_collection_name = "FeatureProtrail"
redis_mongo_collection_name = "RedisProtrail"
user_protrail_collection_name = "UserProtrail"
# Redis
redis_hostname = "127.0.0.1"
redis_port = 6379
reclist_redis_db_num = 0
static_news_info_db_num = 1
dynamic_news_info_db_num = 2
user_exposure_db_num = 3
# 类别映射字典
cate_dict = {
 
    '2510':  '国内',
    '2511':  '国际',
    '2669':  '社会',
    '2512':  '体育',
    '2513':  '娱乐',
    '2514':  '军事',
    '2515':  '科技',
    '2516':  '财经',
    '2517':  '股市',
    '2518':  '美股'
}

 

六、召回、排序、再排

 

new_rec_server/reprocess/offline:冷启动等

 

生成热门列表的模板,生成冷启动的模板。

 

对于冷启动,我们是根据年龄性别分,将人群分为4类,根据模板进行复用。

 

如果用户在搜索篮球商品,出现各种篮球商品推荐那还算正常,但是如果是兴趣推荐栏目中这样就有点问题了(一连串都是一类商品,篮球),所以我们需要对召回、排序后的结果,根据特定的类别进行打散。

 

关于根据类别的打散,可以参考:在广告/搜索/推荐系统中 对展示结果打散的通用鲁棒算法

 

附:时间规划

 

 

Reference

 

(1)datawhale notebook

 

(1)https://github.com/datawhalechina/fun-rec

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注