我有一个非常标准的基于 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
?