Алгоритм популярности - PullRequest
       20

Алгоритм популярности

4 голосов
/ 30 января 2009

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

Вот доступные мне меры:

  • Сколько людей одобрило эту иллюстрацию
    • votes таблица включает дату голосования
  • Когда была загружена иллюстрация
    • illustration дата создания таблицы
  • Количество комментариев (не так хорошо, как максимум комментариев на данный момент около 10)
    • comments таблица имеет дату комментария

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

Мне также нужно выяснить, лучше ли выполнять вычисления в MySQL, которые извлекают данные, или должен быть метод PHP / cron каждый час или около того.

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

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

Ответы [ 4 ]

4 голосов
/ 31 января 2009

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

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

score = (votes / 10) + comments  
age = UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date_created)

if(age < 86400) score = score * 1.5

Подход такого типа даст бонус к новому контенту, загруженному в прошедший день. Если вы хотите подходить к этому аналогичным образом только для контента, который недавно был добавлен в избранное или прокомментирован, вы можете просто добавить некоторые ограничения WHERE в свой запрос, чтобы получить оценку из БД.

На самом деле есть две серьезные причины НЕ рассчитывать этот рейтинг на лету.

  1. Требование к вашей БД получить все эти данные и выполнить вычисления для каждой загрузки страницы, чтобы просто изменить порядок элементов, приводит к дорогостоящему запросу.
  2. Возможно, меньшая ошибка, но если у вас относительно небольшая активность на сайте, небольшие изменения в рейтинге могут привести к довольно резкому движению контента.

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

2 голосов
/ 31 января 2009

Очевидно, что в этом есть некоторая субъективность - нет единого «правильного» алгоритма для определения правильного баланса - но я бы начал с чего-то вроде голосов за единицу возраста. MySQL может выполнять базовую математику, поэтому вы можете попросить его отсортировать по частоте голосов за определенное время; однако по соображениям производительности, возможно, было бы неплохо кэшировать результат запроса. Может быть, что-то вроде

SELECT images.url FROM images ORDER BY (NOW() - images.date) / COUNT((SELECT COUNT(*) FROM votes WHERE votes.image_id = images.id)) DESC LIMIT 20

но мой SQL ржавый; -)

Простое среднее значение, конечно, будет смещено в пользу новых изображений, появляющихся на первой странице. Если вы хотите устранить это смещение, вы можете, скажем, считать только те голоса, которые произошли в течение определенного периода времени после публикации изображения. Для изображений, которые были более поздними, чем этот срок, вам нужно было бы нормализовать, умножив количество голосов на срок, а затем разделив на возраст изображения. Или же вы можете придать голосам постоянно меняющийся вес, что-то вроде exp(-time(vote) + time(image)). И так далее, и так далее ... в зависимости от того, насколько вы конкретны в отношении того, что будет делать этот алгоритм, может потребоваться экспериментирование, чтобы выяснить, какая формула дает наилучшие результаты.

0 голосов
/ 31 января 2009

Что-то вроде:

(count favorited + k) * / time since last activity

Чем выше k, тем меньше вес имеет число людей, которым это нравится.

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

0 голосов
/ 30 января 2009

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

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