当今互联网信息呈现爆炸式增长,简单的人工筛选、物料召回的运营方式已无法让资源快速变现,通过用户历史行为、用户画像精准推荐用户感兴趣内容已成为必然趋势,主流个性化推荐系统流程包括用户行为采集、分类提取、离线用户建模、在线用户模型预测等。结合目前主流推荐业务发展需求,从无到有搭建一套个性化推荐系统支撑专区App分发业务。
构建一套完善的推荐系统涉及到的主要业务流程及核心模块,具体流程如下图所示:
将文章、用户属性等状态数据,以全量或增量模式从MySQL存储导入到Hive中
数据收集主要通过应用APP或者应用Web埋点或者通过线上任务上报到DataBank来完成,主要收集指标包括:
埋点事件 | 事件ID |
---|---|
曝光 | exposure |
点击 | click |
浏览时长 | read |
收藏 | collect |
分享 | share |
埋点日志数据结构如下:
{
"actionTime":"2019-04-10 18:15:35",
"readTime":"",
"channelId":0,
"param":{
"action":"exposure",
"userId":"2",
"articleId":"[18577, 14299]",
"algorithmCombine":"C2"
}
}
通过Flume将日志定时并增量收集与结构化存储到 Hive中
文章画像,就是给每篇文章定义一些词。主要包括关键词和主题词。
关键词:文章中权重高的一些词。
主题词:是进行规范化处理的,文章中出现的同义词,计算结果出现次数高的词。
关键词:TEXTRANK计算出的结果TOPK个词以及权重
主题词:TEXTRANK的TOPK词 与 ITFDF计算的TOPK个词的交集
hive> desc article_profile;
OK
article_id int article_id
channel_id int channel_id
keywords map keywords
topics array topics
hive> select * from article_profile limit 1;
OK
26 17 {
"策略":0.3973770571351729,"jpg":0.9806348975390871,"用户":1.2794959063944176,"strong":1.6488457985625076,"文件":0.28144603583387057,"逻辑":0.45256526469610714,"形式":0.4123994242601279,"全自":0.9594604850547191,"h2":0.6244481634710125,"版本":0.44280276959510817,"Adobe":0.8553618185108718,"安装":0.8305037437573172,"检查更新":1.8088946300014435,"产品":0.774842382276899,"下载页":1.4256311032544344,"过程":0.19827163395829256,"json":0.6423301791599972,"方式":0.582762869780791,"退出应用":1.2338671268242603,"Setup":1.004399549339134} ["Electron","全自动","产品","版本号","安装包","检查更新","方案","版本","退出应用","逻辑","安装过程","方式","定性","新版本","Setup","静默","用户"]
Time taken: 0.322 seconds, Fetched: 1 row(s)
hive> select * from textrank_keywords_values limit 10;
OK
98319 17 var 20.6079
98323 17 var 7.4938
98326 17 var 104.9128
98344 17 var 5.6203
98359 17 var 69.3174
98360 17 var 9.3672
98392 17 var 14.9875
98393 17 var 155.4958
98406 17 var 11.2407
98419 17 var 59.9502
Time taken: 0.344 seconds, Fetched: 10 row(s)
hive> desc textrank_keywords_values;
OK
article_id int article_id
channel_id int channel_id
keyword string keyword
textrank double textrank
hive> select * from article_profile limit 1;
OK
26 17 {
"策略":0.3973770571351729,"jpg":0.9806348975390871,"用户":1.2794959063944176,"strong":1.6488457985625076,"文件":0.28144603583387057,"逻辑":0.45256526469610714,"形式":0.4123994242601279,"全自":0.9594604850547191,"h2":0.6244481634710125,"版本":0.44280276959510817,"Adobe":0.8553618185108718,"安装":0.8305037437573172,"检查更新":1.8088946300014435,"产品":0.774842382276899,"下载页":1.4256311032544344,"过程":0.19827163395829256,"json":0.6423301791599972,"方式":0.582762869780791,"退出应用":1.2338671268242603,"Setup":1.004399549339134} ["Electron","全自动","产品","版本号","安装包","检查更新","方案","版本","退出应用","逻辑","安装过程","方式","定性","新版本","Setup","静默","用户"]
Time taken: 0.322 seconds, Fetched: 1 row(s)
用户画像,业界有两种截然不同的解释:
- User Persona,用户角色:Persona是真实用户的虚拟代表,是建立在一系列真实数据之上的目标用户模型。通过调查和问卷去了解用户,根据他们的目标、行为和观点的差异,将他们区分为不同的类型,并从中抽取出典型特征,赋予其名字、照片、人口统计学要素、场景等描述,就形成了一个Persona。用户角色是用户群体属性的集合,不需要指代特定的谁,而是一个目标群体的"特征"组合。
- User Profile,用户画像:用来描述用户数据的标签变量集合。User Profile主要用来描述单个用户的不同维度的属性,也可以用来描述一个用户群体。应用中主要描述的是User Profile。
用户画像的核心工作,就是给用户打标签。标签通常是人为规定的高度精炼的特征标识,如年龄、地域、兴趣等。通过从不同维度上对用户进行标签刻画,我们便得到了对用户的整体全貌描述。如下图,一般用户画像的维度主要包括:
(1) 基础属性:是指较长的一段时间内,不会发生变化(如性别),或者不频繁变化(如年龄每年增加1岁)的属性。标签的有效期都在一个月以上。
(1) 用户兴趣:指用户在一段时间内的行为倾向性;比如用户在过去一周内频繁搜索手机相关的信息、查看手机比价等,则推测用户有"手机"类兴趣,这类兴趣随时间变化很快,标签有很强的时效性,我们一般称之为短期兴趣或者商业即时兴趣;如果用户在过去较长一段时间内(比如连续一年或者更久)都比较关注宠物等相关的信息,则推测用户有喜欢"宠物"的长期兴趣。
不同的业务场景对用户画像的诉求都不一样,我们需要根据自身实际业务需求,构造符合自己业务场景的用户画像体系。但是像基础属性类的数据,比如年龄、性别、学历、婚恋等,则没有必要每个业务都投入人力重复建设。
文章特征包括文章关键词权重、文章频道以及文章向量,我们首先读取文章画像
文章关键词及其权重已在“文章画像”中通过TEXTRANK求得,本节首先通过word2vec求出文章向量,文章向量可用于计算文章相似度。
召回层:负责从数以百万的物品中快速地找到跟用户兴趣匹配的数百到数千个物品
排序层:负责对召回的物品打分排序,从而选出用户最感兴趣的top K物品
召回层在为排序层缩小排序范围的同时,也决定了推荐效果的上限。如果召回的内容不够准确,再厉害的排序模型也无法返回一个准确的推荐列表给用户。因此召回层很重要。常用的召回方法可以分为基于内容的召回和基于行为的召回。两种召回方法各有自己的优缺点,相互补充,共同提升召回的质量。
目前,不同场景下可选用不同的召回方法:
排序主要分为精排和粗排2个阶段,二者主要的区别在于候选集的量级不一样,粗排输入候选集在1千级别,精排只有1百级别。候选集的数量差异决定了粗排在性能上要求会更高,因此在特征上只能选取粗粒度、区分度较高的少量特征,而模型侧也只能选择线性模型,或者复杂度较低的深度模型。粗排其他部分的工作和精排比较类似,这里着重介绍精排。
精排阶段需要对粗排候选池中的ItemList进行打分,这个分数是针对每个用户对候选文章点击概率的预测,即Ctr预估。业务中每天有千万级别的活跃用户,这些用户的每一次刷新、点击、转发、点赞带来了海量的真实数据,我们需要利用这些海量日志来进行模型训练以建模用户的喜好。