2013-01-08 43 views
4

我有新闻报道的非常标准的Mahout的基于项目的推荐(使用点击数据,因此偏好布尔):Mahout的推荐 - 加入基于内容的相似性基于项目的推荐

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

我尝试将基于内容的知识注入推荐人,这样我就能够推荐不仅在正常协作过滤意义上相似的文章,而且在他们共享许多常用术语的意义上也是类似的。

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

  • 文章内容相似的数据将不是用户项目的偏好的数据模型不经常更新,所以会有一个滞后之前,新的文章有自己的内容计算出的相似度。

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

所以,对于给定的一对物品,我有:

  • 项相似性(谷本)0 < = S1 < = 1
  • 内容相似性(余弦)0 < = s2 < = 1(可能为空)

在内容相似性不为null的情况下,我想使用它的值来加权项目similarit y,以增强具有相似内容的文章。

我的问题是:

  • 是否合理尝试将这些措施结合起来,还是我在尝试一些疯狂?
  • 将这两个值合并为一个相似度得分的合理公式是什么?
  • 这是最好的自定义ItemSimilarityRescorer

回答

6

是的,它是完全合理的。如果两种相似性都在[0,1]中,那么最明智的组合就是他们的产品。这是你使用ItemSimilarity注入的东西,而不是IDRescorer

+1

感谢您的回复。我要求一个“明智的公式”的原因是,与文​​章内容非常不相似的情况相比,简单地乘以相似性会导致较低的分数,因此没有可用的内容相似性分数。例如。 itemSimilarity = 0.9,contentSimilarity = 0.9 - > 0.9 x 0.9 = 0.81。 itemSimilarity = 0.9,contentSimilarity = null - > 0.9 x null = 0.9。我想我可以在这种情况下硬编码一个非常低的内容相似度值。 –

+0

当然可以,但是它们在同样的意义上都会更低。在基于项目邻域的算法中,相似度只是加权平均的权重。它们的绝对大小并不重要;如果你把他们全部减半,结果将是相同的。 –

+0

@ChrisB - 你是如何测量内容相似度的? mahout会这么做吗?我虽然mahout纯粹是基于协作的建议? – user1431072

相关问题