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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 MongoDB,通用型 2核4GB
简介: 回顾之前学习王喆老师的《深度学习推荐系统》的sparrow recsys电影推荐系统,大家都会很着急地了解最新的推荐架构中的神经网络模型,如下图的经典推荐模型。整个深度学习推荐模型的演化过程

一、学习版图

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

image.png

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

image.png

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

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

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

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

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

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

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

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

image.png

二、新闻推荐系统

项目运行环境:

操作系统:Windows10

MySQL:8.0.25

Redis:5.0.14

Mongodb:5.0.5

Mini-Conda Python 3.8

前端IDE:WebStorm2021.1

后端IDE:PyCharm Professional 2021.1

访问MySQL和Mongodb的数据库工具:DataGrip 2021.1

访问Redis的工具:redis-desktop-manager-0.9.9.99.exe

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

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

image.png

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

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

image.png

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

image.png

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

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

三、前端部分

路径:news_rec_web/Vue-newsinfo/src

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

3.1 安装依赖包

在Terminal中执行如下命令:

cnpm install

或者

npm install -g cnpm --registry=https://registry.npm.taobao.org

3.2 修改前端访问IP和端口

打开文件package.json,修改第49行的IP和端口,修改内容如下:

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "dev": "webpack-dev-server --open --port 8686 --contentBase src --hot --host 127.0.0.1",
  "start": "nodemon src/main.js"
},

127.0.0.1表示游览器的访问IP(也称为本地IP),8686表示访问端口

3.3 修改访问后端API接口的IP和端口

打开文件main.js,文件路径:src/main.js,修改第23行的IP和端口,修改内容如下:

// Vue.prototype.$http = axios
Vue.use(VueAxios, axios);
// axios公共基路径,以后所有的请求都会在前面加上这个路径
// axios.defaults.baseURL = "http://10.170.4.60:3000";
// axios.defaults.baseURL = "http://47.108.56.188:3000";
axios.defaults.baseURL = "http://127.0.0.1:5000"

127.0.0.1表示后端项目的访问IP(也称为本地IP),5000表示访问端口。

3.4 运行前端项目

在Terminal中执行命令运行前端项目,命令如下:

npm run dev

游览器会自动访问地址:http://127.0.0.1:8686/#/

四、后端部分

server路径:news_rec_server/server.py

爬虫框架:materials/news_scrapy

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

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

4.1 安装conda环境,并创建虚拟环境

创建指定路径的Python环境,执行命令如下:

conda create --prefix venv python=3.8

在PyCharm中,设置Python解释器

4.2 安装依赖文件

在Terminal中执行命令安装依赖包,命令如下:

pip install -r requirements.txt

4.3 修改后端项目的IP和端口

打开文件server.py,修改第233行的IP和端口,修改内容如下:

if __name__ == '__main__':
    # 允许服务器被公开访问
    # app.run(debug=True, host='0.0.0.0', port=3000, threaded=True)
    # 只能被自己的机子访问
    app.run(debug=True, host='127.0.0.1', port=5000, threaded=True)

127.0.0.1表示后端提供给前端的IP(也称为本地IP),5000表示端口。

4.4 修改项目路径配置文件proj_path.py(存疑)

修改项目路径配置文件proj_path.py,文件路径:conf/proj_path.py

# home_path = os.environ['HOME']
# proj_path = home_path + "/fun-rec/codes/news_recsys/news_rec_server/"
proj_path = os.path.join(sys.path[1], '')

4.5 核对数据库配置文件dao_config.py

打开数据库配置文件dao_config.py,文件路径:conf/dao_config.py,核对以下配置:

# MySQL默认配置
mysql_username = "root"
mysql_passwd = "123456"
mysql_hostname = "localhost"
mysql_port = "3306"
# MongoDB配置
mongo_hostname = "127.0.0.1"
mongo_port = 27017
# Redis配置
redis_hostname = "127.0.0.1"
redis_port = 6379

4.6 启动雪花算法服务

在Terminal中执行命令启动雪花算法服务,用于生成用户ID,启动命令如下:

snowflake_start_server --address=127.0.0.1 --port=8910 --dc=1 --worker=1

4.7 启动后端项目

启动server.py程序(注:在此之前,必须启动完成数据库并创建数据库),执行如下命令:

python server.py

五、数据库部分

数据库配置: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':  '美股'
}

(1)对于MongoDB的配置,可以参考博客。

(2)可以用datagrip软件查

六、召回、排序、再排

new_rec_server/reprocess/offline:冷启动等

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

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

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

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

七、项目整体运行与调试

7.1 注册用户

7.2 爬取新浪新闻

通过查看crawl_news.sh文件(文件路径:scheduler/crawl_news.sh),可知爬取新浪新闻的代码在如下目录

