spark3
作者:互联网
#################################
↗ 标签正排redis=默认召回=超期过滤=排序=默认推荐列表redis
↗相似文章列表=实时召回
新闻内容=kafka→内容分析 → 倒排索引
↘hdfs
↘ 内容去重===hdfs
浏览器客户端=日志采集服务器=kafka=流模型=短时画像=短时兴趣redis=短时兴趣召回=已推过滤=短时土建列表redis
=hdfs =批模型=长时画像=长时兴趣redis=长时兴趣召回=已推过滤=排序=长时推荐列表redis
冷启动: 热门召回+用户属性召回
redis标签正排:
docid url 链接
src 来源
channel 频道
publishTime 发布时间
titile 标题
category 分类|分数
location 地域
duplicateDocid 重复新闻id
keyTags 内容标签关键词
内容去重模块:
对kafka内容进行去重,包含基于docid完全匹配去重+基于标题,摘要等文本内容去重
5分钟Simhash算法去重流任务:
标题和摘要组成的Simhash距离不大于3
内容分析模块:
基于文章标签,正文,完成内容分析,将标签以正排形式存入redis,以倒排形式存入hbase
1.基于cp标签的内容分析
2.基于内容标签生成内容相似列表
相似内容文章计算:
1.根据文章标签(关键词和权重)应用simhash算法进行计算
2.关键词选取权重较大的topn;每篇文章计算出它的相似文章列表按照相似度(Hamming距离)排序
对文本先去打搅各种符号,乱码,超链接等等;
再用分词工具(hanlp)进行分词得到文章的关键词,docid:keyword1,keyword2
主题分析:分词后的文章,用LDA(lightLDA)给定该文章的主题
关键词抽取: 用tf/idf输出该文章的的标签, docid:tag1,tag2
[说明: ctype:一级分类,新闻,视频,图集; dtype:二级分类,无图,小图,大图,视频大图,视频小图....]
用户长期画像模块:
1.热点惩罚:热点新闻计算标签得分时进行降权处理
2.曝光惩罚:按天统计出用户曝光未点击的文章列表,对曝光但未点击的文章对应标签
3.用户内容兴趣偏好: userid|一级标签|得分||二级标签|得分|topic|得分|tags|得分
4.牛顿冷却实时偏好: 随时间偏好得分变小, score*e^-(当前时间-事件发生时间)a
5.用户所处生命周期标签生成: 新增用户,沉默用户,活跃用户
6.文章类型偏好生成:统计一级分类,二级分类的点击次数,曝光次数; 根据点击/曝光来确定用户文章类型偏好
7.用户行为特征生成: ①流量敏感/不敏感:过去一周不在wifi下访问次数
②刷新频率:过去一周推荐请求次数
③用户自然属性生成
接口:
用户长期内容偏好
用户自然属性生成
用户文章类型偏好
用户生命周期
曝光未点击
内容标签体系接口: 文章表:newsid,title,reason,tags,category,src,二级分类,三级分类,topics,pubTime,channel,文章类型,展示类型,视频播放时长,
用户实时画像模块
推荐引擎:
召回列表:
个性化列表:短时+长时+热点+地域
冷启动用户:热点+地域
默认列表: 推荐流程阻塞超时,或所有列表都为空
文章相似列表生成:
每篇文章基于simhash相似度计算得到该文章的相似文章列表
按天离线更新全量历史文章的相似文章列表
近线计算新增文章的相似列表
热门召回:
线下点击量统计:
流任务:5分钟点击量统计+小时点击统计 ===小时热门召回(分频道)
批任务:天,周点击量统计 ===天热门,周热门召回(分频道)
布隆过滤器已推过滤:
文章id找到发布时间,
bitmap按天存储,发布时间属于同一天的已推文章存储在一起;某个bitmap中文章的发布时间均超过7天,改bitmap会被删除
所以每个用户在redis中会同时存在8(过去7天)个bitmap
布隆过滤器已读过滤:
过去一个月的已读(指点击收藏,不喜欢,分享)文章存储一个bitmap
热搜写入:
①热搜从kafka传入,格式包含{标题,热度,来源,时间}
②hanlp对title分词, hbase表中有关键词对应KL值
③对redis已有旧热搜对比: 全新,相似,相同
④相同替换,相似合并,并给上hotid,重新写入redis
⑤用热搜的关键词从hbase表中取topN新闻,计算热搜关键词和文章正文的关联度得到:文章和热点关联分值
⑥再把redis中docid添上一个热搜字段hotid|hotscore, 这样文章就有了对应的热搜和分值
热搜召回:
①从redis获取热搜
②用热搜title从hbase表中匹配到文章(很多过滤条件:24小时内的,频道的..)
③召回列表写redis: keyrecall docid
#######################################
k-means算法: 首先输入k,目的是将所有点分成k簇; 首先选k个点,作为k簇的的质心,然后对集合中所有的点,计算其到这k个聚类中心的距离,与谁近就跟谁; 所有点分成k个簇,计算每个簇的质心,更新质心的值; 循环以上步骤,直到质心的变化小于某个设定的阈值时,即完成分类
Kmeans算法来对用户分群
ctr(click-through-rate)点击通过率: 点击/曝光
低质量文章过滤:
用户的主动点击负反馈:比如标题党,广告软文,低俗等
基于规则的低质量文章直接过滤
文章质量分数计算:①标题党词汇匹配②用户反馈的文章质量分③用户投诉(广告次数,质量差次数,低俗次数,标题党次数等等)
④用户不喜欢⑤ctr(点击/曝光)⑥用户阅读时长(1-用户平均时长/标准时长)
内容标签生成:
①tf-idf生成原始关键词+tfidf值
②用textrank算法计算关键词和权重,对tfidf值加权
③对原始关键词,通过word2vec模型计算相似度最高的几个关键词
④基于词特征进行评分更新
内容多样性:
非冷启动:
①兴趣召回:用户兴趣模型中抽取兴趣标签
②兴趣扩展:用户兴趣模型中抽取二级类别
③兴趣探索:在用户兴趣模型外抽取二级类别来做探索
④协同召回:根据用户所属群体,选一个群体标签
⑤地域召回:提取地域候选列表
⑥热点召回:提取热门候选列表
⑦相似召回:从上一刷有点击/收藏/转发/分享的每篇文章,从相似内容列表中按相似度随机抽取
⑧默认召回:兜底策略,在其他召回无法凑齐数量用来补齐
对上面多种结果进行整体调和,取最终的N(比如取10)篇:
策略顺序:相似-热点-地域-兴趣-扩展-协同-探索-默认
num_sim=上一有过行为的文章数
num_hot=max(0,min(h,N-num_sim)) 如果有热门可推令h=2否则为0
num_local=max(0,min(L,N-num_sim-num_hot)) 如果有地域可推令L=1否则为0
...
上面各种列表取几个得到最终N个,再按ctr排序,最后将热点文章放在最前面,即得到最终推荐列表结果
视频调和条件:同一刷中蜂窝最多一个视频,wifi最多2个视频
主题调和条件:同一刷中推荐的N条不能包含多篇讲同一主题的
人工运营干预:
最终推荐结果的排序是ctr排序:用户负反馈不喜欢调节系数ctr,内容质量调节系数ctr
最终推荐列表: userId doc1:hot#doc2:region#doc3:default
热点惩罚:热门推荐中,用户对热点文章总是不点击,就要惩罚,换其他热点推送
hbase表中存储精品文章,把默认列表和精品列表融合,精品放前
标签:spark3,标签,redis,用户,列表,文章,召回 来源: https://www.cnblogs.com/ShyPeanut/p/14395626.html