我正在尝试创建一个系统,该系统能够找到具有类似喜爱的电影/书籍/兴趣/等的用户,就像 last.fm 上的邻居一样。共享最多共同兴趣的用户将具有最高匹配,并将显示在用户配置文件中(5 个最佳匹配左右)。
有没有相当快速的方法来做到这一点?显而易见的解决方案是创建一个包含用户 ID 和兴趣 ID 的表,并将一个用户与所有其他用户进行比较,但这将永远在一个表上花费......比如说百万用户,每个用户有 20 个兴趣。
我认为存在一些有效的解决方案,因为 last.fm 运行良好。我更喜欢使用一些常见的 SQL 数据库,如 mySQL 或 pgSQL,但任何事情都可以。
感谢您的建议。
更新:
事实证明,最大的问题是在 SQL 数据库中找到最近的邻居,因为没有一个开源数据库支持这种搜索。
所以我的解决方案是修改 ANN 以作为服务运行并从 PHP 查询它(例如使用套接字) - 甚至数百万用户在内存中说 7 维并不是什么大问题,它运行速度快得令人难以置信。
较小数据集的另一个解决方案是这个简单的查询:
SELECT b.user_id, COUNT(1) AS mutual_interests
FROM `users_interests` a JOIN `users_interests` b ON (a.interest_id = b.interest_id)
WHERE a.user_id = 5 AND b.user_id != 5
GROUP BY b.user_id ORDER BY mutual_interests DESC, b.user_id ASC
20-50 毫秒,10 万用户,每个用户平均有大约 20 个兴趣(10 000 个可能的兴趣)