Алгоритм взвешивания голосов - PullRequest
2 голосов
/ 19 января 2012

Я разрабатываю веб-приложение, похожее на Digg, и мне нужен алгоритм, который будет использоваться для упорядочения сообщений по популярности.Например: на первой странице я хочу, чтобы на сегодняшний день были самые популярные посты и несколько предыдущих дней, которые набрали достаточно голосов.В данный момент мой БД выглядит так:

Table | fields
Posts | id | ... | time
Feedback | id | userid | time | upvote

Поле upvote - bool.Если значение положительное, это означает, что пользователь нажал кнопку голосования.

Мои таблицы могут быть изменены, поскольку они пусты.

Любая помощь будет оценена

Ответы [ 2 ]

5 голосов
/ 19 января 2012

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

Простой способ добиться этого - конвертировать голоса в единицы популярности (ПУ) и вместо этого суммировать не просто голоса, а ПУ. Построение PU может быть так же просто, как сделать его равным 1 / (возраст голосования в днях или часах). Однодневное голосование будет стоить 1 ПУ, в то время как двухдневное голосование будет стоить вдвое меньше.

2 голосов
/ 19 января 2012

Лично мне нравится более сложный подход. Общая идея состоит в том, что процессор cron запускается каждые 5 минут, чтобы вычислить популярность каждой сущности на основе упомянутых вами критериев, а также на основе стандартного отклонения для пользователя, чтобы исключить очевидное ралли голосов банд, чтобы повысить контент в своем собственном круге общения.

Взгляните на ответ Лоусона, чтобы найти хорошую идею для определения возраста голосования. Но учтите, что может быть полезно применить собственный вес пользователя, основанный на репутации, стаже и т. Д.

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

Вот стандартное отклонение php.net: http://php.net/manual/en/function.stats-standard-deviation.php

Хотя я думаю, что этот SO-ответ более важен: z-Scores (стандартное отклонение и среднее значение) в PHP

Примеры кода могут быть хорошими, но для этого нам понадобятся некоторые ваши данные, и даже тогда это может быть довольно сложным. Но это определенно весело. Особенно, когда ваш код находит людей, пытающихся играть в систему.

...