如何在PHP中找到“相关项”

时间:2010-01-28 08:00:22

标签: php sql taxonomy

我们经常看到“相关项目”。例如在博客中我们有相关的帖子,在书中我们有相关的书籍等等。我的问题是我们如何编译这些相关性?如果它只是标记,我经常会看到没有相同标记的相关项目。例如,当搜索“粉红色”时,相关项可能会有“紫色”标记。

任何人都有任何想法?

8 个答案:

答案 0 :(得分:31)

有很多方法可以计算两个项目的相似度,但是对于一个简单的方法,请看一下Jaccard系数。

http://en.wikipedia.org/wiki/Jaccard_index

这是:J(a,b)=十字路口(a,b)/联合(a,b)

So lets say you want to compute the coefficient of two items:

Item A, which has the tags  "books, school, pencil, textbook, reading"
Item B, which has the tags  "books, reading, autobiography"

intersection(A,B) = books, reading
union(A,B) = books, school, pencil, textbook, reading, autobiography

so J(a,b) = 2/6 = .333

So the most related item to A would be the item which results in the highest Jaccard Coefficient when paired with A.

答案 1 :(得分:4)

以下是一些方法:

  1. 手动连接它们。放置一个包含字段item_idrelated_item_id的表,然后创建一个接口以插入连接。用于关联两个相关但没有相似性或不属于同一类别/标签(或未分类的条目表)的项目。示例:浴缸和橡皮鸭子
  2. 拉出属于同一类别或具有类似标签的一些项目。这个想法是这些项目必须有些相关,因为它们属于同一类别。示例:在查看LCD监视器的页面中,“相关项目”部分中有随机LCD监视器(具有相同的价格范围/制造商/分辨率)。
  3. 对表格中的其他项目进行文本搜索,以匹配当前项目的名称(和/或描述)。你明白了。

答案 2 :(得分:2)

要根据标签获取相关项目的简单列表,基本解决方案如下:

3个表,一个包含项目,一个包含标签,另一个包含连接。连接表由两列组成,其中一列用于其余表中的每个id。连接表中的条目通过将标记与项目放在一行来链接标记。

现在,获取相关项目列表。

获取与原始项目共享至少一个标记的所有项目。一定要获取标签以及项目,然后使用简单的评级机制来确定哪个项目与原始项目共享最多的标签。每个标签将关系相关性提高一个。

根据您的标记习惯,添加一些反制机制以防止大型标记混淆相关性可能是明智之举。为实现这一目标,您可以为低于特定阈值设备的标签赋予更大的权重。对我来说通常很有效的阈值是total_number_of_tag_appliances / total_number_of_tags,这导致平均设备数量。如果标签appliance-count小于平均值,则关系相关性会增加一倍。

答案 3 :(得分:1)

它可以不仅仅是一个标签,例如它可以是段落中出现的每个作品的平均值,然后是标题等等。

答案 4 :(得分:1)

我会说他们使用ontology来为应用程序添加更多强大的功能。

答案 5 :(得分:0)

它也可以基于“购买此书的人也购买”

无论如何,你的物品之间需要一些连接,而且它们大部分都是由人类制造的

答案 6 :(得分:0)

这是implementation(GIST) Jaccard index的{{3}}和PostgreSQL以及Ruby on Rails ......

答案 7 :(得分:0)

这是基于bigrams的两个文本之间的jaccard索引的实现。 https://packagist.org/packages/darkopetreski/textcategorization