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

39

最近我对推荐引擎很感兴趣,想在这个领域提高自己。我正在阅读 O'Reilly 出版社的《Programming Collective Intelligence》,我认为这是关于这个主题最好的书籍。但是我不知道如何实现引擎;我的意思是“不知道从哪里开始”。我脑海中有一个类似 Last.fm 的项目。

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

1
你的背景是什么?你已经会编程了吗?用什么语言?你的重点是什么 - 我猜是后端逻辑,但如果你也想让页面看起来漂亮,那就是一个额外的挑战;-) - Simon Groenewolt
我是一名计算机科学的学生,对C、C++、Java有很好的了解,同时在网页开发方面也懂得C#和PHP。在数据库方面有中级的MySQL知识,也稍微了解Oracle。 - Burak Dede
我们基于Swathi Yerubandi的工作创建了一个原型推荐引擎,你可能想联系她。https://twitter.com/SwathiY。没有所谓的“基本”推荐引擎,它总是针对特定的行业和目标受众。 - Jan Jongboom
是的,你说得对,我必须更具体一些,我想了解的是音乐推荐引擎。 - Burak Dede
你需要一些软件工程知识,比如如何引出和分析需求。如果你弄清楚了自己真正想要什么,其他技术问题就不再是难题了。 - 吳強福
您可以查看现有推荐引擎的示例,例如 https://github.com/srogatch/ProbQA。 - Serge Rogatch
5个回答

27

推荐系统的提出建议可以分为两个主要部分:

  1. 特征提取
  2. 推荐

特征提取非常具体化,要根据被推荐的对象而定。例如,对于音乐来说,某些对象的特征可能是歌曲的频率响应、功率、流派等,而用户的特征可能是年龄、地点等。然后,您需要为每个用户和歌曲创建一个向量,其中向量的各个元素对应于不同感兴趣的特征。

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

因此,这里的难点是找出决策边界。好消息是你不需要知道如何实现它。你只需要知道如何使用一些常见的工具,例如神经网络、支持向量机、线性分类器等。同样地,不要被这些大名所迷惑。大多数人无法真正解释这些方法在做什么,他们只知道如何插入数据并获得结果。

虽然我知道有些晚了,但我希望这可以对那些看到这篇文章的人有所帮助。


24
我自己建立了一个视频门户网站。我的主要想法是收集关于所有内容的数据:
  • 谁上传了视频?
  • 谁评论了视频?
  • 创建了哪些标签?
  • 谁访问了视频?(也追踪匿名访问者)
  • 谁收藏了视频?
  • 谁对视频评分?
  • 视频分配给了哪些频道?
  • 通过全文索引器收集标题、描述、标签、频道和评论的文本流,并对每个数据源赋予权重。

接下来,我创建了返回上述各点(id、权重)元组列表的函数。有些只考虑有限数量的视频(例如最近的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

我对其他人如何解决这些算法感兴趣。


这已经成为一个宝石了吗? - Ismael
显然,这个项目已经被搁置了,我猜它可能永远不会继续了... :-( 所以除非有另一个需要使用它的项目,否则我可能不会将其拆分出来。 - hurikhan77
@hurikhan77 我正在开发一个类似的音乐推荐引擎。我对选择数据库感到困惑。我的想法是将静态数据存储在关系型数据库中,将用户事件(如播放等)存储在 Elastic-search 中并进行处理。你能否给出你的想法并帮助我解决问题? - Gaurav
@Gaurav 我认为 Elasticsearch 在这里可能非常适用,特别是如果你利用其全文搜索和相似度搜索功能。我甚至可能会将静态元数据存储在其中 - 或者至少将其用作静态数据的全文索引。最近我经常使用 Elasticsearch,在 Rails 中使用它作为搜索数据库后端非常好用。结合 Redis 和 Sidekick,您可以轻松地进行许多后台工作,这可能是实现我上面提到的推荐引擎所需的。 - hurikhan77

3

3
这真的是一个非常大的问题,即使我能给你详细的答案,我也怀疑我会有时间...但我确实有一个建议,看看格雷格·林登(Greg Linden)的博客以及他关于基于项目的协作过滤的论文。Greg在亚马逊使用了基于项目的方法来实现推荐引擎的想法,他确实知道他的东西,他的博客和论文非常易读。
博客:http://glinden.blogspot.com/ 论文:http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344(恐怕您需要登录才能完整阅读,由于您是计算机科学专业的学生,应该可以做到)。
编辑 您还可以看看Infer.Net,他们提供了一个针对电影数据构建推荐系统的示例。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接