Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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
比较一组标记以查找与PHP/MySQL的相似性/分数_Php_Mysql_Tags - Fatal编程技术网

比较一组标记以查找与PHP/MySQL的相似性/分数

比较一组标记以查找与PHP/MySQL的相似性/分数,php,mysql,tags,Php,Mysql,Tags,如何将一组标签与数据库中另一篇文章的标签进行比较,以获得相关文章? 我试图做的是将一篇文章上的一组标签与另一篇文章的标签进行比较,但不是将每个标签单独进行比较。因此,假设您希望根据帖子中的标记获取真正相关的项目,然后从最相关的到最不相关的显示它们。无论关系级别如何,每次都必须显示三个相关项 贴子A上有标签:“建筑”、“木材”、“现代”、“瑞士” 帖子B有标签:“建筑”、“木材”、“现代” C柱上有标签:“建筑”、“现代”、“石头” D柱上有标签:“建筑”、“房屋”、“住宅” 帖子B与帖子A的关联

如何将一组标签与数据库中另一篇文章的标签进行比较,以获得相关文章?

我试图做的是将一篇文章上的一组标签与另一篇文章的标签进行比较,但不是将每个标签单独进行比较。因此,假设您希望根据帖子中的标记获取真正相关的项目,然后从最相关的到最不相关的显示它们。无论关系级别如何,每次都必须显示三个相关项

贴子A上有标签:“建筑”、“木材”、“现代”、“瑞士”
帖子B有标签:“建筑”、“木材”、“现代”
C柱上有标签:“建筑”、“现代”、“石头”
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

我已经搜索了Internet和Stack Overflow以了解如何做到这一点。我最近的发现是,但实际上对我来说解决不了多少问题。

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

我还使用了我自己的相似性计算。我取了相同标签的数量,然后除以帖子A和帖子B中的平均标签数量。因此,如果帖子A有4个标签,而帖子B有2个标签,它们都与A共享,那么相似度是66%

(共享:2/((A:4+B:2)/2)
(共享:2)/(平均: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

将标签放入一个数组中。每个数组分别称为Post A/Post B等。 然后使用
array\u diff\u assoc()


但实际上,Ivars解决方案会更有效,不过这更容易理解:)

我更新了我的帖子,提出了一个更清晰的问题。你如何计算你的百分比?你希望从A和B的关系中得到什么样的关系表达式(相对于B和A)?100%还是75%?如果答案是75%,在B中添加另一个不相关的标签会改变这一点吗?B与C的关系如何?66%或50%(两个相关,两个无关)?这是个好问题。我认为通过计算相关分数,结果会更好。我不知道计算标签是否无关的额外工作是否有好处。Ivar,我真的很感谢你的帮助,这非常有效。我稍微改变了分组,以便更准确地组织结果。我想知道的一件事是,如果结果少于3个,是否有某种方法可以从数据库中随机获得一组项目?这肯定更容易理解,如果必须的话,这是我的回退解决方案。我现在试图检查,如果返回的结果少于3个,是否有方法(在查询中)从数据库中获取一组随机项?