构建企业级推荐系统:算法、工程实现与案例分析
上QQ阅读APP看书,第一时间看更新

4.4.4 为用户生成个性化推荐

有了前面的基础,最后一步就是为用户做推荐了,计算的过程简单说明如下。

用户U对标的物s的评分R(U,s)可以采用如下公式计算:

其中t是用户操作过的标的物,score(U,t)是该用户对标的物t的评分(即图4-8中UAction数据结构中的评分r),sim(t,s)是标的物t和标的物s之间的相似度,可以采用如下公式计算

其中,Pair(t,s)就是标的物关联表CR中(t,s)对应的得分,Pair(t,t)和Pair(s,s)同理。

在计算完用户U跟所有标的物的得分之后,通过对得分降序排列取topN最相似的标的物就可以作为U的推荐了。当标的物量很大(特别是新闻、短视频类产品)时,实时计算压力还是非常大的,这时可以采用一个简单的技巧,我们事先从CR表中过滤出与用户行为表中至少有一个标的物t有交集的标的物s(即标的物对(t,s)得分不为零),只针对这部分标的物计算R(u,s),再从这些标的物中选择得分最大的topN推荐给用户。为什么可以这么做呢?因为如果某个标的物s与用户行为标的物集合无交集,那么根据计算R(U,s)的公式,sim(t,s)一定为0,这时计算出的R(U,s)也一定为0。

上面对如何针对一个用户进行实时计算协同过滤推荐做了讲解,如果在一个时间窗口W中有若干个用户都有操作行为,那么可以将用户均匀分配到不同的Partition中,每个Partition为一批用户计算推荐。具体流程可以参考图4-9。为每个用户计算好推荐后,可以插入一份到HBase中作为一个副本,另外还可以通过Kafka将推荐结果同步一份到CouchBase集群中,供推荐Web服务为用户提供线上推荐服务。

图4-9 在同一时间窗口W中为多个用户生成个性化推荐

近实时的协同过滤主要用于对时效性要求比较高的产品形态,比如新闻、短视频等应用。这些应用的标的物更新快,用户消耗一个标的物(读一篇文章、看一段短视频)所花的时间较短,这类应用一般是用于填补用户的碎片化时间的。而对于电商、视频等产品,近实时的协同过滤不是必须的。

上面讲解的只是近实时协同过滤的一种实现方案,其实近实时协同过滤有很多可行的实现方案,我们的实现方案跟本章参考文献[6]中的covisitation counts方案思路本质上是一致的。读者也可以阅读本章参考文献[5],腾讯给出了另外一个利用Storm来实时实现协同过滤的方案,思路是非常值得借鉴的。另外本章参考文献[6]中Google实现了一个新闻的协同过滤算法,通过MinHash算法基于用户行为来近实时计算用户相似度,最终通过类似基于用户的协同过滤的算法来为用户推荐,这一方法在第5章会详细讲解。本章参考文献[7][8]也对如何增量做协同过滤给出了独特的方法和思路。