/materials/news_scrapy/sinanews/run.py

使用PyCharm的Run按钮,手动执行该代码,需要配置参数:

—pages=30

7.3 更新物料画像

通过查看offline_material_and_user_process.sh文件(文件路径:scheduler/offline_material_and_user_process.sh),可知更新物料画像的代码在如下目录:

materials/process_material.py

使用PyCharm的Run按钮,手动执行该代码

7.4 更新用户画像

通过查看offline_material_and_user_process.sh文件(文件路径:scheduler/offline_material_and_user_process.sh),可知更新用户画像的代码在如下目录:

materials/process_user.py

使用PyCharm的Run按钮,手动执行该代码

7.5 清除前一天redis中的数据,更新最新今天最新的数据

通过查看offline_material_and_user_process.sh文件(文件路径:scheduler/offline_material_and_user_process.sh),可知清除前一天redis中的数据,更新最新今天最新的数据的代码在如下目录:

materials/update_redis.py

使用PyCharm的Run按钮,手动执行该代码

7.6 离线将推荐列表和热门列表存入redis

通过查看run_offline.sh文件(文件路径:scheduler/run_offline.sh),可知离线将推荐列表和热门列表存入redis的代码在如下目录:

recprocess/offline.py

使用PyCharm的Run按钮,手动执行该代码

7.7 重新登录用户查看新闻

附:时间规划

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
算法 数据挖掘 程序员
数据挖掘之旅:京东商品详情API与销售策略的优化
曾经,数据是一座未知的金矿,静静地躺在无数的数据库和服务器中。而今,有了京东商品详情API,我们这些程序员终于找到了开采这座金矿的方法。
|
机器学习/深度学习 存储 分布式计算
【王喆-推荐系统】线上服务篇-(task5)部署离线模型
(1)业界主流的模型服务方法有 4 种,分别是预存推荐结果或 Embeding 结果、预训练 Embeding+ 轻量级线上模型、利用 PMML 转换和部署模型以及 TensorFlow Serving。
775 0
【王喆-推荐系统】线上服务篇-(task5)部署离线模型
|
JavaScript 数据挖掘 程序员
用户行为分析​的准备工作和简单分析的场景
用户行为分析​的准备工作和简单分析的场景
100 0
用户行为分析​的准备工作和简单分析的场景
|
机器学习/深度学习 人工智能 分布式计算
基于阿里云机器学习平台PAI搭建投放系统
移动互联网APP产品在面对新用户获取环节,普遍选择市场推广模式。在推广过程中,为了保证用户在app下载、app安装、app激活到app活跃的高转化率,需要实时监控各推广的质量。较为理想状态是投入产出比为:大于等于1。
342 0
基于阿里云机器学习平台PAI搭建投放系统
|
监控 搜索推荐 大数据
电商项目之用户分析、主题活动、风控模块、销售模块讲解|学习笔记
快速学习电商项目之用户分析、主题活动、风控模块、销售模块讲解
103 0
|
前端开发 搜索推荐 数据处理
推荐系统-Task01熟悉新闻推荐系统基本流程
创建conda虚拟环境: conda create -n news_rec_py3 python=3.8 安装依赖文件: pip install -r requirements.txt
106 0
推荐系统-Task01熟悉新闻推荐系统基本流程
|
存储 人工智能 NoSQL
推荐系统-Task05推荐系统流程构建
Offilne部分:主要是基于离线物料系统生成的物料画像和用户画像进行处理,为每个用户生成热门页列表和推荐页列表,并将其存储到Redis中 Online部分:主要是针对不同的用户,使用不同的策略,提供热门页列表和推荐页列表的新闻数据,进行过滤排序之后,展示到前端页面上
127 0
|
数据采集 NoSQL 搜索推荐
推荐系统-Task03离线物料系统的构建
新闻物料爬取:主要采用scrapy爬虫工具,在每天晚上23点将当天的新闻内容从网页中进行抓取,存入MongoDB的SinaNews数据库中。
122 0
推荐系统-Task03离线物料系统的构建
|
机器学习/深度学习 算法 搜索推荐
基于surprise模块快速搭建旅游产品推荐系统(代码+原理)(一)
基于surprise模块快速搭建旅游产品推荐系统(代码+原理)
444 0
基于surprise模块快速搭建旅游产品推荐系统(代码+原理)(一)
|
机器学习/深度学习 搜索推荐 算法
基于surprise模块快速搭建旅游产品推荐系统(代码+原理)(二 )
基于surprise模块快速搭建旅游产品推荐系统(代码+原理)
266 0
基于surprise模块快速搭建旅游产品推荐系统(代码+原理)(二 )