比较标签组以找到与PHP/MySQL的相似性/得分

stw*_*ite 7 php mysql tags

如何将一组标签与我数据库中另一个帖子的标签进行比较以获取相关帖子?

我要做的是将帖子上的一组标签与另一个帖子的标签进行比较,而不是将每个标签单独比较.所以说你希望根据帖子中的标签获得真正相关的项目,然后从最相关和最不相关的项目中显示它们.无论关系水平如何,每次都必须显示三个相关项目.

Post A有标签:"architecture","wood","modern","switzerland"
Post B有标签:"architecture","wood","modern"
Post C有标签:"architecture","modern" ","石头"
Post D有标签:"建筑","房子","住宅"

帖子B与帖子A相关75%(3个相关标签)
帖子C与帖子A相关50%(2个相关标签)
帖子D与帖子A相关25%(1个相关标签)

我怎样才能做到这一点?我目前正在使用3桌.

posts
> id
> image
> date

post_tags
> post_id
> tag_id

tags
> id
> name
Run Code Online (Sandbox Code Playgroud)

我搜索了Internet和Stack Overflow以了解如何执行此操作.我最接近的发现是如何在PHP中找到"相关项目",但实际上并没有为我解决太多问题.

Iva*_*sen 4

注意:此解决方案仅适用于 MySQL,因为 MySQL 对 GROUP BY 有自己的解释

我还使用了自己的相似度计算。我将相同标签的数量除以帖子 A 和帖子 B 中的平均标签数。因此,如果帖子 A 有 4 个标签,帖子 B 有 2 个与 A 共享的标签,则相似度为 66% 。

(SHARED:2 / ((A:4 + B:2)/2)或者(SHARED:2) / (AVG:3)

如果您想要/需要的话,更改公式应该很容易......

SELECT
 sourcePost.id,
 targetPost.id,

 /* COUNT NUMBER OF IDENTICAL TAGS */
 /* REF GROUPING OF sourcePost.id and targetPost.id BELOW */
 COUNT(targetPost.id) /
 (
  (
   /* TOTAL TAGS IN SOURCE POST */
   (SELECT COUNT(*) FROM post_tags WHERE post_id = sourcePost.id)

   +

   /* TOTAL TAGS IN TARGET POST */
   (SELECT COUNT(*) FROM post_tags WHERE post_id = targetPost.id)

  ) / 2  /* AVERAGE TAGS IN SOURCE + TARGET */
 ) as similarity
FROM
 posts sourcePost
LEFT JOIN
 post_tags sourcePostTags ON (sourcePost.id = sourcePostTags.post_id)
INNER JOIN
 post_tags targetPostTags ON (sourcePostTags.tag_id = targetPostTags.tag_id
                             AND 
                              sourcePostTags.post_id != targetPostTags.post_id)
LEFT JOIN
 posts targetPost ON (targetPostTags.post_id = targetPost.id)
GROUP BY
 sourcePost.id, targetPost.id
Run Code Online (Sandbox Code Playgroud)