4

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

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

我正在尝试将基于内容的知识注入推荐器,这样我就可以最强烈地推荐不仅在正常协同过滤意义上相似的文章,而且在它们共享许多共同术语的意义上也相似。

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

  • 文章内容相似度数据的更新频率将低于用户项目偏好数据模型,因此在计算新文章的内容相似度之前会有延迟。

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

因此,对于给定的一对文章,我有:

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

在内容相似度不为空的情况下,我想用它的值来加权项目相似度,以便对内容相似的文章进行提升。

我的问题是:

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

1 回答 1

6

是的,将它们结合起来是完全合理的。如果两个相似性都在 [0,1] 中,那么最明智的组合就是它们的乘积。这是您使用注入的东西ItemSimilarity,而不是IDRescorer.

于 2013-01-08T04:33:56.620 回答