Kvalita článků dle uživatelského hodnocení

Na tento problém dříve nebo později narazí každý programátor webu, kde se něco hodnotí a podle hodnocení něco řadí. Jako příklad uvedu e-shop, kde uživatelé hodnotí produkty a jiní si je mohou podle hodnocení řadit. Předpokládejme, že každému produktu můžete udělit podle kvality jednu až pět hvězdiček.

Zmiňovaný problém však nastává, když se zamyslíme nad tím, zda-li chceme při seřazení jako první z produktů zařadit ten, který má z jednoho jediného hlasu pět hvězdiček, nebo ten, který má z padesáti hlasů průměr 4,8. Z hlediska důvěryhodnosti je rozumné zvýhodnit druhou možnost.

Jako první je třeba zjistit koeficient důvěryhodnosti hlasování. Pro vyjádření tohoto jsem zvolil logaritmickou funkci o základu, který je roven počtu očekávaných hlasujících.

1
2
3
4
5
6
7
$zaklad = 20; //počet očekávaných hlasujících
//zjištění počtu hlasujících
$dotaz = "SELECT COUNT(*) AS pocet FROM hlasovani WHERE id_produkt=$id_produkt;";
$hlasujici = mysql_fetch_array(mysql_query($dotaz));
$pocet = $hlasujici['pocet'];
 
$duveryhodnost = log($pocet, $zaklad);

Problém samozřejmě nastává, když odhlasoval pouze jeden člověk, protože poté je logaritmus roven nule a důvěryhodnost výsledku by tedy byla rovna nule. Tomuto problému je třeba se vyhnout, protože je nežádoucí a proto budeme jednoho hlasujícího člověka vydávat za 1,5 člověka.

1
2
3
if ($pocet == 1) {
  $duveryhodnost = log(1.5, $zaklad);
}

Důvěryhodnost není procentuální vyjádření, protože při počtu hlasujících větším než je základ hodnota přesáhne 1. Dále je třeba vypočítat průměrnou známku při hlasování.

1
2
3
4
5
6
7
8
9
10
if ($pocet!=0) {
  $dotaz2 = "SELECT SUM(hodnota) AS soucet FROM hlasovani WHERE id_produkt=$id_produkt;";
  $celkem = mysql_fetch_array(mysql_query($dotaz2));
  $soucet = $celkem['soucet'];
 
  $prumer = $soucet/$pocet;
}
 else {
  $prumer = 0;
 }

Obě hodnoty nakonec vynásobíme mezi sebou, abychom získali jakousi „oblíbenost produktu“.

1
2
3
4
5
6
7
8
if ($pocet != 0) {
  $oblibenost = $duveryhodnost * $prumer;
}
 else {
  $oblibenost = 0;
 }
 
echo "Oblíbenost produktu: ".$oblibenost." (průměrná známka ".$prumer." z celkem ".$pocet." hlasů)";

Uvítám vaše připomínky k tématu.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *


*

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>