推荐算法在「微信读书」上的应用

微信读书是市场上很欢迎的电子书籍阅读APP, 每天唤醒的用户接近500万,并且还在快速增长,增长速度取决于投放的力度,APP的阅读体验和推荐的质量。用户可以通过搜索购买自己喜欢的书籍关系链用户的阅读行为进行筛选阅读。我们有无限卡和其他活动的形式吸引和鼓励用户阅读。

除了前述几种方式以外,用户很难再有其他方式发现更多有趣的书籍和文章,因此,猜你喜欢和故事流应运而生,我们利用用户在APP内的阅读、关注、分享、关系链等信息,结合机器学习和深度学习算法,为用户推荐最符合兴趣书籍,公众号。除了文章和书籍以外,也接入了腾讯视频,大大丰富了推荐的内容多样性,当然我们也还在不断地优化我们的展示形式和推荐算法以及推荐架构。

前言

微信读书猜你喜欢包括书城猜你喜欢卡片栏目的为你推荐故事流则是融合书籍,公众号以及视频的feed推荐。推荐系统的质量直接影响着用户的留存和用户在APP停留时长,如何利用用户已有的行为信息打造一个合适的推荐系统显得至关重要。接下来将详细地讲解APP的书籍推荐算法以及后台推荐的架构是如何设计

推荐算法在「微信读书」上的应用_第1张图片

 

书城猜你喜欢

 

对于如何构建书籍和公众号的item similarity,这里不再赘述构建算法。我们的后台服务架构也是相对简单,大致如下:

推荐算法在「微信读书」上的应用_第2张图片

 

初期,我们并没有引入用户的实时行为,这里的时候行为包括:用户点击某本书,某个公众号或者阅读书籍的相关信息。一开始依赖的是T+1时刻用户的阅读统计。显而易见,收的成效是大打折扣的,后面随着kv的支持升级,我们把用户的实时的行为引入到我们的推荐逻辑,点击率也得到了比较大地的提升。这里并没有引入复杂的MQ的机制,在模型不需要实时更新的情况下,我们采取了一种折中的方案:我们把用户实时行为直接的存储在paxos kv,结合用户的阅读历史以及一些运营的规则进行了推荐。对于新书的推荐,由于推荐栏的条数限制,一开始利用书籍本身的tag和分类做了一些average embeding,考虑栏目条数限制和点击率,后面边去掉了新书推荐的逻辑。在书城的其他栏目我们给以了新书一些曝光机会。

卡片为你推荐

卡片为你推荐,一开始我们也只利用了用户的最近阅读和点击行为来进行相似推荐,后面观察到不同年龄性别的用户对书籍的阅读欲望是不同的:

推荐算法在「微信读书」上的应用_第3张图片

我们将用户的basic profile嵌入到我们的模型中,具体的嵌入模型如下:

推荐算法在「微信读书」上的应用_第4张图片

 

模型训练完之后,我们print出用户的画像详细信息,格式(profile_$sex_$age),可以发现模型is working:

推荐算法在「微信读书」上的应用_第5张图片

我们尝试了concat和直接avg sum的方式,发现sum的方式表现优于concat。对比点击率效果(号段8)对于如下:

推荐算法在「微信读书」上的应用_第6张图片

我们对于用户的最近阅读和点击行为做了热度和时间的加权惩罚得到一个 user recent interest embeding,然后通过LSH server进行了相关推荐,整体的架构如下:

 

推荐算法在「微信读书」上的应用_第7张图片

故事流模块

故事流模块是APP近期上线的一个feed模块。主要涉及书籍,公众号文章和企鹅号视频的混合推荐。涉及的模块比较多,首先来看下初期整体的推荐架构设计:

推荐算法在「微信读书」上的应用_第8张图片

 

我们最底层采用了经典的召回、粗排、精排(暂时处于离线)三层结构。值得一提的是在架构中大量的引入了用户实时行为召回模块,包括跨类型的相互召回,主要考虑是用户短期对同一话题感兴趣程度更大。例如,用户在看完NBA相关的书籍,可能在feed上希望看到关于NBA topic的视频和公众号。目前我们不同类型的混排是简单的基于用户最近在不同内容类型的表现来采样条数,可以简单的理解为bandit算法,这里后面还有优化空间,目前考虑时间和后端存储迭代等因素,并没有引入太复杂的混排算法。

 

item数据和user数据是推荐系统的天花板所在。推荐系统无非就是根据用户的兴趣从大量item中挑选最可能的topN条结果。对数据刻画得越准确,越细致,数据的表达能力越强,推荐也越精准。从整体上看,数据可以分为用户数据和内容数据。

1. item基础数据处理(内容数据)

对于内容侧,我们引入了一系列的入库流程处理,包括分词,抽取tag,计算item embeding, 计算基于content based item's similar items。这里的similar items包括跨类型的相似信息。旨在捕获用户的实时行为,提供准确的item召回。整一个内容入库处理流程大致如下:

推荐算法在「微信读书」上的应用_第9张图片

 

