以下学习笔记参考自Datawhale12月组队学习的推荐系统课程,内容主要为离线物料系统的构建。 项目原链接: https://github.com/datawhalechina/fun-rec
离线物料系统基本流程
-
物料侧画像的构建:首先添加新物料,新物料通过每天凌晨在新闻网站上爬取并存储在MongoDB中,对于旧物料画像,通过用户的交互记录(阅读,点赞,收藏)进行更新并将其拆分为静态和动态分别存入Redis中。 -
用户侧画像的构建:主要分为新注册用户画像的更新和老用户画像的更新两方面。用户通过前端注册页面,进行用户注册,新注册用户基本信息及其行为数据构造用户画像,存入MongoDB中的UserProtrai集合中。用户通过阅读、点赞及收藏新闻,将用户行为数据存入MySQL的用户阅读信息表(user_read)、用户点赞信息表(user_likes)和用户收藏信息表(user_collections)。 -
画像自动化构建:编写脚本定时完成一系列任务,先爬取新闻数据,这里需要注意的是,虽然是今天零点爬数据,但是实际上爬的是前一天的新闻。数据爬完之后,离线更新用户画像,物料画像及线上要存储再redis中的画像。最后是离线推荐的流程,离线将用户的排序列表存到redis中,线上取出即可。
scrapy进行新闻爬取
使用scrapy创建爬虫项目
输入以下命令即可创建scrapy项目:
scrapy startproject sinanews
爬取流程
- 调用
start_request() 方法开始爬取,并作为返回请求的迭代器。 - 调用
parse() 方法对scrapy下载的URL链接进行处理。 - 通过回调
parse() 方法,解析网页并返回在items.py中定义的对象,通过回调下一层的parse_content() 方法,解析新闻内容。 - 每天凌晨定时从sina网站爬取新闻信息,将不重复的新闻存入MongoDB。
物料画像构建
物料画像更新逻辑
- 新物料添加到物料库这件事情肯定是发生在新闻爬取之后的,将新物料添加到物料库之前还需要对新物料做一些去重和其他简单的画像处理,具体则是将新物料画像添加到MongoDB的NewsRecSys库的FeatureProtrail 中
- 将用户的动态行为信息(阅读,点赞,收藏)更新到旧物料(新闻动态画像)中
- 将最新的物料库中的新闻信息往RedisProtrail物料库中写一份,并去掉一些前端展示不需要的字段内容,作为存储再redis中的新闻内容的备份内容。
核心函数功能
update_new_items() :新物料画像的更新update_dynamic_feature_protrail() :更新动态特征update_redis_mongo_protrail_data() :redis展示新闻内容的备份
物料添加进redis数据库
news_redis_server = NewsRedisServer()
news_redis_server.news_detail_to_redis()
用户侧画像的构建
用户画像更新逻辑
- 将用户的新闻曝光数据保存到MySQL中,用于进行去重。
- 每日遍历用户日志,更新用户历史阅读的记录,对阅读、点赞和收藏三个用户行为表来做具体的用户兴趣相关画像。
核心函数功能
user_exposure_to_mysql() :用户曝光数据落在mysqlupdate_user_protrail_from_register_table() :更新用户画像
画像自动化构建
- 物料更新脚本:
process_material.py ,用户画像更新脚本: process_user.py ,redis数据更新脚本:update_redis.py - 将上面三个脚本穿起来的shell脚本:
offline_material_and_user_process.sh - 使用
crontab 定时任务,每天凌晨1点执行shell脚本
|