Mysql + PHP для "Интервал счета Уилсона" с временной гравитацией - PullRequest
1 голос
/ 28 февраля 2012

Я бы хотел внедрить систему ранжирования новостей на веб-странице.

И мне нужно руководство по:

  • Мой подход. Это правильно? Это безумие / глупость?
  • Если правильно, то по его реализации.

Соответствующая информация:

  • Я использую PHP, MYSQL с воспламенителем кода.
  • Пользователь может up_vote и down_vote новости веб-страницы.
  • Новости будут оцениваться по «Интервалу счета Уилсона» с небольшими изменениями:
    • Временная гравитация (скорее всего, новые новости появятся первыми).
    • Однако затухание времени остановится через 48 часов (гравитационный эффект для новостей будет таким же, как и через 48 часов).

подход Я хотел бы сделать все через Mysql:

  • Я бы сохранил время-гравитированный Вильсон (TGWS) - тот, который был получен в функции gravityRating - в news_table.
  • Я бы создал триггер. Я бы пересчитал только TGWS для того, чтобы за новый ряд проголосовали вверх / вниз.
  • Я бы создал событие. Каждые 30 минут он будет обновлять TGWS новостей, опубликованных за последние 48 часов. (По истечении 48 часов счет не должен изменяться до тех пор, пока не будет проведено голосование, поэтому нет необходимости пересчитывать новости старше 48 часов).

Имеет ли это смысл?

Осуществление Хорошо. Я знаю код в PHP (см. Ниже). Но как мне перенести код Wilson Score на Mysql? Это возможно? Это уже где-то сделано? Я уже создал триггеры, функции, события и процедуры в Mysql, но я не знаю, как его портировать.

Спасибо!

<?php

class Rating
{
  public static function ratingAverage($positive, $total, $power = '0.05')
  {
    if ($total == 0)
      return 0;

    $z = Rating::pnormaldist(1-$power/2,0,1);
    $p = 1.0 * $positive / $total;
    $s = ($p + $z*$z/(2*$total) - $z * sqrt(($p*(1-$p)+$z*$z/(4*$total))/$total))/(1+$z*$z/$total);
    return $s;
  } 

  public static function pnormaldist($qn)
  {
    $b = array(
      1.570796288, 0.03706987906, -0.8364353589e-3,
      -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5,
      -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8,
      0.3657763036e-10, 0.6936233982e-12);

    if ($qn < 0.0 || 1.0 < $qn)
      return 0.0;

    if ($qn == 0.5)
      return 0.0;

    $w1 = $qn;

    if ($qn > 0.5)
      $w1 = 1.0 - $w1;

    $w3 = - log(4.0 * $w1 * (1.0 - $w1));
    $w1 = $b[0];

    for ($i = 1;$i <= 10; $i++)
      $w1 += $b[$i] * pow($w3,$i);

    if ($qn > 0.5)
      return sqrt($w1 * $w3);

    return - sqrt($w1 * $w3);
  }

    public static function gravityRating($positive, $total, $time, $power = '0.05')
  {
    if ($total == 0)
      return 0;
    return (Rating::ratingAverage($positive, $total, $power) / pow($time,0.5)); //para reducir el valor del tiempo solo dividir time por algo.
  }
}

1 Ответ

0 голосов
/ 28 февраля 2012

Я не думаю, что ваш вопрос имеет какой-либо смысл. В действительности не существует такой вещи, как гравитация времени, а также, если вы просто хотите показать последние новости, вы можете отсортировать новости. Также верно, что интервал Уилсона не имеет никакого отношения ко времени, поэтому вычисление каждые 30 минут интервала Уилсона ничего не меняет.

...