Mahout推荐器 - 为基于项目的推荐者添加基于内容的相似性

时间:2013-01-08 01:27:17

标签: mahout recommendation-engine mahout-recommender

我有一个非常标准的Mahout基于项目的新闻文章推荐器(使用点击数据,因此首选项是布尔值):

DataModel dataModel = new ReloadFromJDBCDataModel(
        new PostgreSQLBooleanPrefJDBCDataModel(localDB, ...)
);
ItemSimilarity itemSimilarity = new TanimotoCoefficientSimilarity(dataModel);
ItemBasedRecommender recommender = new GenericBooleanPrefItemBasedRecommender(dataModel, itemSimilarity);

我正在尝试将基于内容的知识注入到推荐器中,因此我最强烈推荐的文章不仅在正常的协同过滤意义上是相似的,而且在他们共享许多常用术语的意义上也是相似的。< / p>

文章内容相似性(TF-IDF向量的余弦相似性)使用Mahout批次预先计算并从DB读取。但是,会有很多对没有相似性数据的文章。这有两个原因:

  • 文章内容相似度数据的更新频率低于用户项目偏好设置的数据模型,因此在新文章计算内容相似度之前会有一段时间滞后。

  • 理想情况下,我想将所有内容相似度数据加载到内存中,因此我只会为每篇文章存储前20个相似度。

所以,对于一对特定的文章,我有:

  • 项目相似度(Tanimoto)0&lt; = s1&lt; = 1
  • 内容相似度(余弦值)0&lt; = s2&lt; = 1(可能为空)

在内容相似度不为空的情况下,我想使用其值来加权项目相似度,以便提升具有相似内容的文章。

我的问题是:

  • 尝试结合这些措施是否合理,还是我尝试了一些疯狂的事情?
  • 将这两个值组合成一个相似度得分的合理公式是什么?
  • 这最好是自定义ItemSimilarity还是Rescorer

1 个答案:

答案 0 :(得分:6)

是的,将它们组合起来是完全合理的。如果两者的相似性都在[0,1]中,那么最明智的组合就是它们的产品。这是您使用ItemSimilarity注入的内容,而不是IDRescorer