一个奇技淫巧的 tags 推荐算法.

2018-11-23 10:22:55 +08:00
 china521

想实现一个 tags 关联度算法, 大多是基于 Go/PHP 这些的, 没找到 SQL 实现的, 朋友推荐了一个算法

https://github.com/Iwark/jaccard

感觉这样不 GEEK,要是直接能写到 SQL 语句里就很 666 了,研究了半天,SQL 本身的逻辑实现这个蹩脚

于事,根据算法宗旨,写出来了下面这行语句,按关联度倒序, 看懂的拿走不谢~~

10 跟 7 是两个 tag 的 ID,有多个就多个 repalce 套一下

select id, m from 
(
select id, group_concat('|', article_tags.tag_id,'|') as m from article
right join article_tags on article_tags.article_id=article.id
group by article.id
) as tt 
order by length(replace(replace(tt.m, '|10|', space(100)), '|7|', space(100))) 
desc

有更好的实现方法,欢迎分享~

2826 次点击
所在节点    分享创造
5 条回复
CRVV
2018-11-23 12:05:47 +08:00
1. 原来那个 repo 里的算法毫无新意,就是自己建了一个 Hash Table 来计数
2. 楼主的 SQL 写得很怪异,建议认真学一下 SQL
3. 楼主的 SQL 写错了,原来的算法是 1|2|3-1|2 的相关性大于 1|2|3|4-1|2,这条 SQL 的结果应该是反的
china521
2018-11-23 12:47:24 +08:00
```
select id, m from
(
select id, group_concat('|', article_tags.tag_id,'|') as m from article
right join article_tags on article_tags.article_id=article.id
group by article.id
) as tt
order by length(replace(replace(tt.m, '|10|', space(100)), '|7|', space(100))) - length(tt.m)*10
desc
```

确实是
按原始长度权重减一下就对了,SQL 怪异没办法,group_concat 的真不能在 order 里计算, 必须用子语句
china521
2018-11-23 12:51:37 +08:00
哈哈,好像不能这样〜〜〜 233,当我没发
china521
2018-11-23 12:58:34 +08:00
这样加上权重有点暴力
leoleoasd
2018-11-23 20:51:54 +08:00
运算交给程序做
sql 只做 sql 该做的事情

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX