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,以增强具有相似内容的文章。
我的问题是:
- 是否合理尝试将这些措施结合起来,还是我在尝试一些疯狂?
- 将这两个值合并为一个相似度得分的合理公式是什么?
- 这是最好的自定义
ItemSimilarity
或Rescorer
?
感谢您的回复。我要求一个“明智的公式”的原因是,与文章内容非常不相似的情况相比,简单地乘以相似性会导致较低的分数,因此没有可用的内容相似性分数。例如。 itemSimilarity = 0.9,contentSimilarity = 0.9 - > 0.9 x 0.9 = 0.81。 itemSimilarity = 0.9,contentSimilarity = null - > 0.9 x null = 0.9。我想我可以在这种情况下硬编码一个非常低的内容相似度值。 –
当然可以,但是它们在同样的意义上都会更低。在基于项目邻域的算法中,相似度只是加权平均的权重。它们的绝对大小并不重要;如果你把他们全部减半,结果将是相同的。 –
@ChrisB - 你是如何测量内容相似度的? mahout会这么做吗?我虽然mahout纯粹是基于协作的建议? – user1431072