39 votes

Comment créer mon propre moteur de recommandation ?

Je m'intéresse aux moteurs de recommandation ces jours-ci et je veux m'améliorer dans ce domaine. Je suis en train de lire " Programmation de l'intelligence collective " Je pense que c'est le meilleur livre sur ce sujet, de O'Reilly. Mais je n'ai aucune idée sur la façon de mettre en œuvre le moteur ; Ce que je veux dire par "aucune idée" est "je ne sais pas comment commencer". J'ai un projet comme Last.fm en tête.

  1. Où dois-je commencer à créer un moteur de recommandation (à mettre en œuvre du côté de la base de données ou du côté du backend) ? moteur de recommandation ?
  2. Quel niveau de connaissance des bases de données sera nécessaire ?
  3. Y a-t-il des sources ouvertes qui peuvent être utilisées pour de l'aide ou toute autre ressource ?
  4. Quelles sont les premières mesures que je dois prendre ?

27voto

Josh Points 2820

La présentation des recommandations peut être divisée en deux sections principales :

  1. Extraction de caractéristiques
  2. Recommandation

L'extraction de caractéristiques est très spécifique à l'objet recommandé. Pour la musique, par exemple, certaines caractéristiques de l'objet peuvent être la réponse en fréquence de la chanson, la puissance, le genre, etc. Les caractéristiques des utilisateurs peuvent être l'âge, le lieu, etc. Vous créez alors un vecteur pour chaque utilisateur et chaque chanson, les différents éléments du vecteur correspondant aux différentes caractéristiques d'intérêt.

L'exécution de la recommandation proprement dite ne nécessite que des vecteurs de caractéristiques bien pensés. Notez que si vous ne choisissez pas les bonnes caractéristiques, votre moteur de recommandation échouera. Ce serait comme vous demander de me dire mon sexe en fonction de mon âge. Bien sûr, mon âge peut fournir quelques informations, mais je pense que vous pouvez imaginer de meilleures questions à poser. Quoi qu'il en soit, une fois que vous aurez vos vecteurs de caractéristiques pour chaque utilisateur et chaque chanson, vous devrez entraîner le moteur de recommandation. Je pense que la meilleure façon de le faire serait de demander à un grand nombre d'utilisateurs de passer votre test démographique et de vous dire ensuite quelles chansons ils aiment. À ce stade, vous disposez de toutes les informations dont vous avez besoin. Votre travail consiste à tracer une frontière de décision avec les informations dont vous disposez. Prenons un exemple simple. Vous voulez prédire si un utilisateur aime ou non "Back in Black" d'AC/DC en fonction de son âge et de son sexe. Imaginez un graphique présentant 100 points de données. L'axe des x correspond à l'âge, l'axe des y au sexe (1 correspond à un homme, 2 à une femme). Une marque noire indique que l'utilisateur aime la chanson, tandis qu'une marque rouge signifie qu'il ne l'aime pas. Je pense que ce graphique pourrait avoir beaucoup de marques noires correspondant à des utilisateurs de sexe masculin et âgés de 12 à 37 ans, tandis que le reste des marques seront rouges. Donc, si nous devions sélectionner manuellement une limite de décision, ce serait un rectangle autour de cette zone contenant la majorité des marques noires. C'est ce qu'on appelle la frontière de décision car, si une personne totalement nouvelle vient vous voir et vous dit son âge et son sexe, il vous suffit de la reporter sur le graphique et de lui demander si elle entre ou non dans cette case.

Donc, la partie difficile ici est de trouver la limite de décision. La bonne nouvelle est que vous n'avez pas besoin de savoir comment le faire. Vous devez juste savoir comment utiliser certains des outils les plus courants. Vous pouvez envisager d'utiliser des réseaux neuronaux, des machines à vecteurs de support, des classificateurs linéaires, etc. Là encore, ne vous laissez pas abuser par les grands noms. Encore une fois, ne vous laissez pas tromper par les grands noms. La plupart des gens ne peuvent pas vous dire ce que font réellement ces outils. Ils savent juste comment brancher les choses et obtenir des résultats.

Je sais que c'est un peu tard, mais j'espère que cela aidera tous ceux qui tomberont sur ce fil.

24voto

hurikhan77 Points 3868

