task1熟悉新闻推荐系统基本流程
(Datawhale32期组队学习)
文章目录
- task1熟悉新闻推荐系统基本流程
- 基础点
- 知识点
- 1 数据流图
- 1.1 物料
- 1.2 数据库
- 1.3 离线offline
- 1.4 在线online
- 2 工具集
- 2.1 项目与工具
- 2.2 运行调试
- 3 参考
- 4 补充(大佬们的资料)
- 4.1 数据流向
基础点
- 数据流图
- 原理
- 工具
知识点
1 数据流图
离线offline+在线online两部分
1.1 物料
- 每天0点爬取前一天的内容,爬取完数据再更新特征库,更新完特征库之后再更新用户的画像,然后将redis中所有数据都清空,将特征库中的前端展示信息存入redis
- 物料爬取materials/sinanews,scrapy存入,MongoDB的SinaNews数据库
- process_material物料处理函数,处理最新爬取新闻的画像,存入特征库(redis库)更新新闻动态画像, 需要在redis数据库内容清空之前执行,生成前端展示的新闻画像,并在mongodb中备份一份
- process_users用户画像函数,将用户的曝光数据从redis落到mysql中,更新用户画像
- update物料更新函数,新闻数据写入redis(处理redis数据的时候是会将前一天的数据全部清空)将最新的前端展示的画像传到redis
1.2 数据库
- dao/entity包,记录用户数据(存MySQL库)
- RegisterUser用户注册数据
- UserCollections用户收藏新闻数据
- UserExposure用户曝光数据
- UserLikes用户喜欢新闻数据
- UserRead用户阅读新闻数据
- 用户数据与MySQL数据库相连,记录engine,session
- 特征画像、新闻画像、用户画像等,存入mongo数据库,另,还有redis的备份数据
- 新闻信息,推荐列表,曝光列表存入redis。
1.3 离线offline
- 离线推荐流程,给每个用户存储一个倒排索引列表
- 热门页面:hot_list_template_to_redis函数
- 采用update_hot_value函数更新物料库中所有新闻的热度值,初始化时每个用户一致
- group_cate_for_news_list_to_redis将每个用户的推荐列表按照类别分开存入redis,方便后续打散策略的实现(热门页来说,只需要提前将所有的类别新闻都分组聚合就行,后面单独取就可以)
- 推荐页:rec_list_to_redis个性化推荐列表,千人千面
- cold_start_template_to_redis冷启动列表模板
- generate_cold_user_strategy_templete_to_redis_v2:冷启动用户模板,总共分成了四类人群
每类人群都把每个类别的新闻单独存储 - user_news_info_to_redis:个性化,将每个用户涉及到的不同的新闻列表添加到redis中去
- 处理完物料之后,生成当前最新的用户推荐列表,热门列表,及冷启动内容模板
1.4 在线online
- 单例模式推荐服务类
- 推荐页
- get_cold_start_rec_list获取冷启动用户的推荐列表,返回的是一个news_id列表,zrevrange排序分值从大到小,并把结果存入redis
- get_rec_list:给定页面的展示范围进行展示,根据news_id获取新闻的具体内容,并返回一个列表,列表中的元素是按照顺序展示的新闻信息字典
- get_cold_start_rec_list_v2,推荐页展示列表,使用轮询的方式进行打散
- 老用户使用个性key,新用户使用冷启动key
- 热门页:get_hot_list_v2,热门页展示列表,使用轮询的方式进行打散
- 老用户使用用户热门页,新用户,拷贝热门倒排模板
- 详情页:news_detail展示新闻详细信息
- 连接后端请求和后端数据记录(server.py)
- 调用数据库函数,查数据
2 工具集
操作系统:Windows10
MySQL:8.0.25
Redis:5.0.14
Mongodb:5.0.5
Mini-Conda Python 3.8
前端IDE:WebStorm2021.1
后端IDE:PyCharm Professional
访问MySQL和Mongodb的数据库工具:DataGrip 2021.1
访问Redis的工具:redis-desktop-manager-0.9.9.99.exe
2.1 项目与工具
学习实验工程,在本机落地,工具均安装在wind10笔记本。
- 前端
安装
- 使用源:npm install -g cnpm --registry=https://registry.npm.taobao.org
- 安装依赖:cnpm instal
- 修改前端访问IP和端口:文件package.json,修改第49行的IP和端口(注意:json文件注释会报错,直接改)
- 修改后端访问IP和端口:src/main.js,修改第23行的IP和端口:axios.defaults.baseURL = “http://127.0.0.1:5000”
运行
- npm run dev
- 浏览器打开:http://127.0.0.1:8686/#/,通过开发者工具查看
- 后端
安装
- 建立虚拟环境: python -m venv recenv
- 安装依赖:pip install -r requirements.txt -i (源)
- 修改后端项目的IP和端口:server.py,修改第233行的IP和端口: app.run(debug=True, host=‘127.0.0.1’, port=5000, threaded=True)
- 修改项目路径配置文件conf/proj_path.py,拿到项目文件位置:proj_path = os.path.join(sys.path[1], ‘’)
- 核对数据库配置文件conf/dao_config.py:Mysql+MongoDB+Redis配置信息
- 雪花算法服务,用于生成用户ID:snowflake_start_server --address=127.0.0.1 --port=8910 --dc=1 --worker=1
运行
- 启动server.py程序(注:在此之前,必须启动完成数据库并创建数据库)python server.py
- 数据库:使用DataGrip工具,连接MySQL数据库+Mongodb
安装
- 三个数据库:安装
- 设置环境变量
MySQL
- 下一步
- 用户名+密码+端口号(注意不要用root用户,可能不允许外部连接,建立个普通用户)
- CREATE USER ‘yxx’@‘localhost’ identified by ‘123456’
- GRANT ALL PRIVILEGES ON . TO ‘yxx’@‘localhost’
MySQL函数,用户名称密码MongoDB
- 建立data(db+log)文件夹,配置文件,设置自己的path(db、log文件夹地址)
- 任务管理处开启MongoDB服务
- 命令行判断是否正常启动:mongod --config D:\xxx\mongod.cfg --install --serviceName “MongoDB”(xxx是自己的路径)
redis
- 任务管理处开启服务
- 命令行判断是否正常启动:redis-server --service-install redis.windows-service.conf --loglevel verbose
DataGrip
- 连接MongoDB
- 连接MySQL,建立loginfo表/userinfo表
create database userinfo
2.2 运行调试
- 前端页面注册
- 爬取新闻/materials/news_scrapy/sinanews/run.py,配置参数—pages=30
- 更新物料画像materials/process_material.py,run物料处理函数
- 更新用户画像materials/process_user.py,run用户数据处理函数(用户数据落MySQL)
- 清除前一天redis中的数据,更新最新今天最新的数据materials/update_redis.py,update新闻数据(新闻数据存入redis)
- 离线将推荐列表和热门列表存入redis,recprocess/offline.py,run,内置倒排索引,登录前端可查看新闻。
4 补充(大佬们的资料)
4.1 数据流向
1.离线
物料
- 系统将当天新闻数据爬取存入MongoDB中
- 系统更新前一天新闻动态画像数据(用户对新闻的行为数据)存入Redis中
- 以上两个数据通过物料画像处理程序,将特征画像更新到MongoDB中(备份)
- 生成热门页列表数据和推荐页列表数据,并存入Redis中
用户画像
- 用户注册之后,系统将用户注册信息存入MySQL中
- 用户对新闻进行阅读、点赞及收藏操作后,系统将行为数据存入MySQL中
- 将用户注册信息和其行为数据构建用户画像存入MongoDB中
2.在线
生成推荐页列表的数据流向:
- 根据用户ID,从Redis中获取推荐页列表数据
- 从Redis中获取用户曝光表,并对推荐页列表数据进行过滤
- 更新用户曝光表,并存入Redis中
- 生成详情信息,并存入Redis中
- 生成排序列表,再前端页面上展示
生成热门页列表的数据流向:
- 根据用户ID,从Redis中获取热门页列表数据
- 从Redis中获取用户曝光表,并对热门页列表数据进行过滤
- 更新用户曝光表,并存入Redis中
- 生成详情信息,并存入Redis中
- 生成排序列表,再前端页面上展示