Comment recommande-t-on un livre ?
Un système de recommandation propose à une personne des articles qu’elle n’a pas encore vus, comme un livre à emprunter. Il s’appuie sur ce que des personnes semblables ont aimé : c’est le filtrage collaboratif.
Vous allez mesurer la ressemblance entre deux lecteurs, puis calculer un score pour chaque livre.
À la fin de cette leçon
Remarque
Je peux recommander un article à partir de ce qu’ont aimé des utilisateurs semblables.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Filtrage collaboratif | recommander d’après ce qu’ont aimé des personnes semblables | |
| Similarité | un nombre de 0 à 1 qui dit à quel point deux goûts se ressemblent | |
| Score de recommandation | la somme des similarités des personnes qui ont aimé l’article | |
| Démarrage à froid | le manque d’historique pour un nouvel utilisateur ou article | |
| Article | tout ce qu’on peut recommander | un livre |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Des lecteurs semblables aiment les mêmes livres
Une médiathèque garde la liste des livres que chaque lecteur a aimés. Pour mesurer la ressemblance, on compte les livres en commun.
On divise ce nombre par le total des livres différents que les deux ont aimés. Le résultat, la similarité, va de 0 (rien en commun) à 1 (les mêmes goûts).
Exemple travaillé : cinq lecteurs
| Lecteur | Livres aimés | En commun avec Awa | Livres différents | Similarité |
|---|---|---|---|---|
| Awa | germinal, candide, zadig | |||
| Bastien | candide, zadig, nana, carmen | 2 | 5 | 0,4 |
| Camille | germinal, nana, bel-ami | 1 | 5 | 0,2 |
| Dina | carmen, nana, bel-ami | 0 | 6 | 0 |
| Émile | germinal, zadig, nana | 2 | 4 | 0,5 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer la similarité avec chaque lecteur
aimes = {
"awa": ["germinal", "candide", "zadig"],
"bastien": ["candide", "zadig", "nana", "carmen"],
"camille": ["germinal", "nana", "bel-ami"],
"dina": ["carmen", "nana", "bel-ami"],
"emile": ["germinal", "zadig", "nana"],
}
def similarite(a, b):
communs = 0
for livre in a:
if livre in b:
communs = communs + 1
return communs / (len(a) + len(b) - communs)
utilisateur = "awa"
for autre in aimes:
if autre != utilisateur:
print(autre, round(similarite(aimes[utilisateur], aimes[autre]), 2))
# Changez utilisateur en "dina" et relancez.
Le score d’un livre additionne les ressemblances
Pour recommander à Awa, on regarde les livres qu’elle n’a pas lus. Chaque lecteur qui a aimé un de ces livres « vote » avec sa similarité.
Le score de recommandation d’un livre est la somme de ces votes. On propose le livre au plus grand score.
Exemple travaillé : les scores pour Awa
| Livre | Aimé par | Calcul | Score |
|---|---|---|---|
| nana | Bastien, Camille, Dina, Émile | 0,4 + 0,2 + 0 + 0,5 | 1,1 |
| carmen | Bastien, Dina | 0,4 + 0 | 0,4 |
| bel-ami | Camille, Dina | 0,2 + 0 | 0,2 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Dans le labo, deux commandes de calcul
Le labo ne contient pas de lecteurs : il sert ici de calculatrice. Chaque commande porte ses données dans la ligne et n’écrit aucun fichier.
La première affiche trois nombres pour Awa et Bastien : les livres en commun, les livres différents, puis la similarité. La seconde affiche le score de trois livres pour Awa.
Mesurer Awa et Bastien
docker exec jupyter python3 -c "a = ['germinal', 'candide', 'zadig']; b = ['candide', 'zadig', 'nana', 'carmen']; s = len([x for x in a if x in b]); print(s, len(a) + len(b) - s, round(s / (len(a) + len(b) - s), 2))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Calculer les scores pour Awa
docker exec jupyter python3 -c "U = {'awa': ['germinal', 'candide', 'zadig'], 'bastien': ['candide', 'zadig', 'nana', 'carmen'], 'camille': ['germinal', 'nana', 'bel-ami'], 'dina': ['carmen', 'nana', 'bel-ami'], 'emile': ['germinal', 'zadig', 'nana']}; sim = lambda a, b: len([x for x in a if x in b]) / (len(a) + len(b) - len([x for x in a if x in b])); print({l: round(sum(sim(U['awa'], U[u]) for u in U if u != 'awa' and l in U[u]), 2) for l in ('nana', 'carmen', 'bel-ami')})"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un système de recommandation a des limites
On peut aussi comparer les livres entre eux : deux livres se ressemblent si les mêmes lecteurs les ont aimés. Le calcul est le même, avec les rôles échangés.
Mais un nouveau lecteur n’a pas d’historique, donc personne de semblable. C’est le démarrage à froid. Un livre que personne n’a encore lu n’est jamais proposé.
Une erreur fréquente
Attention
Beaucoup pensent qu’un système de recommandation comprend les goûts d’une personne. Il ne fait que compter ce qu’ont fait des personnes semblables. Sans historique, il n’a rien à compter, et il propose surtout ce qui est déjà populaire.
Pour aller plus loin
Ajoutez un sixième lecteur dont la liste n’a aucun livre en commun avec les autres. Recalculez les scores pour Awa.
Dites si ce lecteur change la recommandation, puis expliquez pourquoi il ne peut rien apporter à un nouveau lecteur qui n’a rien lu.