J'en ai moi-même construit un pour un portail vidéo. L'idée principale que j'avais était de collecter des données sur tout :

  • Qui a téléchargé une vidéo ?
  • Qui a commenté une vidéo ?
  • Quels tags ont été créés ?
  • Qui a visité la vidéo ? (également suivi des visiteurs anonymes)
  • Qui a favorisé une vidéo ?
  • Qui a noté une vidéo ?
  • Sur quels canaux la vidéo a-t-elle été affectée ?
  • Les flux de texte du titre, de la description, des balises, des canaux et des commentaires sont collectés par un indexeur plein texte qui donne du poids à chacune des sources de données.

Ensuite, j'ai créé des fonctions qui retournent des listes de tuples (id,weight) pour chacun des points ci-dessus. Certaines ne prennent en compte qu'un nombre limité de vidéos (par exemple les 50 dernières), d'autres modifient le poids par exemple en fonction du classement, du nombre de tags (plus souvent tagué = moins expressif). Il existe des fonctions qui renvoient les listes suivantes :

  • Vidéos similaires par recherche plein texte
  • Vidéos téléchargées par le même utilisateur
  • Autres vidéos que les utilisateurs de ces commentaires ont également commentées
  • D'autres vidéos ont également été favorisées par les utilisateurs de ces favoris.
  • Autres vidéos sur lesquelles les évaluateurs de ces évaluations ont également donné une note (pondérée)
  • Autres vidéos dans les mêmes canaux
  • Autres vidéos avec les mêmes tags (pondérés par l'"expressivité" des tags)
  • Autres vidéos jouées par les personnes qui ont joué cette vidéo (XY dernières lectures)
  • Vidéos similaires par commentaires en texte intégral
  • Vidéos similaires par titre en texte intégral
  • Vidéos similaires par description plein texte
  • Vidéos similaires par tags en texte intégral

Tous ces éléments seront combinés en une seule liste en additionnant simplement les poids par identifiant vidéo, puis triés par poids. Cela fonctionne assez bien pour environ 1000 vidéos maintenant. Mais vous devez faire un traitement en arrière-plan ou une mise en cache extrême pour que cela soit rapide.

J'espère que je pourrai bientôt réduire cela à un moteur de recommandation générique ou à un calculateur de similarité et le publier sous forme de plugin rails/activerecord. Actuellement, c'est toujours une partie bien intégrée de mon projet.

Pour donner un petit indice, en code ruby cela ressemble à ceci :

def related_by_tags
  tag_names.find(:all, :include => :videos).inject([]) { |result,t|
    result + t.video_ids.map { |v|
      [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))]
    }
  }
end

Je serais intéressé de savoir comment d'autres personnes résolvent ces algorithmes.

3voto

Pranab Ghosh Points 31

J'ai un blog en 2 parties sur le moteur de recommandation basé sur le filtrage collaboratif pour la mise en œuvre dans Hadoop.

http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/

http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/

Voici le dépôt github pour le projet open source https://github.com/pranab/sifarish

N'hésitez pas à l'utiliser si vous l'aimez.

3voto

Steve Haigh Points 6261

C'est vraiment une très grande question que vous posez, donc même si je pouvais vous donner une réponse détaillée, je doute d'avoir le temps.... mais j'ai une suggestion, jetez un œil au blog de Greg Linden et à ses articles sur le filtrage collaboratif basé sur les éléments. Greg a mis en œuvre l'idée des moteurs de recommandation chez Amazon en utilisant l'approche basée sur les éléments. Il connaît vraiment son sujet et son blog et ses articles sont très faciles à lire.

Blog : http://glinden.blogspot.com/ Papier : http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (J'ai bien peur que vous deviez vous connecter pour le lire dans son intégralité, mais comme vous êtes un étudiant en informatique, cela devrait être possible).

Modifier Vous pouvez également jeter un coup d'œil à Infer.Net Ils incluent un exemple de construction d'un système de recommandation pour des données de films.

2voto

michuk Points 432

Un exemple de moteur de recommandation à source ouverte (sous licence AGPLv3) a été publié récemment par Filmaster.com. Il est écrit en C++ et utilise les meilleures pratiques des livres blancs produits dans le cadre du défi Netflix. Vous trouverez un article à ce sujet à l'adresse suivante : http://polishlinux.org/gnu/open-source-film-recommendation-engine/ et le code est ici : http://bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X