视频网站的推荐搜索引擎介绍

28 十月, 2011 (13:24) | J2ee企业顾问, OpenSource, 云计算, 分布式, 推荐引擎, 智能推荐, 架构设计 繁体 English    DeliciOus    分享到新浪微博
作者: H.E. | 您可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.javabloger.com/article/hadoop-dynamic-intelligent-recommendation-system.html
豆瓣读书 向你推荐有关 J2ee企业顾问OpenSource云计算分布式推荐引擎智能推荐架构设计、 类别的图书。

开场白
很久没有更新blog了 ,从5月份到现在中间发生了太多的事情,公司对我职位上的调整,让我每天需要处理的事情越来越多,近几个月来基本上很多时候难以静下心来去写一些东西,可是仍然想把一些在技术上心得给记录下来,不会因为写博客而且写,更不会直接转载网上的内容。最近在推荐搜索引擎和海量数据存储方面看了不少资料,正在准备项目中的实践,以下是一些总结和见解。

    在一个推荐系统中可以分析用户的行为,在后台对用户行为数据建模,经过分析去预测用户的喜好、向用户推荐。这里讲的动态,是因为用户的行为是跟时间有关系的,系统中包含了大量和时间有关的数据集合。现实社会是处于变化之中的,用户的喜好也在不断的变化着。
   系统中每天都会有大量的新用户,新的商品加入,按照时间段划分,一个用户在不同的时间段、不同的季节喜好的商品也会有所不同,一个好的智能推荐系统要满足以下两点:1.向用户推荐他们喜欢的内容;2.能够为内容服务提供商提升节目访问量。

     一个完整的推荐系统应该包括几大方面:用户界面、日志系统、推荐引擎。用户界面有两个作用,一方面给用户展示推荐结果,另一方面收集用户对推荐结果的反馈。收集到的用户反馈将通过日志系统写入用户行为数据库中,最后推荐引擎通过分析用户行为数据库中的用户行为,给用户生成推荐结果并展示在用户界面上。
 从这个循环可以看到,推荐系统是一个不断收集用户行为,不断更新用户兴趣模型,从而不断改善用户推荐结果的闭环反馈系统。如下图:


     推荐系统的用户界面设计在推荐系统中占有非常重要的作用,好的用户界面设计能够收集到更多,更明确的用户反馈,这对提高后面推荐引擎的准确性有至关重要的作用。日志系统在推荐系统中也有很重要的作用,在很多大流量的网站中,日志系统需要同时满足两方面的需求,一方面需要能够实时的将用户最新的行为写入到数据库中,另一方面需要能够快速的处理大量的数据存储。

     完整的推荐引擎包括离线系统和在线系统两部分。在线系统负责实时响应用户的请求,在线提取和分析用户行为并生成最终推荐结果。离线系统主要负责生成各种用户兴趣模型,视频相关度矩阵,存储在数据库中,供在线系统实时查询和调用。如下图:

协同过滤推荐算法(Collaborative filtering—CF)在推荐系统中是一个非常的组件,其中包含2种  :
   a.基于用户的(User-based-CF):此种算法假定用户更倾向于那些和他具有相同爱好的人喜欢的节目,
   b.基于内容的(Item-based-CF):此种算法假定用户更倾向于以前对他有用的节目类别。此种算法被广泛应用,如Amazon、Netflix。
这种算法有两个优势:1.适用于用户数远多于节目数;2.能够很容易的根据用户行为历史数据推荐当前节目。

五个主要的组成部分
1.建立用户信息:用户第一次进入推荐系统,系统会为他们建立个人用户信息。包括用户的历史行为、主题(分类)以及从那些来自以前行为的信息。例如,他们可以选择观看录像,添加节目到我的最爱,搜索录像,投票给录像和节目。所有这些行为都会被系统纳入考虑范围,将这些行为提炼,然后用成熟的主题模型离线生成用户对主题的喜好表。

2.推荐的核心:在生成关于主题和节目的用户喜好列表以后,将那些相似的节目放在源推荐当中。

3.过滤:由于一些显而易见的原因,源推荐不能直接推荐给用户。对于那些用户已经看过或者正在浏览的视频,从源推荐当中去除,从而使源推荐更准确。

