最好走的路越走越难,最难走的路越走越容易

Follow guwendong on Web
  • Subscribe to Beyond Search via RSS
  • Follow @clickstone on SinaWeibo
  • Join Resys Google Group
  • Follow @clickstone on Douban
  • Follow @clickstone on Twitter

Tag Archives: taste

Taste/Thoth:Taste Architecture 概览

Taste有着非常清晰的程序架构。看图说话,下面就是一个 User-based Recommender 的例图,说明了各个组件之间的关系。而对于一个 Item-basedRecommender,除了不需要使用 PreferenceInferrer 和 Neighborhood 之外,和下图描述的基本架构是非常类似的。

作为一个协同过滤推荐引擎,Taste 包含下列基本要素。

  1. 用户:即上图中的 User,Taste 组件依据用户的偏好信息向用户进行推荐。
  2. 推荐项:即上图中的 Item,每个用户都会对多个 Item 进行偏好设定,比如打分。
  3. 偏好:即上图中的 Preference,每一条偏好数据记录的都是某个用户对某个 Item 的偏好程度。

从上面可以看出,偏好信息是推荐系统的基础,它总是以某种形式进行存储,即图中的 DataModel 和 DataStore。另外,原始的偏好信息可能并不能表示用户确切的偏好。举个例子,对于 5 分制的评分系统来说,有些人可能无论自己多么不喜欢,给的最低的评分都可能是 2分,并不是 1 分;另外一些人则可能正相反,最喜欢的也就给 4 分。还有一种情况,对于一个Item,给它评分的用户越少,通常那些用户越“相似”(我们可以理解为嗜好相同);如果评价的用户特别多,这些用户之间的相似度反而不好判断,对这类偏好信息通常可以直接忽略。为了解决诸如此类的问题,我们需要对那些原始的偏好数据进行处理,使数据标准化、差异扩大化,以求能够较真实地反应用户的偏好信息,这正是图中PreferenceTransform 要做的工作。
经过以上处理,我们就得到了一个 DataModel,一个已经标准化了的用户偏好信息。

对于 User-Based Recommender 来说,下一步,我们就是要找出与目标用户相似的“邻居”(Neighborhood)了。
首先要做的是得到描述目标用户和其它用户之间关系的集合(Correlation),然后从中选择最相似的用户。生成Correlation时,会指定一个推断规则(PreferenceInferrer),用来描述用户对那些自己没有明确表明过偏好的Item 的偏好值。在计算用户相似度方面,Taste 提供了皮尔森相关系数(Person CorrelationCoefficient)、余弦相似性(Cosine-basedSimilarity)相似度算法。有了最近邻的用户集合,就可以对目标用户的兴趣进行预测,生成推荐结果。

上面我们结合图描述了一个典型的 User-Based Recommender 的实现过程。总结并提取其中的重要对象,如下。

1、Recommender
Recommender 是 Taste 中的核心对象。给定一个 DataModel,Recommender就可以生成生成对应的推荐结果。通常情况下,你只需要简单的选择使用 GenericUserBasedRecommender 或者是GenericItemBasedRecommender 这两个 Recommender 接口的具体实现即可。另外,还可以通过CachingRecommender 包装使用他们,以提升效率。

2、DataModel
DataModel 是包装用户偏好信息的接口。它的具体实现可以从任何数据源获取这些信息,当然,数据库通常是最常见的选择之一。尽管很多应用程序想编写一个他们自己的DataModel,但其实 Taste 已经提供了一个 MysSqlJDBCDataModel,可以经由 JDBC 从数据库中获取偏好数据。另外,Taste也提供了一个基于文件的 FileDataModel。
连同 DataModel 一起,Taste 使用 User、Item 和 Preference 这些概念来描述用户、推荐项和针对推荐项的偏好。自定义的DataModel 应该实现这些接口以和应用程序匹配--比如一个 OnlineUser 代表网上商店的用户,一个 BookItem 代表一本书。

3、PreferenceTransform
PreferenceTransform 以某种方式改变偏好的值,通常是将其标准化,或者将其差异扩大化。PreferenceTransform 大多数情况下与DataModel 一起使用。

4、UserCorrelation, ItemCorrelation
UserCorrelation 定义两个用户之间相似的程度。这是推荐系统中至关重要的一个部份,与 Neighborhood 的实现相关。
ItemCorrelation 也是类似的,只不过它用来描述两个 Item 之间的相似度。

5、Neighborhood
在一个 User-Based 推荐系统中,推荐的意思就是去寻找与给定用户相似的“邻居”。UserNeighborhood描述了如何去选择那些“邻居”――比如,最相似的10个用户。具体实现时通常需要对 UserCorrelation 进行操作。

