Методы сортировки вверх / вниз проголосовавших - PullRequest
1 голос
/ 09 июня 2009

Я вытаскиваю предметы из базы данных (в данном случае, комментарии, но это должно относиться ко всему) и имею следующую информацию о них:

  • Количество полученных голосов
  • Количество поданных голосов (следовательно, общий балл и количество голосов)
  • Дата создания элемента
Я заинтересован в том, чтобы придумать способ отсортировать их по следующим соображениям:
  1. «Лучшие» (с самым высоким рейтингом?) Предметы должны стоять на первом месте
  2. Вновь созданные предметы, которые не были замечены или оценены, не должны быть похоронены
  3. Предметы с небольшим количеством голосов (по сравнению с остальной частью коллекции, не совсем), должны редко, если вообще когда-либо появляться в самом верху.

    Кажется, что существуют два наивных подхода:

    • Сортировка предметов по их суммарному баллу. Это удовлетворяет 1 и 3 выше, но не дает 2, так как новые элементы появляются в конце и редко видны.
    • Сортировка элементов по их процентам от числа голосов, что дает новым элементам начальное значение, которое ставит их впереди. Это ломает 3 и, возможно, 1.

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

    Это кажется довольно распространенной проблемой. Есть ли способ гибридизировать некоторые из подходов, описанных выше? Существуют ли алгоритмы, снижающие рейтинг? Пожалуйста, поделитесь своими идеями!

Ответы [ 5 ]

2 голосов
/ 09 июня 2009

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

Таким образом, новый предмет может иметь высокий рейтинг; однако, если он не получит много голосов, он со временем опустится в вашем списке. Если это произойдет, однако, он будет расти; все же, только старые предметы со значительным количеством голосов остаются в списке первыми.

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

0 голосов
/ 10 июня 2009

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

Моя вторая идея состояла в том, чтобы иметь два раздела: топ-5 + все-самое-новое-первое. Вы можете изменить 5 на другое, я бы сказал, например, 2 * sqrt (total_number).

Теперь Мое лучшее предложение - отобразить:

  • Лучший комментарий
  • Комментарий второго места
  • Комментарий третьего места
  • [ссылка] "нажмите, чтобы увидеть больше комментариев"
  • [пробел]
  • [ссылка] "нажмите, чтобы увидеть больше новых комментариев"
  • Последний комментарий # 10
  • Последний комментарий # 9
  • Последний комментарий # 8
  • Последний комментарий # 7
  • Последний комментарий # 6
  • Последний комментарий # 5
  • Последний комментарий # 4
  • Последний комментарий # 3
  • Последний комментарий # 2
  • Последний комментарий
  • [добавить новые комментарии textarea]

Это соответствует интуиции, которая:

  • первое, что вы видите, это лучший , и он может быть вниз проголосовал вниз если это не
  • новые комментарии появляются внизу, в том месте, где вы их вводите для текстовой области.
  • upvotes всегда пытайтесь переместить комментарий вверх
  • лучшие и новейшие комментарии не смешиваются
  • при нажатии [ссылка] вставляется больше без изменения страницы.

Как видите, вы можете буквально использовать стрелки вверх и вниз для повышения / понижения голосов:)

Отдельно дайте возможность изменить это, поместив " вид по умолчанию | сортировать по голосам | по возрастанию | по убыванию времени | рейтинг автора | повышающие оценки | понижающие оценки | какие-либо вкладки где-то (я думаю, что ТАК это хорошо).

Мне кажется, что мое решение удовлетворяет # 1- # 3 довольно легко!

0 голосов
/ 09 июня 2009

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

оценка = ABS_WEIGHT * (up_votes - down_votes) + PCT_WEIGHT * (up_votes * 100 / down_votes) - AGE_WEIGHT * days_since_created

0 голосов
/ 09 июня 2009

Сортировка по общему количеству баллов и начисление бонусных баллов за новые предметы.

, например

  • Менее 30 минут, +3 балла
  • 30 минут - 1 час, +2 балла
  • 1 - 3 часа, + 1 балл
0 голосов
/ 09 июня 2009

Я предлагаю сделать функцию оценки зависящей от времени - например, экспоненциальный спад.

score = sum(vote.value * exp(-vote.age))

voice.value предполагается равным +1 или -1. Это приведет к падению влияния старых голосов и сохранению порядка голосов с таким же возрастом. Если у вас нет возраста всех голосов, вы можете просто использовать возраст комментария.

Далее вы можете добавить значение, которое падает с ростом числа голосов. Это принесет комментарии с несколькими голосами в начало списка.

score = c1 * sum(vote.value * exp(-vote.age)) + c2 * exp(-comment.votes.count)

c1 и c2 являются константами для настройки функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...