Embauchez-moi

Je suis freelance ! Besoin d'un professionnel du développement web ? Pourquoi ne pas me passer un coup de fil ?

Plus d'infos sur… http://thibault.jouannic.fr

mots-cles : Ingénieur web freelance Symfony eZ Publish Solr

Quel algorithme de tri / vote ?

Yet another thumb(s)nail...
Creative Commons License photo credit : Cieleke

Salut chers lecteurs. J’ai une question à soumettre à votre sagacité que je sais capable de surmonter les problèmes les plus retords.

Imaginons que je veuille créer un site participatif, où les internautes peuvent voter pour des contenus (disons des photos, pour l’exemple). À chaque photo, un internaute peut attribuer une note de 1 à 10.

Imaginons que je veuille également créer une page qui trie les contenus par note, avec bien entendu les photos les mieux notées qui remontent en première page.

L’algorithme trivial serait bien entendu :

note = total des notes / nombres de voteurs

Ensuite, on trie par note, et basta.

Néanmoins, cette méthode n’est valable que dans le cas où chaque photo reçoit un certain nombre de votes. Mais si une photo médiocre reçoit un seul vote avec la note maximale, elle remontera directement en tête des meilleurs contenus. De même, si une excellente photo reçoit un seul vote avec la note minimale, elle sera immédiatement enterrée.

Autre solution, chaque photo part d’emblée avec l’équivalent de X notes avec la note moyenne. Ainsi, la formule devient :

note = (total des notes + X*5) / (nombre de voteurs + X)

Cette méthode permet de pondérer l’effet des notes isolées. Toutefois, les photos ne recevant pas de votes recevront une note moyenne.

Ce problème me semble relativement courant. L’avez vous déjà rencontré ? Quelle méthode utiliseriez vous ?


6 Commentaires

  1. Posté le 21/03/2009 à 18:10 | Permalien

    J’ai mis en place pas mal de solutions sur différents sites, la plus pertinentes reste selon moi d’exclure du classement les objets n’ayant pas reçu plus de X votes, ou X est paramétrable.

    Si c’est un projet symfony, j’ai pondu (cot cot codet’) un plugin qui fait tout ça quasiment tout seul : http://www.symfony-project.org/plugins/sfPropelActAsRatableBehaviorPlugin

  2. Posté le 21/03/2009 à 18:45 | Permalien

    Mais c’est parfait tout ça. Dommage, mon projet utilise Doctrine, mais bon… Si j’ai le temps, j’adapterai :)

    Merci.

  3. nworr
    Posté le 22/03/2009 à 12:24 | Permalien

    Pourquoi ne pas utiliser un calcul de note médiane ? et éventuellement rajouter une pondération selon le nombre de votants ..

  4. Dusty
    Posté le 27/03/2009 à 23:56 | Permalien

    Ma proposition : enlever les valeurs qui pourraient être atypiques (exemple : le 5% des notes les plus hautes et le 5% des notes les plus basses) puis faire une moyenne sur les notes restantes. Quant aux images qui n’ont pas recueillies suffisamment de notes, elles sont éliminées.
    L’avantage de cette technique par rapport au calcul de la medianne est qu’elle varie moins dans le temps (un utilisateur ne peut pas comprendre une variation importante après son vote, il pourrait imaginer que les votes sont truqués).

  5. cahnory
    Posté le 08/06/2009 à 13:27 | Permalien

    Ton poste m’a inspiré une petite solution. Cette solution pouvant être déroutante pour l’utilisateur s’il suit son classement vote par vote je pense qu’il faudrait différencier la moyenne du «  score  ». La moyenne étant le calcul normal des votes, le score celui pris en compte pour le classement.
    Voilà comment je calculerai ce score :
    soit $nb_votes_average le nombre moyen de vote reçu par candidat,
    $candidate_average la moyenne des votes du candidat,
    $candidate_nb_votes le nombre de vote reçu par le candidat
    on pose :
    $score = $candidate_average * $candidate_nb_votes / $nb_votes_average.
    Ainsi plus la quantité de vote reçu est proche de la moyenne, plus le coefficient multiplicateur est proche de 1.
    Il est imaginable de faire croitre ou décroitre le coefficient plus rapidement si celà se révèle être plus pertinent mais je n’ai pas fait de test grandeur nature :) .

  6. Jean-Louis
    Posté le 23/01/2010 à 01:56 | Permalien

    Ce n’est pas une réponse à la question, mais je pense que quelque soit l’algorithme une note seule peut difficilement être pertinente. La médiane semblerait être la meilleure solution, mais il arrive souvent que les avis soient opposés et qu’un nombre comparable d’individus trouvent que le produit est génial ou nul, ce qui donne une note moyenne, non significative… Quand on a la chance d’avoir de la place pour afficher des réponses, la meilleure solution me semble être celle adoptée par Apple sur iTune pour noter les applications iPhone : un histogramme des réponses avec des notes allant de 1 à 5 étoiles.

Envie de vous exprimer ?

Votre email n'est jamais affiché. Votre commentaire ne sera pas affiché non plus s'il est bourré de fautes ou de liens publicitaires. Vous êtes prévenu.

*
*