il y a 8 ans par
DavidCourtinot
Je ne trouve pas ça très convaincant ! Pour être efficace, ce genre de site doit forcément avoir un moteur de recherche. Même pour toi qui gère le site, tu as intérêt à avoir des moyens d'interroger ta base de données sur le contenu de Skiller. En faisant ça, il devrait y avoir les bases d'un moteur de recherche côté utilisateur.
Un moteur de recherche intelligent n'est pas simple à implémenter et je ne m'en prétends pas capable, par contre on peut penser à des algos assez simples qui aideraient à retrouver une question. Par exemple :
- récupérer les mots de la recherche
- leur affecter à chacun un poids d'autant plus petit que le mot est fréquent sur le site (plus un mot est fréquent, moins il aidera à distinguer une question d'une autre)
- éventuellement choisir d'appliquer un poids nul aux mots interrogatifs
- il faudrait disposer d'un dictionnaire (au sens informatique) de synonymes (par exemple "meilleure" ne doit pas être considéré comme différent de "meilleur"). Si un mot possède un synonyme, le remplacer par le synonyme pour standardiser la question, sinon le laisser tel quel. Disons que c'est optionnel car je ne sais moi-même pas explicitement comment construire ça là, maintenant, mais c'est quand même bien embêtant de considérer deux mots différents juste parce qu'ils sont conjugés différemment...
- multiplier ce poids par la fréquence du mot dans la requête saisie par l'utilisateur
- pour chaque question
. récupérer les mots du titre
. trier la liste des mots de la recherche et celle des mots du titre dans l'ordre alphabétique
. pour chaque mot présent dans une liste et pas dans l'autre, ajouter ce mot avec un poids de 0 dans la liste qui ne le contient pas
. calculer le produit scalaire des deux listes
- trier les questions par le produit scalaire obtenu
- sélectionner les n premiers résultats
Un exemple concret ? L'utilisateur tape R = "Quel est le meilleur langage de programmation ?", il y a deux questions sur le site Q1 = "Qui est le meilleur pâtisser de Toulouse ?", Q2 = "Que pensez-vous de l'avenir de la programmation ?".
Je vais faire sans synonyme ici. On dégage les mots interrogatifs, et on affecte les poids (valeurs au nez pour l'exemple) :
R = { est:3, le:1, meilleur:5, langage:6, de:2, programmation:8 }
Q1 = { est:3, le:1, meilleur:5, pâtissier:8, de:2, Toulouse:8 }
Q2 = { pensez:5, vous:3, de:2, le:1, avenir:7, la:1, programmation:8 }
Pour comparer R et Q1, on doit "aligner" les deux listes (je ne trie pas par flemme mais pour la performance du code il faudrait sans doute trier) :
R = { est:3, le:1, meilleur:5, pâtissier:0, langage:6, de:2, Toulouse:0, programmation: 8}
Q1 = { est:3, le:1, meilleur:5, pâtissier:8, langage:0, de:2, Toulouse:8, programmation:0 }
Produit scalaire : R.Q1 = 3*3 + 1*1 + 5*5 + 0*8 +6*0 + 0*8 + 8*0 = 35
On fait pareil avec Q2 :
R = { pensez:0, vous:0, de:2, le:1, est:3, avenir:0, la:0, meilleur:5, langage:6, programmation:8 }
Q2 = { pensez:5, vous:3, de:2, le:1, est:0, avenir:7, la:1, meilleur:0,langage:0, programmation:8 }
R.Q2 = 0*5 + 0*3 + 2*2 + 1*1 + 3*0 + 0*7 + 0*1 + 5*0 + 6*0 + 8*8 = 69
On sélectionne donc Q2 car R.Q2 > R.Q1 ! On voit là que malgré le fait que R et Q2 ont une structure semblable, l'algo ne les a pas rapprochés car 1) il ignore la structure en triant les listes de mots 2) il s'intéresse au sens des mots en leur donnant un poids qui définit leur capacité à évoquer un sujet particulier et pas un autre.
Peut-être que ça marche magiquement avec mon exemple grâce aux valeurs numériques choisies, mais en tout cas si je devais faire un moteur de recherche simple je me lancerais sur ça. Je n'avais pas prévu de faire une réponse si longue au début... si quelqu'un a le courage de lire c'est bien :)