这些天我对推荐引擎感兴趣,我想在这个领域提高自己.我正在阅读" 编程集体智慧 "我认为这是关于这个主题的最好的书,来自O'Reilly.但我对如何实施引擎没有任何想法; 我的意思是"不知道"是"不知道如何开始".我脑子里有一个像Last.fm这样的项目.
在哪里(应该在数据库端或后端端实现)我开始创建推荐引擎?
需要什么级别的数据库知识?
有没有可以用于帮助或任何资源的开源软件?
我应该做的第一步应该是什么?
Josh.. 27
提出建议可分为两个主要部分:
特征提取
建议
特征提取非常特定于推荐的对象.例如,对于音乐,对象的某些功能可能是歌曲的频率响应,功率,类型等.用户的功能可能是年龄,位置等.然后,您为每个用户创建一个向量,歌曲与矢量的各种元素对应不同的兴趣特征.
执行实际建议只需要经过深思熟虑的特征向量.请注意,如果您未选择正确的功能,则推荐引擎将失败.这就像是要求你根据我的年龄告诉我我的性别.当然,我的年龄可能会提供一些信息,但我认为你可以设想更好的问题.无论如何,一旦你有每个用户和歌曲的特征向量,你将需要训练推荐引擎.我认为最好的方法是让一大群用户参加你的人口统计测试,然后告诉你他们喜欢的特定歌曲.此时,您将获得所需的所有信息.您的工作是根据您拥有的信息绘制决策边界.考虑一个简单的例子.您想要预测用户是否喜欢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岁之间的用户,而其余的标记将是红色.因此,如果我们要手动选择一个决策边界,那么这个区域周围的矩形将占据大部分黑色标记.这被称为决策边界,因为如果一个全新的人来找你并告诉你他们的年龄和性别,你只需要在图表上绘制它们并询问它们是否属于该框.
所以,这里的难点在于找到决策边界.好消息是你不需要知道如何做到这一点.您只需要知道如何使用一些常用工具.您可以考虑使用神经网络,支持向量机,线性分类器等.再次,不要让大名愚弄你.大多数人都无法告诉你这些事情到底在做什么.他们只知道如何插入内容并获得结果.
我知道这有点晚了,但我希望这可以帮助任何偶然发现这个问题的人.
提出建议可分为两个主要部分:
特征提取
建议
特征提取非常特定于推荐的对象.例如,对于音乐,对象的某些功能可能是歌曲的频率响应,功率,类型等.用户的功能可能是年龄,位置等.然后,您为每个用户创建一个向量,歌曲与矢量的各种元素对应不同的兴趣特征.
执行实际建议只需要经过深思熟虑的特征向量.请注意,如果您未选择正确的功能,则推荐引擎将失败.这就像是要求你根据我的年龄告诉我我的性别.当然,我的年龄可能会提供一些信息,但我认为你可以设想更好的问题.无论如何,一旦你有每个用户和歌曲的特征向量,你将需要训练推荐引擎.我认为最好的方法是让一大群用户参加你的人口统计测试,然后告诉你他们喜欢的特定歌曲.此时,您将获得所需的所有信息.您的工作是根据您拥有的信息绘制决策边界.考虑一个简单的例子.您想要预测用户是否喜欢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岁之间的用户,而其余的标记将是红色.因此,如果我们要手动选择一个决策边界,那么这个区域周围的矩形将占据大部分黑色标记.这被称为决策边界,因为如果一个全新的人来找你并告诉你他们的年龄和性别,你只需要在图表上绘制它们并询问它们是否属于该框.
所以,这里的难点在于找到决策边界.好消息是你不需要知道如何做到这一点.您只需要知道如何使用一些常用工具.您可以考虑使用神经网络,支持向量机,线性分类器等.再次,不要让大名愚弄你.大多数人都无法告诉你这些事情到底在做什么.他们只知道如何插入内容并获得结果.
我知道这有点晚了,但我希望这可以帮助任何偶然发现这个问题的人.
我自己为一个视频门户建立了一个.我的主要想法是收集有关所有内容的数据:
谁上传了视频?
谁对视频发表了评论?
哪个标签在哪里创建?
谁参观了视频?(也跟踪匿名访客)
谁收藏了一个视频?
谁评了一个视频?
视频分配给哪些频道?
标题,描述,标签,频道和评论的文本流由全文索引器收集,该索引器将权重放在每个数据源上.
接下来,我创建了函数,这些函数返回上述每个点的(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
我会对其他人如何解决这些算法感兴趣.