Taste/Thoth 系列
1)开源的推荐系统引擎
2)TasteArchitecture 概览
3)暂时还没想好,可能会写个例子,或者是把核心组件详细分析一下。看情况定吧~~~

Beyond.Thoth onsf.net,http://sourceforge.net/projects/beyondthoth/
Beyond Thoth Group ongoogle,http://groups.google.com/group/BeyondThoth/

 

Taste/Thoth:开源的推荐系统引擎

Taste 是非常棒的一个推荐系统核心引擎,sf 上可以下载到 Taste 的最新版本。Taste 同时也是 2007 Google Summer of Code 里的一个项目。当初学习推荐系统开发的时候,遍搜网络,这个是我个人找到的最全面最完整的一个开源包。细读代码之后,虽然没有 Lucene 曾经带给我的那种震撼,但也绝对可以称得上是开源世界里的上佳之作!经常有朋友发 Email 希望我介绍一些推荐系统相关的资料,这个是我必然推荐给大家的一个。

下面翻译自 Taste 文档的 Overview 部分。

Taste 是使用 Java 语言开发的一套灵活、快速的协同过滤引擎。他根据用户(Users)对某些项(Items)的偏好(Preferences),来推断用户对其他一些项的偏好程度。举个例子,一个出售书籍或CD的在线零售商(比如amazon/dangdang/joyo),使用 Taste 引擎,可以方便地依据已有的购物篮数据,为用户推荐他可能感兴趣的书籍或CD。
Taste 提供了丰富的组件集,基于其中的算法,你可以定制出自己的推荐系统。Taste 从设计上就力求能够满足于企业级的要求,效率、可扩展性与灵活性是它的设计目标。它为基于 J2EE 的应用提供了一个标准的 EJB 接口。但 Taste 并不是仅限于 Java 平台。它能够以独立 Server 的形式运行,通过 Web Services 和 HTTP 方式向其它(语言开发的)应用程序提供推荐逻辑。
Taste 的顶级包里抽象出了下面这些核心接口。

comp.planetj.taste.impl 命名空间下,有这些接口的实现代码。从这些核心接口开始,你就可以搭建你自己的推荐引擎了。简而言之,这就是 Taste!倾向于学术的,Taste 可以支持 Memory-based(即我之前 blog 里提到的 User-based) 和 Item-based 两种推荐形式,提供了包括 Slope One 在内的一些算法的实验性实现。Taste 目前尚不支持 Model-based 推荐。

2007年6月30日,Taste 发布了其最新的一个版本 1.5.5。在这个版本里面,甚至还包含了针对 Netflix 数据的一个实验包。不得不说,Netflix Prize [1] [2],真的是一个双赢的活动!本来,推荐领域已经冷清了有些日子,其中一个很大的原因就是大家做实验的基础只有 GroupLens/EachMovie 这两个数据源,搞来搞去想突破也不容易了。Netflix 公开他的数据,使做 Research 的学者们拿到了宝贵的 big data,终于可以跳出 GroupLens/EachMovie 的框框了。随着基于 Netflix 数据所取得的最新研究成果不断出现,无疑会不断促进着推荐技术下一个热潮的到来。与此同时,学者们的积极参与,也使得 Netflix 越来越接近于其追求的推荐准确率,并且,通过媒体的广泛报道,Netflix 也赢得了高知名度和好的口碑。说实在的,用 1M$ 买到如此多最新的技术成果,同时又获得了不小的商业收益,这个买卖真是值了!

去年,我试着给 Taste 的作者发过几次 Email,希望能加入到 Taste 的开发 Team 里,可一直没有收到任何答复。今年年初,在 Google Summer of Code 上又申请了一次,仍然没有回应。始终入不了高人的法眼,说明自己差距还很大啊。要说开源的推荐引擎,Java 下最多,PHP 有个 Vogoo,Python 下零零散散的也能找到一些,唯独 .Net 下基本没有。基于上两方面的原因,我和一个好朋友商量,准备把 Taste 移植到 .Net 平台下。一来通过移植代码,加深自己的理解;二来也算是为 .Net 社区做点儿贡献,哈哈。

我们的项目暂时命名为 Beyond.Thoth,之所以没有叫 Taste.Net,主要是因为我们打算逐步加入自己的一些实现。改名这事儿对 Taste 可能有些不敬,但我们会在代码里面,明显标出对 Taste 的引用。目前核心代码已经移植完毕,正在进行算法的准确性验证和性能调优。资源在这里,目前还是空的,有发布后我会第一时间在 blog 里通知各位朋友。

预报:Taste Architecture 详解。

 

ResysChina 发起人
1. 持续关注 个性化推荐 技术;
2. 持续关注 Semantic Web 技术;
3. 评论与上两项相关的互联网业务与产品;

我相信技术的力量!
wendell.gu@GMail.com

Archives