web-dev-qa-db-fra.com

Quelle est la différence entre le filtrage collaboratif basé sur les éléments et le contenu?

Je suis perplexe quant à la nature de la recommandation par article, comme décrit dans le livre " Mahout in Action ". Il y a l'algorithme dans le livre:

for every item i that u has no preference for yet
  for every item j that u has a preference for
    compute a similarity s between i and j
    add u's preference for j, weighted by s, to a running average
return the top items, ranked by weighted average

Comment puis-je calculer la similitude entre les articles? Si vous utilisez le contenu, n'est-ce pas une recommandation basée sur le contenu?

22
cstur4

Filtrage collaboratif par article

La recommandation originale basée sur l'élément est totalement basée sur le classement de l'élément utilisateur (par exemple, un utilisateur a évalué un film avec 3 étoiles ou un utilisateur "aime" une vidéo). Lorsque vous calculez la similitude entre les éléments, vous n'êtes pas censé connaître autre chose que l'historique des évaluations de tous les utilisateurs. Ainsi, la similitude entre les articles est calculée sur la base des notes au lieu des métadonnées du contenu de l'article.

Laisse moi te donner un exemple. Supposons que vous n'ayez accès qu'à certaines données de notation comme ci-dessous:

user 1 likes: movie, cooking
user 2 likes: movie, biking, hiking
user 3 likes: biking, cooking
user 4 likes: hiking

Supposons maintenant que vous souhaitiez faire des recommandations à l'utilisateur 4.

Vous créez d'abord un index inversé pour les articles, vous obtiendrez:

movie:     user 1, user 2
cooking:   user 1, user 3
biking:    user 2, user 3
hiking:    user 2, user 4

Comme il s'agit d'une évaluation binaire (similaire ou non), nous pouvons utiliser une mesure de similitude comme Similarité Jaccard pour calculer la similitude des éléments.

                                 |user1|
similarity(movie, cooking) = --------------- = 1/3
                               |user1,2,3|

Au numérateur, l'utilisateur1 est le seul élément du film et de la cuisine. Au dénominateur, l'union du cinéma et de la cuisine compte 3 utilisateurs distincts (utilisateur 1,2,3). |.| Indique ici la taille de l'ensemble. Nous savons donc que la similitude entre le cinéma et la cuisine est de 1/3 dans notre cas. Vous faites juste la même chose pour toutes les paires d'articles possibles (i,j).

Une fois que vous avez terminé le calcul de similitude pour toutes les paires, disons, vous devez faire une recommandation pour l'utilisateur 4.

  • Regardez le score de similitude de similarity(hiking, x) où x est tout autre tag que vous pourriez avoir.

Si vous devez faire une recommandation pour l'utilisateur 3, vous pouvez agréger le score de similitude de chaque élément de sa liste. Par exemple,

score(movie)  = Similarity(biking, movie) + Similarity(cooking, movie)
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking) 

Recommandation basée sur le contenu

Le point de vue du contenu est que nous devons connaître le contenu de l'utilisateur et de l'élément. Habituellement, vous créez un profil utilisateur et un profil d'élément à l'aide du contenu de l'espace d'attribut partagé. Par exemple, pour un film, vous le représentez avec les stars de cinéma et les genres (en utilisant un codage binaire par exemple). Pour le profil utilisateur, vous pouvez faire la même chose en fonction des utilisateurs qui aiment certaines stars de cinéma/genres, etc. Ensuite, la similitude de l'utilisateur et de l'élément peut être calculée en utilisant, par exemple, la similitude en cosinus.

Voici un exemple concret:

Supposons que ce soit notre profil d'utilisateur (en utilisant l'encodage binaire, 0 signifie pas comme, 1 signifie comme), qui contient la préférence de l'utilisateur sur 5 stars de cinéma et 5 genres de films:

         Movie stars 0 - 4    Movie Genres
user 1:    0 0 0 1 1          1 1 1 0 0
user 2:    1 1 0 0 0          0 0 0 1 1
user 3:    0 0 0 1 1          1 1 1 1 0

Supposons que ce soit notre profil de film:

         Movie stars 0 - 4    Movie Genres
movie1:    0 0 0 0 1          1 1 0 0 0
movie2:    1 1 1 0 0          0 0 1 0 1
movie3:    0 0 1 0 1          1 0 1 0 1

Pour calculer la qualité d'un film pour un utilisateur, nous utilisons similitude cosinus :

                                 dot-product(user1, movie1)
similarity(user 1, movie1) = --------------------------------- 
                                   ||user1|| x ||movie1||

                              0x0+0x0+0x0+1x0+1x1+1x1+1x1+1x0+0x0+0x0
                           = -----------------------------------------
                                         sqrt(5) x sqrt(3)

                           = 3 / (sqrt(5) x sqrt(3)) = 0.77460

De même:

similarity(user 2, movie2) = 3 / (sqrt(4) x sqrt(5)) = 0.67082 
similarity(user 3, movie3) = 3 / (sqrt(6) x sqrt(5)) = 0.54772

Si vous voulez donner une recommandation pour l'utilisateur i, choisissez simplement le film j qui a la plus haute similarity(i, j).

J'espère que cela t'aides.

103
greeness

"Basé sur un article" signifie vraiment "basé sur la similitude d'un article". Vous pouvez mettre ici la métrique de similitude que vous aimez. Oui, si elle est basée sur le contenu, comme une similitude cosinus sur des vecteurs à terme, vous pouvez également appeler cela "basé sur le contenu".

5
Sean Owen