39

这些天我对推荐引擎很感兴趣,我想在这方面提高自己。我目前正在阅读“ Programming Collective Intelligence ”,我认为这是 O'Reilly 写的关于这个主题的最佳书籍。但我不知道如何实现引擎;我所说的“不知道”是“不知道如何开始”。我有一个像 Last.fm 这样的项目。

  1. 我从哪里开始创建推荐引擎(应该在数据库端或后端实现)?
  2. 需要什么级别的数据库知识?
  3. 是否有任何可用于帮助或任何资源的开源?
  4. 我必须做的第一步应该是什么?
4

5 回答 5

27

提出建议可以分为两个主要部分:

  1. 特征提取
  2. 推荐

特征提取对于推荐的对象非常具体。例如,对于音乐,对象的某些特征可能是歌曲的频率响应、功率、流派等。用户的特征可能是年龄、位置等。然后为每个用户创建一个向量,然后歌曲具有对应于不同兴趣特征的向量的各种元素。

执行实际的推荐只需要经过深思熟虑的特征向量。请注意,如果您不选择正确的功能,您的推荐引擎将会失败。这就像要求你根据我的年龄告诉我我的性别。当然,我的年龄可能会提供一些信息,但我认为您可以想象出更好的问题要问。无论如何,一旦你有了每个用户和歌曲的特征向量,你就需要训练推荐引擎。我认为最好的方法是让一大群用户参加你的人口统计测试,然后告诉你他们喜欢的特定歌曲。此时,您拥有所需的所有信息。你的工作是用你所拥有的信息划定一个决策边界。考虑一个简单的例子。您想预测用户是否喜欢 AC/DC 的“Back in Black” 基于年龄和性别。想象一个显示 100 个数据点的图表。x 轴是年龄,y 轴是性别(1 是男性,2 是女性)。黑色标记表示用户喜欢这首歌,而红色标记表示他们不喜欢这首歌。我的猜测是,这张图可能有很多黑色标记对应于 12 到 37 岁之间的男性用户,而其余标记将是红色的。因此,如果我们要手动选择一个决策边界,它将是该区域周围的一个矩形,其中包含大部分黑色标记。这被称为决策边界,因为如果一个全新的人来找您并告诉您他们的年龄和性别,您只需将他们绘制在图表上并询问他们是否属于该框。y 轴是性别(1 是男性,2 是女性)。黑色标记表示用户喜欢这首歌,而红色标记表示他们不喜欢这首歌。我的猜测是,这张图可能有很多黑色标记对应于 12 到 37 岁之间的男性用户,而其余标记将是红色的。因此,如果我们要手动选择一个决策边界,它将是该区域周围的一个矩形,其中包含大部分黑色标记。这被称为决策边界,因为如果一个全新的人来找您并告诉您他们的年龄和性别,您只需将他们绘制在图表上并询问他们是否属于该框。y 轴是性别(1 是男性,2 是女性)。黑色标记表示用户喜欢这首歌,而红色标记表示他们不喜欢这首歌。我的猜测是,这张图可能有很多黑色标记对应于 12 到 37 岁之间的男性用户,而其余标记将是红色的。因此,如果我们要手动选择一个决策边界,它将是该区域周围的一个矩形,其中包含大部分黑色标记。这被称为决策边界,因为如果一个全新的人来找您并告诉您他们的年龄和性别,您只需将他们绘制在图表上并询问他们是否属于该框。我的猜测是,这张图可能有很多黑色标记对应于 12 到 37 岁之间的男性用户,而其余标记将是红色的。因此,如果我们要手动选择一个决策边界,它将是该区域周围的一个矩形,其中包含大部分黑色标记。这被称为决策边界,因为如果一个全新的人来找您并告诉您他们的年龄和性别,您只需将他们绘制在图表上并询问他们是否属于该框。我的猜测是,这张图可能有很多黑色标记对应于 12 到 37 岁之间的男性用户,而其余标记将是红色的。因此,如果我们要手动选择一个决策边界,它将是该区域周围的一个矩形,其中包含大部分黑色标记。这被称为决策边界,因为如果一个全新的人来找您并告诉您他们的年龄和性别,您只需将他们绘制在图表上并询问他们是否属于该框。

