Как сделать интервал оценки Уилсона, уменьшающийся со временем

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

Вот почему я хотел бы реализовать, чтобы оценка уменьшалась со временем. Как в этой статье. Как работают алгоритмы ранжирования 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 дня, когда она публикуется, время не сильно влияет на оценку, затем оценка начинает снижаться.

Редактировать

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

Кто-то здесь уже использовал что-то подобное здесь?


person Joris Blanc    schedule 27.07.2012    source источник
comment
Вы можете взглянуть на исходный код OSQA. Это клон stackoverflow с открытым исходным кодом. osqa.net   -  person Patrick Savalle    schedule 07.08.2012


Ответы (2)


Вы можете просто сделать это в 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
    ";

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

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

person Paul Norman    schedule 07.08.2012

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

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

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

person Michael Gutierrez    schedule 07.08.2012