深入了解推荐引擎组件(基于Apache Mahout和Elasticsearch)

jopen 9年前

推荐引擎根据用户的特定需求帮助用户缩小选择范围。在这篇文章中,我们一起来探秘推荐引擎各部分是如何协同工作的。我们将根据电影评分数据,用协同 过滤的方法来推荐电影。其关键部分是基于Apache Mahout的协同过滤算法来建立和训练机器学习模型,以及基于Elasticsearch的搜索技术来简化推荐系统的开发。

什么是推荐?

推荐(Recommendation)是机器学习的一个分支,通过分析数据来预测用户的喜好或者给物品评分。推荐系统在业界被广泛运用:

  • 书籍及其它产品(如Amazon)
  • 音乐(如Pandora)
  • 电影(如Netflix)
  • 餐厅(如Yelp)
  • 职业(如LinkedIn)

深入了解推荐引擎组件(基于Apache Mahout和Elasticsearch)

Netflix的推荐引擎

电影推荐依赖于以下的观点:

  1. 用户的行为是他们诉求的最真实反应。
  2. 共同出现(Co-Occurrence)是Apache Mahout可以计算被推荐物品显著性标识的基础。
  3. 模型输出指标分数的权重赋值和全文检索引擎背后的数学计算有着相似性。
  4. 这种数学上的相似让利用文本搜索开发Mahout推荐器的想法得以实现,借助如Elasticsearch这样的搜索引擎。

深入了解推荐引擎组件(基于Apache Mahout和Elasticsearch)

推荐引擎架构

推荐引擎的架构

推荐引擎的架构如下所示:

推荐引擎的架构

  1. 电影信息数据被重新格式化,然后将其存储在Elasticsearch中用于搜索。
  2. 来自Apache Mahout的物品相似度算法根据用户对电影的已有评分来创建电影推荐的标识符。这些标识符被添加到存储在Elasticsearch的对应电影文件里。
  3. 通过用户喜欢电影的标识符去搜索其它电影,将返回一份新的按照用户喜好相关性排序的电影列表。

基于Mahout的协同过滤

基于Mahout的协同过滤引擎着眼于用户的历史行为,并试图猜测在今后某个场景下用户可能喜欢什么。这是通过分析用户过去交互过的产品和内容来完 成的。Mahout尤其关注物品是如何在用户历史记录中共同出现的。共同出现是Apache Mahout计算被推荐物品显著性标识的基础。假设Ted喜欢电影A、B和C,Carol喜欢电影A和B。在给Bob推荐电影时,我们注意到Bob喜欢电 影B,由于Ted 和Carol也很喜欢电影B,因而电影A是一个备选推荐项。当然,这是一个很小的例子。在实际生活中,我们将通过海量数据来挖掘信息。

推荐网格

为了获得推荐有用的标识符,Mahout的物品相似度(ItemSimilarity)项目根据用户历史行为建立了三个矩阵:

1. 历史矩阵:包含用户和物品的交互信息,用户X物品的二维矩阵结构。

历史矩阵

2.共生矩阵:把历史矩阵转化为物品和物品间关系的矩阵,记录哪些物品在用户历史记录中共同出现过。

共生矩阵

在这个例子中,电影A和电影B共同出现一次,而电影A和电影C 共同出现两次。共生矩阵不能直接用作推荐的标识符,因为极其常见的物品总是会伴随着大量的其它物品出现。

3.标识符矩阵:标识符矩阵只记录能作为推荐线索的异常(令人关注的)同现。有些物品(这里指电影)由于广受欢 迎,几乎每个人都喜欢它们,意味着它们将伴随所有物品出现。它们对于推荐系统而言就不值得关注(非异常)。而过于稀疏的共同出现也不可靠,因此也不记录在 标识符矩阵中。在这个例子中,电影A是电影B的标识符之一。

标识符矩阵

Mahout同时并行地运行多个MapReduce作业来计算物品的共同出现(Mahout 1.0运行在 Apache Spark之上)。Mahout的 ItemSimilarity作业用对数似然比检验(LLR)来确定哪些共同出现足够反常可以作为推荐标识符。系统输出相似度大于设定阈值的那些物品间。

Mahout ItemSimilarity作业的输出,给出了物品两两之间哪些总是共同出现、哪些能作为推荐依据。例如,电影B这一行的电影A这一列被标记,这意味着喜欢电影A可以作为你也喜欢电影B的一个标识符。

标识符矩阵

Elasticsearch搜索引擎

Elasticsearch搜索引擎

Elasticsearch是建立在全文搜索引擎库Apache Lucene之上的开源搜索引擎。全文搜索使用准确度(Precision)和召回率(Recall)评估搜索结果:

  • 准确度 = 检索出的相关文档数与检索出的文档总数的比率
  • 召回率 = 检索出的相关文档数和文档库中所有的相关文档数的比率

Elasticsearch存储的文档由多个不同的字段组成。每个字段都有对应的名字和内容。

对于我们的推荐引擎,我们存储电影的元数据(如id、标题、流派和电影推荐标识符)到一个JSON文档中:

{  “id”: "65006",  "title": "Electric Horseman",  "year": "2008",  "genre": ["Mystery","Thriller"]  }

标识符矩阵的数据,那些标识显著性或是共同出现兴趣度的信息,被存放在Elasticsearch电影文件标识符字段。例如,由于电影A是电影B的 一个标识符,电影A就会被存储在电影B文件的标识符字段中。这意味着,当我们搜索电影A为标识符的电影,电影B就会被推荐给我们。

推荐矩阵

搜索引擎已经对搜索和查询词相关的字段做过优化。我们就根据和查询词最匹配的标识符字段,用搜索引擎来寻找电影。

了解更多搭建推荐引擎的信息,我们建议您查看以下资源: