没有评级的基于项目的协同过滤

数据挖掘 推荐系统 开源的 apache-mahout
2021-10-13 03:30:26

我正在为网页构建推荐器。对于我们数据集中的每个网页,我们希望生成其他用户也访问过的网页列表。

我们的数据仅显示用户访问过一个页面,或者他们没有访问过。用户不提供我们网页的任何评级。对于基于项目的推荐来说,这是一项很好的任务。但是,大多数算法(例如 Mahout 中的算法)都需要评级数据。

我想出的第一个解决方案是使用图形数据库并编写一个执行以下操作的查询:

对于我们想要推荐的每个页面,我们搜索查看过该页面的所有用户。然后,对于每个用户,我们查找他们查看过的所有其他页面。然后,我们计算查看过该数据集中每个页面的用户数量,并使用数量最多的用户作为我们的推荐。

虽然这工作得很好,但我们的数据集已经大幅增长,并且很难扩展图形数据库。随着我们数据集中页面浏览量的增加,查询变得更慢。在我们承诺迁移到分布式图数据库之前,我们想考虑一个不同的实现。

在更传统的基于项目的推荐器(如 Mahout 的)中,是否有“伪造”排名数据的好方法,或者是否有不需要排名数据的流行开源实现?

2个回答

可能有不同的方法可以做到这一点,例如考虑观看或点击等隐式评级。

但基本上,您可以考虑为您拥有的每个用户项目对评分 1.0。

这样,您的预测将介于 0 和 1 之间,您可以将其视为类似于点击预测概率。

  • 0 是用户没有点击或项目的概率
  • 1 是点击的概率。

您还可以设置一个阈值,在该阈值中您可以在预测级别的某个限制下放弃推荐。

例如,假设用户 alpha 具有以下阈值的建议,阈值为 0.7

  • i1 , 0.87
  • i2, 0,75
  • i3, 0,6

您可以放弃 i3 推荐,因为您认为它不够好。

尽管如此,您的推荐引擎的参数当然必须在您的评估指标的帮助下确定。

考虑到软件解决方案,我使用 Apache Spark MLlib 和 Scala 作为我的推荐引擎算法的基础,您可以通过使用内部实现或 DIMSUM 算法近似的示例轻松计算项目余弦相似度。

我希望这有帮助!

您可以尝试使用其他指标来衡量兴趣。文章的一个例子是“页面上的时间”。如果您测量滚动深度,那就更好了。如果用户花费超过“n”秒(其中 n 是平均阅读文章所需的时间)或者如果用户一直滚动到底部,您可以给出“5”评级。

例如,如果用户对文章没有表现出很大的兴趣,则可能是“3”。