4.排序模块:排序模块重新排列源推荐的顺序来使它们更好的符合用户的喜好。首先,让源推荐更多变化,然后增加源推荐的新鲜度,让用户发现他们喜欢但以前没看过的节目。

5.推荐解释模块:此模块是每一个推荐系统最重要的组件,解释模块对利用用户历史行为而产生的推荐结果给出解答。

这里要特别对推荐解释模块说明一下:推荐解释有很多优点,它可以增加用户对推荐系统的信任。当用户看到一个不靠谱的推荐结果时,根据推荐解释他会知道这个推荐是怎么产生的(由他以前的什么行为产生的),这样用户就会知道,如果需要好的推荐,他应该怎样反馈给系统,整体结构如图所示:

推荐系统离线组件 
上面的在线组件有些模块是基于离线组件的。如主题模型、关系模型,反馈模型等。离线系统也是整个智能推荐系统中一个重要的部分。

1.数据中心:数据中心存储所有用户行为数据。一部分存在Handoop集群中,另一部分存在RMDBS中。

2.关系表生成器:关系表对于在线推荐组件来说是份重要的资源。主要用到两种类型的关系表:一种基于协同过滤(CF),另一种基于内容。在CF如果用户喜欢视频A也喜欢视频B,视频A和视频B会有着高相似度;内容过滤,使用一些基本信息如标题、描述、频道、公司、演员和标签等。

3.主题模型:一组具有相似内容的节目称为一个主题(类别)。他的范围比节目大,但是比频道范围小。也就是说是在一个频道下面的一组相似节目的集合。这里使用的是线性判别分析算法(LDA)。

4.反馈分析器:反馈特指用户对于推荐结果的反馈。利用用户反馈可以很好的提升推荐质量,比如一个节目推荐给了很多用户,却很少有用户点击,那么就要降低这个节目的排序,用户有各种各样的喜好,可以根据这些反馈制定更合理的推荐排序。然而,有些用户会更喜欢那些来自之前观看历史的推荐,一些用户更喜欢来自投票结果的推荐。所有这些影响可以通过分析用户在推荐上的反馈而离线生成模型。

5.报告生成模块:度量(评估)是推荐系统最重要的一部分。它每天对系统推荐质量评估并形成一个多维的报告。如点击率、转换率

    基于内容的协同过滤算法(ItemCF)使我们所有算法的基础。在CF中,定义N(u)是用户u以前较喜欢的节目的集合,那么用户对于节目i的偏好可以用以下公式衡量:

 其中r(u,j)表示用户u对节目j喜爱的度,s(i,j)是节目i和节目j之间的相似度。在CF中,两个节目之间的相似度是根据两个节目的用户行为数据计算出来的,定义N(i)是观看过i节目的用户集合,N(j)是观看过j节目的用户集合,这样节目i和节目j之间的相似度s(i,j)可以用下列公式计算:

    在这个定义中,如果多数用户看过节目i,同时也看过了节目j,那么节目i和节目j就会高度相关。但是,这个定义会出现哈利波特问题(Harry Potter Problem),即每一个节目都会和那些受欢迎的节目高度相关,原因是由于Harry Potter这本书很火,买了任何书的人都会买这本书,那么所有的书和这本书都会很相关,从而使得相似度的结果不够合理,缺乏说服力。

还有一些问题也是值得我们去考虑的,例如:
1.最近行为:
    我们从分桶测试中了解到,用户最近行为比以前的历史行为在系统推荐的分析上更重要。分析的时候要放更多的权重在上面。
    
2.最新鲜的:    一个推荐系统能够准确的预知用户的行为,并不代表它只是单纯的将一个节目推荐给在线用户。比如一部家喻户晓的电影并不需要系统去推荐,完全可以由用户去决定看或者不看。因此,新鲜度也是评价一个推荐系统的重要指标。提高新鲜度的一个方法是修改基于节目的协同过滤算法。首先,对于那些观众已经观赏过的热门的节目,要减少其比重。其次,不仅要增加那些和活跃观众以前观赏过的类似的节目的比例,还要增加热度不及活跃用户以前观赏过的节目。

