学习总结
文章目录
一、学习版图
回顾之前学习王喆老师的《深度学习推荐系统》的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