Как реализовать алгоритм, подобный Digg?

Как реализовать сайт с системой рекомендаций, подобной stackoverflow/digg/reddit? I.e., пользователи представляют контент, и веб-сайт должен рассчитать какую-то "горячность" в соответствии с тем, насколько популярен элемент. Поток выглядит следующим образом:

  • Пользователи отправляют контент
  • Другие пользователи просматривают и проголосуют за контент (предположим, что 90% пользователей просматривают только контент и 10% активно голосуют вверх или вниз по контенту).
  • Новый контент постоянно отправляется

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

Я бы предположил, что алгоритм учитывает следующее:

  • Когда отправлен элемент
  • Когда каждый голос был брошен
  • Когда элемент был просмотрен

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

(Я использую MySQL + PHP, но меня интересуют общие шаблоны проектирования).

Ответ 1

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

Ответ 2

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

Ответ 3

Я разработал сайт социальных закладок, "Сайты Favoritos" и использовал сложный алгоритм:

  • Во-первых, голоса ограничены, пользователь имеет ограниченное количество голосов, а количество голосов зависит от пользовательских баллов. Чтобы заработать очки, каждый пользователь должен добавлять ссылки, которые получают положительные голоса.
  • Затем пользователи могут голосовать -3, -2, -1,1,2 или 3 голоса за каждую ссылку. Поскольку голоса ограничены, каждый пользователь будет голосовать только за те ссылки, которые им нравятся.
  • Чтобы пользователи не голосовали только по ссылкам для одного и того же пользователя, создавая группы поддержки, баллы, которые каждый голос добавляет к ссылке, зависят от расио между общим количеством голосов и голосами на ссылки владельца проголосовавшей ссылки. Если вы всегда голосуете на одних и тех же ссылках, ваши голоса потеряют значение.
  • Голоса теряют ценность со временем.
  • Новые ссылки от пользователей, у которых нет очков (новые пользователи), будут иметь 0 балл. Новые ссылки от более старых пользователей будут иметь очки в зависимости от их очков. Диапазон от +3 до -infinite. Ссылки от пользователей с отрицательными точками будут иметь отрицательные отправные точки, ссылки с пользователей с положительными точками будут иметь положительные отправные точки.

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

Ответ 4

Пол Грэм написал эссе о том, что он узнал в разработке Hacker News. Акцент делается больше на людях/взаимодействиях, которые он пытался привлечь/создать, чем на алгоритме как таковом, но все равно стоит прочитать. Например, он обсуждает различные результаты, когда истории выходят из нижней части (HN) и взрываются вверх (Digg) на первой странице. (Хотя из того, что я видел в HN, похоже, что истории взрываются и наверху).

Он предлагает эту цитату:

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

который в свете предполагаемого алгоритма для создания главной страницы HN:

(p - 1)/(t + 2) ^ 1,5

где

p = точки товара и

t = время от представления статьи

может быть хорошей отправной точкой.

Ответ 5

Я внедрил SQL-версию алгоритма ранжирования Reddit для такого агрегатора видео:

SELECT id, title
FROM videos
ORDER BY 
    LOG10(ABS(cached_votes_total) + 1) * SIGN(cached_votes_total)   
    + (UNIX_TIMESTAMP(created_at) / 300000) DESC
LIMIT 50

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