所以,这里的困难部分是找到决策边界。好消息是您不需要知道如何做到这一点。您只需要知道如何使用一些常用工具。您可以考虑使用神经网络、支持向量机、线性分类器等。同样,不要让大牌愚弄您。大多数人无法告诉你这些东西到底在做什么。他们只知道如何插入并获得结果。

我知道这有点晚了,但我希望这可以帮助任何偶然发现这个线程的人。

于 2010-09-17T21:05:52.363 回答
24

我自己为视频门户建立了一个。我的主要想法是收集有关所有内容的数据:

  • 谁上传了视频?
  • 谁评论了视频?
  • 哪些标签在哪里创建?
  • 谁看过视频?(也跟踪匿名访客)
  • 谁收藏了一个视频?
  • 谁给视频评分?
  • 视频分配给了哪些频道?
  • 标题、描述、标签、频道和评论的文本流由全文索引器收集,该索引器将权重放在每个数据源上。

接下来,我为上述每个点创建了返回 (id,weight) 元组列表的函数。有些只考虑有限数量的视频(例如最后 50 个),有些则通过例如评分、标签计数(更常见的标签 = 较少表现力)来修改权重。有返回以下列表的函数:

  • 全文搜索的类似视频
  • 同一用户上传的视频
  • 这些评论中的用户还评论了其他视频
  • 这些收藏夹中的用户也收藏了其他视频
  • 来自这些评分的评分者还评分的其他视频(加权)
  • 同一频道中的其他视频
  • 具有相同标签的其他视频(按标签的“表现力”加权)
  • 播放此视频的人播放的其他视频(XY 最新播放)
  • 评论全文的类似视频
  • 类似的视频标题全文
  • 描述全文的类似视频
  • 标签全文类似的视频

所有这些都将组合成一个列表,只需按视频 ID 汇总权重,然后按权重排序。现在这对大约 1000 个视频非常有效。但是您需要进行后台处理或极端缓存才能快速完成。

我希望我能尽快将其简化为通用推荐引擎或相似度计算器,并作为 rails/activerecord 插件发布。目前它仍然是我项目的一个很好的集成部分。

给出一个小提示,在 ruby​​ 代码中它看起来像这样:

def related_by_tags
  tag_names.find(:all, :include => :videos).inject([]) { |result,t|
    result + t.video_ids.map { |v|
      [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))]
    }
  }
end

我会对其他人如何解决此类算法感兴趣。

于 2009-09-10T21:52:03.460 回答
3

这确实是您要问的一个非常大的问题,所以即使我能给您一个详细的答案,我也怀疑我是否有时间....但是我确实有一个建议,请查看 Greg Linden 的博客和他的论文基于项目的协同过滤。Greg 使用基于项目的方法在亚马逊实现了推荐引擎的想法,他真的很了解他的东西,他的博客和论文可读性很强。

博客: http: //glinden.blogspot.com/ 论文: http: //www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344(恐怕需要登录才能阅读完全,因为你是一名CS学生,这应该是可能的)。

编辑 您还可以查看Infer.Net,它们包含一个为电影数据构建推荐系统的示例。

于 2009-10-19T12:38:45.077 回答
3

我有一个关于在 Hadoop 中实现的基于协作过滤的推荐引擎的 2 部分博客。

http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/

http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/

这是开源项目的 github 存储库 https://github.com/pranab/sifarish

如果您喜欢,请随意使用。

于 2011-01-20T21:36:06.127 回答
2

Filmmaster.com 最近发布了一个开源的示例推荐引擎(AGPLv3 许可)。它是用 C++ 编写的,并使用了作为 Netflix 挑战的一部分制作的白皮书中的最佳实践。有关它的文章可以在以下位置找到:http://polishlinux.org/gnu/open-source-film-recommendation-engine/ 代码在这里:http ://bitbucket.org/filmaster/filmaster-test/src /tip/count_recommendations.cpp

于 2010-05-28T07:56:29.727 回答