J'essaie de créer un système qui serait capable de trouver des utilisateurs avec des films/livres/intérêts/etc préférés similaires, comme voisins sur last.fm. Les utilisateurs partageant le plus d'intérêts mutuels auraient la correspondance la plus élevée et seraient affichés dans les profils d'utilisateurs (5 meilleures correspondances environ).Comment trouver des utilisateurs similaires en utilisant leurs centres d'intérêt
Y a-t-il de manière raisonnablement rapide pour cela? La solution évidente serait de créer une table avec des identifiants d'utilisateur et des identifiants d'intérêts et de comparer un utilisateur avec tous les autres utilisateurs, mais cela prendrait une éternité sur une table avec ... disent des millions d'utilisateurs ayant chacun 20 intérêts.
Je suppose qu'une solution efficace existe, car last.fm fonctionne très bien. Je préférerais utiliser une base de données SQL commune comme mySQL ou pgSQL, mais tout serait possible.
Merci pour vos suggestions.
MISE À JOUR:
Comme il se trouve, le plus gros problème est de trouver les plus proches voisins dans les bases de données SQL, comme aucun de ceux open source prend en charge ce type de recherche. Donc, ma solution serait de modifier ANN pour l'exécuter en tant que service et l'interroger depuis PHP (en utilisant des sockets par exemple) - avoir des millions d'utilisateurs avec 7 dimensions en mémoire n'est pas vraiment un gros problème et ça fonctionne incroyablement vite.
Une autre solution pour les petits ensembles de données est cette simple requête:
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-50ms avec 100K utilisateurs ayant chacun ~ 20 intérêts (10 000 intérêts possibles) en moyenne
C'est un problème très difficile à résoudre qui change beaucoup avec votre cas d'utilisation. La meilleure façon de résoudre ce problème est de réduire votre problème en regroupant les intérêts. – Wolph