什么公式用于在基于标签的系统中构建相关项目列表?

时间:2011-05-23 19:48:58

标签: sql algorithm tags

有很多网站使用“标签”对系统中的项目进行分类。例如,YouTube使用关键字对视频进行分类,Stack Overflow使用标签对问题进行分类等。

这些网站使用哪些公式(特别是SO)根据其标记构建与其他项目相关的项目列表?我正在构建一个类似SO上的系统,我想找到一种基于一个项目的标签生成20个左右项目列表的方法,但也要使它足够分散,以便每张照片生成一个完全不同的列表,以便点击任何给定相关列表中的项目最终可以引导您到数据库中的几乎每个项目。

4 个答案:

答案 0 :(得分:1)

基于用户标签的组织的技术术语是 folksonomy 。谷歌搜索该术语会带来大量关于如何将这些系统组合在一起的材料。一个好的开始是Wikipedia article

答案 1 :(得分:0)

几年前我不得不为合同解决这个问题,公司非常好,可以让我在http://bentilly.blogspot.com/2011/02/finding-related-items.html上发表关于我是如何做到这一点的博客。

你会注意到,如果你获得了大量数据,那么你真的,真的想要从数据库中做到这一点。

答案 2 :(得分:0)

项目之间的相似性通常表示为表示项目的向量之间的点积。因此,如果您有基于标签的系统,则每个标签将定义一个维度。如果为此项目设置了标签i,则项目的向量在维度i中变为1(如果允许多个标记,则为更高的数字)。如果计算两个项的向量的点积,您将得到这些项的相似性(N.b.向量必须标准化,以便绝对值为1)。

请注意,维度会变得非常大(常见数万个标签)。对于这种事情来说,这听起来像是一个显示器。但你也不会认为向量真的很稀疏,多点产品成为稀疏矩阵的一个大矩阵乘法与它自己的转置。使用有效的稀疏矩阵乘法算法,可以相对较快地完成。

另请注意,大多数系统不仅依赖于标签,而且依赖于“用户行为”(无论这意味着什么)。即对于Youtube用户行为将是“观看视频”,“订阅频道”,“寻找与视频X类似的视频”或“用标签y标记视频x”。

答案 3 :(得分:0)

我最终使用了以下代码(使用不同的名称),它找到了至少有一个共同标记的所有其他项目,并根据我的问题特定的其他标准按公共标记,降序和子项的数量排序结果:

SELECT PT.WidgetID, COUNT(*) AS CommonTags, PS.OtherOrderingCriteria1, PS.OtherOrderingCriteria2, PS.OtherOrderingCriteria3, PS.Date FROM WidgetTags PT INNER JOIN WidgetStatistics PS ON PT.WidgetID = PS.WidgetID
    WHERE PT.TagID IN (SELECT PTInner.TagID FROM WidgetTags PTInner WHERE PTInner.WidgetID = @WidgetID)
    AND PT.WidgetID != @WidgetID
GROUP BY PT.WidgetID, PS.OtherOrderingCriteria1, PS.OtherOrderingCriteria2, PS.OtherOrderingCriteria3, PS.Date
ORDER BY CommonTags DESC, PS.OtherOrderingCriteria1 DESC, PS.OtherOrderingCriteria2 DESC, PS.OtherOrderingCriteria3 DESC, PS.Date DESC, PT.WidgetID DESC