22 Mai

Quelle pizza est faite pour vous ? Cet algorithme a la réponse…

Lors du workshop #intelAi sur l’intelligence artificielle on nous a parlé de manière simplifiée sur la manière dont Netflix propose des recommendations à ses utilisateurs. Je vous fait partager cette méthode en codant un petit « algorithme » de recommendation de pizzas en php.

Pour créer cette algorithme, je me suis basé sur les pizzas de Pizza king, une pizzeria proche de 42 et j’ai choisi 16 de leurs pizzas.

Première étape : Choisir les bons critères de recommendation.

La première étape de la fabrication d’un algorithme de recommendation est de choisir les bons critères de classement des produits. Ainsi, si Netflix utilisera des genres (comédie, Horreur, Romantique, …), nous utiliserons nous des grandes familles d’ingrédients. J’en ai choisi sept qui me semblaient pertinents : Charcuterie, Fromage, Poisson, Légumes, Viande Hachée, Poulet et épicé/piquant. Le dernier critère n’est pas vraiment une famille d’ingrédients mais reste un critère utile pour correspondre aux choix de l’affamé indécis en quête de pizza utilisant le programme. Une fois que vous avez votre liste de critères objectifs, passez à l’étape suivante.

Deuxième étape : Attribuer un poids aux produits.

Pour cette deuxième étape, un humain est nécéssaire. Il s’agit pour chaque produit disponible d’attribuer un poids à chaque caractéristique. Plus les poids sont attribués de manière précise et objective, plus l’algorithme sera efficace. Pour attribuer les poids, on va utiliser un tableau de int. Petit exemple avec la pizza charcutière.

Nous avons une pizza composée de : tomate, fromage, jambon, chorizo, pepperoni.
Nous devons attribuer une notre aux critères suivants : charcuterie, fromage, poisson, légumes,piquant, viande hachée, poulet.
Pour chaque ingrédient de la pizza, nous allons regarder comment il affecte nos critères :

Comme on peut le voir, un critère peut être affecté plusieurs fois et un ingrédient peut affecter plusieurs critères (le chorizo est de la charcuterie et est piquant).

A partir de la nous pouvons attribuer une note a chaque critère et placer toutes ces notes dans un tableau correspondant a la pizza et où chaque case est un critère.

$charcutiere = array(7,2,0,2,3,0,0);

Dans l’exemple ci dessus les notes sont sur 10.

Pour me simplifier le code, je vais aussi enregistrer au passage la description de la pizza dans mon tableau :

$charcutiere = array(7,2,0,2,3,0,0, »Charcutière : tomate, fromage, jambon, chorizo, peperonni »);

Le défaut de cette étape est qu’elle est subjective et que deux personnes peuvent attribuer dès lors un score différent à une même pizza. Nous pouvons maintenant passer à la troisième étape .

Troisième étape : Récolter les goûts de l’utilisateur

On pourrait imaginer faire une moyenne de toutes ses dernières commandes de pizza pour voir vers quoi tendent ses préférences. Pour ce test je vais plutôt me baser sur un petit formulaire rempli par l’utilisateur sur ce qu’il a envie de manger sur l’instant. En bougeant des curseurs, il pourra indiquer ce qu’il souhaite retrouver ou pas dans son repas.

Quatrième étape : Extraire une recommendation 

C’est maintenant que la magie s’opère. On va obtenir un score pour chaque pizza en fonction des gouts de l’utilisateur. En comparant les scores, on saura directement quelle pizza est faire pour lui.

Pour y parvenir c’est de la simple multiplication de « vecteurs ». On prend le critère 1 de la pizza et on le multiplie par le critère 1 de l’utilisateur. On y a joute ensuite le critère 2 de la pizza multiplié par le critère 2 de l’utilisateur et ainsi de suite.

Ainsi on fait simplement le calcul suivant :

score_pizza = (pizza.critere1 * client.critere1) +(pizza.critere2 * client.critere2) + (pizza.critere3 * client.critere3) + …

Une fois que tous les critères ont étés pris en compte, on découvre alors le score de la pizza pour l’utilisateur. plus le score est élevé, plus il est probable que ce choix convienne à l’utilisateur…

En php cela donne :

function getscore($pizza, $taste)
{
global $score1, $score2, $score3, $name1, $name2, $name3;
$temp = 0;
$var = 0;
while ($var < 7) //car on a 7 critères pour nos pizzas
{
$temp = $temp + ($pizza[$var] * $taste[$var]);
$var++;
}
}

Il reste en suite a savoir combien de résultats et comment vous voulez afficher les meilleurs scores mais le principe est là.

Moi je suis simplement parti sur l’affichage des trois pizzas préférées de l’utilisateur.

Pour finir

Pour finir il peut être intéressant de comparer les choix d’un utilisateur avec un autre utilisateur ayant des goûts similaires afin de perfectionner l’algorithme. Comme il peut être intéressant d’ajouter des critères  supplémentaires surtout lorsqu’on commence a connaitre l’utilisateur (par exemple tenir compte du nombre de fois ou chaque pizza à été commandé par lui pour savoir quelle est sa pizza favorite).

Si tout cela vous a donné faim, sachez que vous pouvez tester l’algorithme sur pizza.timotheemohr.com.