如何创建自己的推荐引擎?

时间:2009-09-10 21:31:25

标签: database recommendation-engine collective-intelligence

这些天我对推荐引擎感兴趣,我想在这个领域提高自己。我目前正在阅读“Programming Collective Intelligence”我认为这是关于这个主题的最好的书,来自O'Reilly。但我对如何实施引擎没有任何想法;我的意思是“不知道”是“不知道如何开始”。我脑子里有一个像Last.fm这样的项目。

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

5 个答案:

答案 0 :(得分:27)

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

  1. 特征提取
  2. 建议
  3. 特征提取非常特定于推荐的对象。例如,对于音乐,对象的某些功能可能是歌曲的频率响应,功率,类型等。用户的功能可能是年龄,位置等。然后,您为每个用户创建一个向量,歌曲与矢量的各种元素对应不同的兴趣特征。

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

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

    我知道这有点晚了,但我希望这可以帮助那些偶然发现这个问题的人。

答案 1 :(得分:23)

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

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

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

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

所有这些将通过视频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

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

答案 2 :(得分:3)

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

博客:http://glinden.blogspot.com/ 论文:http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344(我担心您需要登录才能完整阅读,因为您是CS学生应该可以这样做。)

修改的 您还可以查看Infer.Net,其中包括为电影数据构建推荐系统的示例。

答案 3 :(得分:3)

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

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

如果您愿意,请随意使用。

答案 4 :(得分:2)

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