Как сделать промежуток времени Уилсона, который уменьшается во времени

Итак, я работаю над интервалом времени Уилсона, чтобы отсортировать контент на моем веб-сайте, но пока он только статичен. Я имею в виду, что это всегда будет поддерживать один и тот же счет, пока кто-то не проголосует или не уменьшит его.

Вот почему я хотел бы реализовать, что оценка уменьшается со временем. Как в этой статье. Как работают алгоритмы рейтинга Reddit. В этой статье они объясняют, что показатель Reddit по контенту уменьшается со временем.

В настоящее время у меня есть эта функция php, которая дает мне оценку на основе голосов вверх и вниз:

function wilsonScore($up, $down)
{

    $score = (($up + 1.9208) / ($up + $down) - 1.96 * sqrt(($up * $down) / 
             ($up + $down) + 0.9604) / ($up + $down)) / (1 + 3.8416 / ($up + $down)) ;

    return $score;
}

Я бы хотел, чтобы оценка была одинаковой, но добавьте что-то в код SQL при сортировке.

Код SQL выглядит следующим образом:

SELECT *
FROM photos
WHERE   status = 0 
    AND net_votes > 0          // display only picture that got rated over 0
ORDER BY score DESC

Идея, которая у меня была, заключалась бы в том, чтобы закончить алгоритм, который уменьшил бы логарифмический результат, первые 1-2-3 дня, которые он опубликовал, время не влияет на оценку, которая намного больше, чем оценка начинает снижаться.

Изменить

И было бы теоретически возможно добавить что-то в партитуру, чтобы чем больше репутации (например, SO), которую пользователь набирал на сайте, тем больше его рейтинг был достоин? что-то подобное уже существует в Интернете?

Кто-то здесь уже использовал что-то вроде этого здесь?

Ответ 1

Вы можете просто сделать это в SQL:

$sql = "SELECT  `up`,
                `down`, 
                `date`, 
                (((`up` + 1.9208) / (`up` + `down`) - 1.96 * SQRT((`up` * `down`) / (`up` + `down`) + 0.9604) / (`up` + `down`)) / (1 + 3.8416 / (`up` + `down`))) AS `wilson`, 
                ((((`up` + 1.9208) / (`up` + `down`) - 1.96 * SQRT((`up` * `down`) / (`up` + `down`) + 0.9604) / (`up` + `down`)) / (1 + 3.8416 / (`up` + `down`))) / LN(DATEDIFF(NOW(), `date`) + EXP(1))) AS `weighted_wilson` 

    FROM        `photos`

    ORDER BY    `weighted_wilson` DESC
    ";

Использование естественного логарифмического распада (скорректированного на исходный счет Уилсона). Очевидно, вы можете играть со значениями.

Вы могли бы, конечно, настроить количество голосов вверх или вниз, предоставленных на основе каждого пользователя (то есть опытные пользователи предоставляют большие движения вверх/вниз).

Ответ 2

Значит, вы каждый раз генерируете эту оценку каждый раз, когда вызывается эта функция, и вызываете эту функцию каждый раз, когда вы ее показываете? Хорошо, что бы я сделал, это создать объект оценки со следующими членами, которые отражают некоторые строки в вашей базе данных

$score->id; //int
$score->score; //float
$score->up; //int
$score->down; //int
$score->last_vote; //timestamp

Оттуда каждый раз, когда кто-то голосует вверх или вниз, вы обрабатываете новый балл. Вы не должны перерабатывать его каждый раз, когда кто-то смотрит на него, если вы не хотите также учитывать это. Вы также можете запускать задание cron один раз в день, чтобы наказывать счет, который не был обновлен в течение длительного времени.