推荐引擎利用特殊的信息过滤技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社会或社团环境。
常用的推荐的方式主要有两种:
这句话的理解可以用一个简单的例子来说明,假如说这里的项目指的是各种书籍,那么推荐程序可以根据一个用户对所关注的书籍的各种属性做一个分析,分析出此用户到底喜欢如何类型的书籍,比如说是关于历史的,通过对这种喜好的分析,程序就可以找到与该用户有相同喜好的用户,即也同样喜欢历史类书籍的用户,假如找到的用户不光喜欢历史类的书籍,并且喜欢科技类的书籍,那么程序会尝试将该类书籍推荐给这个用户。
当然程序的分析可能比这要复杂得多,但是可以这样简单的来理解。
同样这里的项目我们可以理解为书籍,项目间的相似度可能通过多种属性对比而来,比如说书籍的分类,价格,作者等等相关属性。根据此类属性来找出与该书类似的书籍,来直接推荐给用户。这里如果项目的信息量比较大会影响在线推荐的执行效率,因为项目一般变动周期可能不会十分频繁,切参数的更换也不会非常频繁,所以项目之间的相似度可以周期性的计算并存储,然后供推荐程序调用,来提高推荐程序的运行效率。
主要推荐方式分为此两种类型。所有推荐利用的算法最终都需要计算用户及其评分项目之间的相似度。可以通过许多方法来计算相似度,并且大多数 CF 系统都允许您插入不同的指标,以便确定最佳结果。这里的不同的指标有待进一步研究,这里的指标应该可以自定义筛选的范围,以及筛选的规则。
Mahout 目前提供了一些工具,可用于通过 Taste 库建立一个推荐引擎 — 针对 CF 的快速且灵活的引擎。Taste支持基于用户和基于项目的推荐,并且提供了许多推荐选项,以及用于自定义的界面。Taste 包含 5 个主要组件,用于操作 用户、项目 和 首选项:
基于项目相似度的推荐的部分代码,其中带注释的部分为其的关键代码:
public class ItemBasedRecommender implementsRecommender {
privatefinal Recommender recommender;
publicItemBasedRecommender() throws IOException, TasteException {
this(newMovieDataModel());// 初始化一个数据模型
}
publicItemBasedRecommender(DataModel dataModel) throws TasteException {
// 取得所有电影数据的相似度数据
Collection
MovieSimilarityTable.getAllMovieSimilarities();
// 根据相似度数据生成一个相似度对象
ItemSimilarity itemSimilarity = new GenericItemSimilarity(correlations);
// 根据电影的数据模型,和相似度来生成一个推荐对象,可以利用此对象设置相关参数来给用户做电影的相关推荐,此推荐是基于电影的相似性来计算出来的。
recommender = new CachingRecommender(new EmbededItemBasedRecommender(
newGenericItemBasedRecommender(dataModel, itemSimilarity)));
}
publicList
throwsTasteException {
returnrecommender.recommend(userID, howMany);
}
.........
//EmbededItemBasedRecommender类的定义
privatestatic final class EmbededItemBasedRecommender implements Recommender {
//包含一个GenericItemBasedRecommender实例;
privatefinal GenericItemBasedRecommender recommender;
privateEmbededItemBasedRecommender(GenericItemBasedRecommender recommender) {
this.recommender = recommender;
}
publicList
Rescorer
throws TasteException {
FastIDSet itemIDs =recommender.getDataModel().getItemIDsFromUser(userID);
return recommender.mostSimilarItems(itemIDs.toArray(), howMany, null);
}
........
}
其他基于用户的相似度的推荐,与其十分类似。