3.基于解释的多样性:大多数的用户有着多种喜好,推荐系统应该去迎合他们不同的兴趣。在系统中,可以用解释器去多样化推荐系统。可以通过分桶测试(A/B test)展示多样化的有效性。实验结果表明,对于看过十部节目以上的活跃用户,多样化能够显著的增加推荐视频的点击率。

4.时空多样性: 一个好的推荐系统不应该只生成一些静态的推荐推荐。用户希望在每次登陆的时候看到一些新的推荐。比如一位用户有了新的行为(新爱好、新类型),他应该发现对他的推荐有了一些改变,就像前面所说,要把比较多的比重放在用户最近的行为上。但是如果用户最近没有新的动态,那么我们的推荐也应该有所更新和改变。可以用一下几个方法保持推荐系统的时空多样性,例如:将每天最新的节目推荐给用户,这样用户每天能够看到最新的东西,总有部分用户会喜欢。随机的将节目推荐给用户,这是保持推荐更新的最简单的方法。最后,降低那些被用户点击或观赏了很多次的推荐的排名,我们称这为隐式反馈,数据表明,此方法使点击率上升了10%。

在Hulu.com中有一个Recommendation Hub的东东,其实就是系统给每个用户的个人推荐页面。系统认为的用户最喜欢的节目。最顶端的下面有三中不同类型的推荐,这些推荐是分析用户历史行为获得的。用户之前标注过以后希望观看(类似于收藏夹),最后一条传送带是用户已经评分过的视频,这条传送带是用来显式的收集用户的反馈。下面的图是Hulu.com进行的分桶测试结果,经验表明推荐系统使用的算法的点击率远远高于常见的普通推荐算法:观看最多的和评分最高的。

下图是对于不同类型行为推荐的点击率。

    每一个用户的行为能够反映其喜好。我们用大量的用户行为生成我们的推荐,上图中每一种行为反馈的点击率都可以生成用户可能会点击的推荐来。(我们看到最近观看的点击率比较高,系统就可以根据最近观看的类型、标签推荐最有可能被用户点击的节目)。

由此看来,显式反馈的显式数据比隐式数据更重要。如上图,从用户行为历史上看,来自钟爱和喜欢的推荐点击率高于对用户以往订阅/观看/搜索的推荐点击率。虽然显式反馈的数据量要小于隐式反馈,但是实际上它却是重要的多。用户最近的行为比以前的行为重要。新鲜度、多样性和离线精度都是重要的因素。大多数的研究人员聚焦在离线精度,如均方根误差、精度/检索。然而,能够准确预测用户某一单独行为的推荐系统可能不足以满足实际应用,一个优秀的推荐系统应该将多种因素结合在一起考虑。Hulu系统结合了新鲜度和多样性后,点击率提高了超过10%。

总结

1.直观的数据库排序:
   根据用户评价、或者点击率,这也是上面所说的两种最传统的方式。

2.浏览了该商品的用户浏览的其他商品
   延伸——浏览此商品的用户最终购买了商品的比例和购买本商品的比例,记录用户的行为,加入多样性的考虑

3.用推荐算法
    a.协同过滤:找到一个用户最感兴趣商品,方法是分析和此用户具有相同喜好的用户对什么最感兴趣。
    b.关联过滤:购买商品集X的用户有多少购买了商品集Y。

4.基于内容推荐:
   用到了决策树算法,比较各子树的权重,实现有难度!

一个好的推荐系统,有简洁而重要的内容,有推荐理由,而且推荐理由还具有多样性。同时还给出了用户反馈的方式方法,节目产品的推荐可以和广告结合在一起。不光要满足用户的需要,还要满足节目发布者、广告投放商的需要,同时推荐反馈的数据能够对系统有利,推动系统良性的发展。

 

–end–

豆瓣读书  向你推荐有关 J2ee企业顾问 OpenSource 云计算 分布式 推荐引擎 智能推荐 架构设计、 类别的图书。



Creative Commons License
本文由J2ee企业顾问-黄毅创作,并已采用创作共用署名2.5中国大陆版许可证授权。

评论

Comment from 东家
Time 2011年11月1日 at 4:07 下午

学习学习,增加知识

评论

评论也是有版权的!




6441