对于分词,我们对比了jieba segment, 公司的qq_segment tool 和 清华大学开源的thulac分词算法。考虑到入库的量和处理时间,我们最后选择了thulac算法,在对文章分完词后,我们引入了tdidf和textrank算法了综合计算文章的key words。值得一提的是,我们在分词字典和idf.txt中引入了大量的视频tags,书籍名,jieba的idf字典和网上的开源词库,取得了不错分词成效,整个处理流程可以对新入库的item实时计算相似的item。对于word to embeding,我们则使用的是ai lab开源的800万的embeding加上一些后期处理。item的相似信息,则是通过python annoy server实时计算,计算得到的相似信息存在到paxos kv 和 hdfs,供实时召回和离线分析。 

从整体的点击率来看,实时的相似item召回取得的效果是最佳的,在公众号,视频,书籍都取得了相同类型召回前几的成效。

 

2. user画像的构建

用户画像的构建包括用户的视频二级分类画像,用户的兴趣公众号,用户的兴趣文章二级分类,用户的书籍阅读和书籍点击画像构建,用户的相似用户和用户影响力关系链构建。

  • 用户的公众号画像构建:在APP内,我们有用户书架公众号,阅读过的文章,点赞过的文章,收藏过的文章,分享过的文章,我们可以刻画出用户的公众号感兴趣程度,此外我们还根据相似公众号扩展用户的公众号画像。对于用户的公众号二级分类画像,我们则根据用户对公众号的历史行为进行离线计算好后写入kv。

  • 用户的书籍画像:APP内积累最多的就是用户的书籍阅读和点击行为,根据阅读时间的加权和相似书籍的扩展,我们便拥有的了用户的书籍兴趣画像。

  • 用户的视频冷启动画像:一开始根据用户在APP积累的公众号行为,通过训练视频的二级分类的bert模型分类用户的公众号文章历史行为得到用户的视频冷启动画像。对比一开始的随机的推荐,也有不少的点击率提升。这里需要指出的是视频和公众号的分类体系并不一致,企鹅号视频自带了一套二级分类体系,文章的分类体系则使用了搜索的文章分类模型。

  • 用户的关系链影响因子链:对于用户的实时行为,将用户在流的点赞评转行为扩散到关系链用户,作为备选召回集之一。

  • 相似用户计算:我们并没有采取典型的user cf方法来计算,考虑到用户的量和相似矩阵的weight难以刻画。这里采取较为取巧的一种方式,利用用户在APP积累的阅读书籍时间和最近一次阅读时间,以及书籍的流行度来综合计算一个用户的embeding,最后通过LSH的算法计算相似用户,取得了很不错的线上效果。过程中,我们尝试构建过用户和书籍的二部图的方式,以用户的阅读时间来作为二部图的权重,通过node2vec graph embeding算法来计算user和item的embeding,最后取得的效果无论是在item的相似还是user相似都不尽人意。

 

3. offline 排序模块

典型的推荐系统,排序是一个直至关重要的模块,在架构发展的初期,我们没有针对每一个请求都进行一次排序,其中的原因多种多样(没有积累足够的用户行为,目前的推荐架构暂且不支持加入复杂排序模块),这里我们采取了一种折中的方案,我们针对用户的行为,进行了T+1的召回排序然后写入线上的kv队列进行推荐。目前,我们在公众号和视频进行了尝试,取得了不错的成效,我们根据用户最近的点击和阅读时间等行为进行了离线召回,包括二级分类的召回和内容的avg embeding召回,之后加入了deepfm模型作为排序模块。

我们利用过去一个月的用户视频点击日志构建训练样本,以AUC作为评价指标构建二分类模型;再用召回视频队列构建测试集,输入到训练好的模型中进行排序,输出最终结果。

推荐算法在「微信读书」上的应用_第10张图片

 

  • deepfm输入特征:我们结合了user和item两个方面考虑进行模型训练。

  • user特征:用户二级分类的累计点击频次、用户点击最频繁的标签、年龄、性别

  • item特征:训练样本对应item的二级分类、tag、新闻标题长度、关键标点数

 

模型中的特征构建,主要出于以下两点思考:

  • 不含id类特征,只基于静态特征和标签类特征,这样的模型只需定期更新,扩充样本量即可(召回策略仍需每天更新)

  • 公众号文章和书籍也包括二级分类和标签特征,是的视频推荐模型容易迁移至公众号和书籍队列的推荐任务中

整个流程上线后,点击率和点击人数的变化如图所示,后续将继续进行优化。

推荐算法在「微信读书」上的应用_第11张图片

 

总结和展望

推荐系统是一个不断演变的系统,需要尽可能地balance用户的已有兴趣和潜在兴趣的探索。这是一个Exploration and Exploitation之间的如何达到balance难题。如何在保证用户感兴趣的条件下,尽可能探索用户潜在的兴趣是一个难以权衡的问题。一味的追求的点击率到后期导致标题党的诞生,模型朝着一开始教的方向越走越偏,同样的一味追求探索,可能会导致夭折在初期。最后感谢云加社区、技术架构部,搜索,企鹅号的大力支持。

 

 

你可能感兴趣的:(推荐系统)