简介:这篇论文介绍了google news推荐系统的实现。在用户量很大的前提下,原有的推荐算法适用性较差,需要对其进行改进,例如使用mapreduce,bigtable等技术提高运算速度,综合考虑多种推荐算法等等。
下面是一些要点:
1、处理google news的一些难点
-scalability:google news访客较多,新闻数据也较多
-item churn:物品(新闻)会动态变化,模型需要不断重建,这是一个非常费时的任务,对于google news来说,每分钟都会产生很多新闻,模型超过一段时间后效果会变差
2、google news的一些假设
这里假设用户点击某一条新闻即表示对该新闻感兴趣,之所以可以这样假设,因为google news前端页面已经显示了文章的摘要,用户能够了解这篇文章的大概信息,如果点击该新闻即可证明对此新闻感兴趣。
3、问题表述
对于N个用户,u={u1,u2,...uN}和M个物品(文章)S={s1,s2...sm},给定一个用户的浏览记录集合Cu,{s1,s2...si|cu|},推荐K个用户感兴趣的文章。
同时要求服务器的响应时间要短,服务器要做的事情如下:对新闻聚类;针对HTTP请求返回HTML内容;推荐系统产生推荐列表。比较下来
4、基于内存的算法
该算法根据用户过去的评价进行推荐,为此需要计算用户之间的相关性,w(ui,uj)矩阵衡量的就是任意两个用户的联系性,对于一个用户ua,他对于文章sk的评分如下:
I(ui,sk)为1表明用户ui点击过sk。当计算得到的评分超过一定阈值后就可以假定用户ua喜欢文章sk。但是这个方法最大的问题就是可拓展性较差,由于所有数据要放入内存,当数据量较大值无法使用此方法。
5、基于模型的算法
此方法依据用户之前的评分为该用户建立模型,使用模型预测那些未被评价过的物品(协同过滤就是这种方法)。这种方法的缺陷是把每一个用户划分到一个指定的类别中,实际情况是用户对于不同的主题可能有不同的喜好,无法划分到一个指定的类别。
6、本文提出的算法
本文提出了的方法是对基于内存和基于模型的方法的结合,首先可以假设用户对于文章的评分正比于下面两个因素:
其中w(ua,ci)代表用户ua属于类别ci的程度。
6-1、Minhash
衡量两个用户之间的相似度可以用他们的交集来表示,也被称为Jaccard 相似度
用户uj看过的新闻对于用户ui来说有s(ui,uj)的吸引力。
在计算的时候,可以使用LSH来缩减数据规模,其中LSH的思想就是相近的数据在哈希过程中更有可能产生冲突,具体查看这篇文章:
http://my.oschina.net/sulliy/blog/78777
在hash时可以使用p个hash连结函数,于是用户之间的相关性为s^p,这样保证类别更多同时保证同一个类别中用户的相似度更高。为了提高recall值,可以并发处理,让用户映射到q个类别,针对每个类别用p个hash连结函数。
同时,在Minhash中也可以使用mapreduce的思想,在计算p*q minhash值的时候进行分布式计算,最终得到的是每一个类别id,其中包含属于该类别的用户id
6-2、PLSI
PLSI把用户和物品看成随机变量对其建立模型,对用户和物品的联合分布建立混合分布模型,引入一个隐藏值Z来表示这种关系。混合模型如下:
具体查看这篇文章:
7、计算新闻的推荐度
在计算一个新闻的推荐度时,首先获取用户所在的类别,查看属于该类别的用户组点击该新闻的次数(考虑时间效应),然后把这些次数加起来计算推荐评分。推荐值需要标准化,介于0到1之间。
8、Covisitation
Covisitation定义为同一个用户在一个时间段内点击两篇文章的事件。这样就可以在sj和sk之间建立联系,不过为了时效性,可以把用户的点击行为限定在几个小时或几天内。
9、系统架构
系统架构由三个部分组成:离线部分用于根据用户的浏览记录对用户进行定期聚类;一系列在线的服务器执行在用户点击时更新用户和文章统计信息,给用户返回推荐信息;两种类型的数据表-UT(以用户ID作为索引存放用户点击历史和聚类信息)和ST(以文章ID作为索引存储文章直接的点击情况和文章类别信息)。结构图如下:
对于UT,需要存储两种信息:
cluster info:一个列表,存储着用户属于类别ID的PLSI和Minhash
Click history:用户点击过的新闻id
对于ST,也需要存储两种信息:
Cluster statistics每个类别的用户点击了该文章的次数
Covisitation statistics:文章s和文章s’之间的covisit次数
上图的NPS计算推荐值时依据的是基于MinHash和PLSI的文章类别值,加上文章直接covisitation值。也就是三个推荐值的叠加。