Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在基于标记的系统中,用于构建相关项列表的公式是什么?_Sql_Algorithm_Tags - Fatal编程技术网

Sql 在基于标记的系统中,用于构建相关项列表的公式是什么?

Sql 在基于标记的系统中,用于构建相关项列表的公式是什么?,sql,algorithm,tags,Sql,Algorithm,Tags,有很多网站使用“标签”对系统中的项目进行分类。例如,YouTube使用关键字对视频进行分类,Stack Overflow使用标签对问题进行分类,等等 这些网站使用什么公式(特别是这样)来根据它所具有的标记构建与另一个项目相关的项目列表?我正在建立一个与SO上的系统非常相似的系统,我想找到一种方法,根据一个项目的标签生成一个包含20个项目的列表,但也要使其足够分散,以便每张照片生成一个完全不同的列表,因此,在任何给定的相关列表中单击一个项目,最终可以找到数据库中的几乎所有项目。几年前,我必须为一份

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


这些网站使用什么公式(特别是这样)来根据它所具有的标记构建与另一个项目相关的项目列表?我正在建立一个与SO上的系统非常相似的系统,我想找到一种方法,根据一个项目的标签生成一个包含20个项目的列表,但也要使其足够分散,以便每张照片生成一个完全不同的列表,因此,在任何给定的相关列表中单击一个项目,最终可以找到数据库中的几乎所有项目。

几年前,我必须为一份合同解决这个确切的问题,公司很好地让我在博客上介绍我当时是如何做到这一点的


您会注意到,如果您获得了相当数量的数据,那么您将非常非常希望从数据库中执行此操作。

基于用户标签的组织的技术术语是大众分类法。谷歌搜索这个词会带来大量关于这些系统是如何组合在一起的资料。一个好的起点是项目之间的相似性通常表示为代表项目的向量之间的点积。因此,如果您有一个基于标记的系统,每个标记将定义一个维度。如果为某个项目设置了标记i,则该项目的向量在维度i中变为1(如果允许多个标记,则为更高的数字)。如果您计算两个项目向量的点积,您将获得这些项目的相似性(注意,向量必须标准化,以便绝对值为1)

请注意,维度将变得非常大(通常有数万个标记)。这听起来像是这类事情的一个停止。但是你也不会发现向量是真正的稀疏的,多个点积变成了稀疏矩阵的一个大矩阵乘法,它自己的换位。使用高效的稀疏矩阵乘法算法,这可以相对较快地完成


还要注意的是,大多数系统不仅依赖于标签,还依赖于“用户行为”(不管这意味着什么)。也就是说,对于Youtube,用户行为将是“观看视频”、“订阅频道”、“寻找与视频X类似的视频”或“用标记y标记视频X”。

我最后使用了以下代码(使用不同的名称),该代码查找至少有一个标记的所有其他项目,并按常用标记的数量降序排列结果,并根据针对我的问题的其他标准进行细分:

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