0

我目前使用内存推荐 API 在 mahout 中实现了推荐器。但是,我想转向使用 hadoop 的分布式解决方案来计算离线推荐。这是我第一次使用 hadoop,我正在寻找有关一些概念和 api 用法的说明。

目前,我对hadoop的了解很少,我认为正确的方法如下:

  • 使用 apache Drill 之类的东西来使用用户和项目数据填充 hdfs。

  • 在来自 hdfs 的数据上使用 mahout train 中的推荐作业。

  • 将 hdfs 中的结果数据转换为 solr 使用的索引分片

  • 使用 solr 向用户群提供建议

但是,我正在寻找有关此设计的几个方面的说明:

  1. 我将如何以在内存实时推荐中使用的方式使用记分器?

  2. 调用推荐作业的最佳方式是什么?

除了这两个之外,我还有其他问题,但这些问题的答案将是一个巨大的帮助。

4

1 回答 1

2

您可能正在谈论 Mahout + Hadoop + Solr 推荐器。此方法以几种不同的方式处理重新评分。

基本推荐器可以通过两种方式组合在一起:

  1. 在以(用户 ID、项目 ID、偏好权重)的形式将数据输入 HDFS 后,对数据运行 ItemSimilarityJob(使用 LLR 相似度,这通常是最好的)。它将创建所谓的指标矩阵。这将是一个项目 id 到项目 id 的稀疏值矩阵,指示任何两个项目之间的相似度大小。然后,您必须将其转换为 Solr 可以索引的值。这意味着将内部 Mahout 整数 ID 转换为一些唯一的字符串表示形式,这可能是它们一开始的样子。这看起来像 (item123,item223 item643 item293 item445...) 作为 CSV。所以两个 Solr 字段,第一个是项目 id,第二个是相似项目的列表。所有 id 必须是文本标记。然后,推荐查询是一个 Solr 查询,由特定用户表现出偏好的项目 id 组成。所以查询=“item223 item344 item445 ...”。针对旧指标矩阵值的字段进行查询。您将返回一个有序的项目 ID 列表
  2. 可能对您有用的更简单的方法是使用 Mahout 1.0-SNAPSHOT 的 /examples 文件夹中的工具或此处:https ://github.com/pferrel/solr-recommender 。它接收具有用户和项目 ID 的唯一字符串的原始日志文件。它在 Hadoop 上完成所有工作以输出 CSV,这些 CSV 可以由 Solr 直接索引或如上所述加载到数据库中。

我制作演示站点 ( https://guide.finderbots.com ) 的方式是使用我的 Solr Web 应用程序集成,将指标矩阵放入数据库中,将类似的项目列表附加到我的项目集合中。所以 item123 在其指标字段中得到了 item223 item643 item293 item445...。为集合建立索引后,查询为 = "item223 item344 item445..." -- 用户的首选项目。

以下是进行重新评分的三种方法:

  1. 将元数据与查询混合。因此,您可以对指标字段执行 query = "item223 item344 item445..." 对“流派”字段执行“SciFi”。这使您可以在查询中混合协同过滤和元数据,并且您可以想象,recs 基于用户的偏好,但偏向于“SciFi”。将项目+指标+元数据放入索引后,您还可以做很多其他有趣的事情。
  2. 按元数据过滤记录。如果需要,您可以获得不倾斜但过滤的记录。使用 Solr 查询 = "item223 item344 item445..." 针对指标字段和 "SciFi" 作为针对 "genre" 字段的过滤器。在这种情况下,您只会得到“SciFi”,而#1您将主要得到“SciFi”
  3. 取回您的有序列表,并根据您对用户、上下文或项目的了解以任何您喜欢的方式对其进行重新评分。通常这些可以编码到 Solr 查询中并使用一个查询完成,但也可以在返回 recs 后完成重新排序和过滤。您必须编写该代码,它不是内置的。

有趣的是,您可以将过滤器、元数据字段和用户偏好与 Solr 所谓的“提升”值混合在一起,以获得各种重新评分。Solr 甚至可以使用位置来查询、倾斜或过滤。

注意:您不必担心 Solr 分片。Solr 将直接索引大多数 DB 和 HDFS,但只有索引被分片。如果您有一个非常大的索引,则对索引进行分片,如果每秒有很多查询(或用于故障转移),则复制它。Solr 查询通常非常快,所以在您拥有一个正常运行的系统之后我会担心这一点,因为它是一个配置,不应该受到您工作流程的其余部分的影响。

于 2014-05-16T21:19:42.617 回答