Алгоритм распада популярности на популярных страницах сайта

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

Вот общепринятое решение, используемое reddit:

t = (time of entry post) - (Dec 8, 2005)
x = upvotes - downvotes

y = {1 if x > 0, 0 if x = 0, -1 if x < 0)
z = {1 if x < 1, otherwise x}

rank = log(z) + (y * t)/45000

Я был над алгоритмом Reddit, и хотя он подходит для одной ситуации, мне действительно нужны два алгоритма: один для популярных сообщений и другой для предстоящих сообщений:

  • Популярные сообщения
  • Предстоящие сообщения

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

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

http://sphinxsearch.com/docs/current.html#numeric-functions

Итак, у меня есть следующие данные за сообщение:

  • Возраст в секундах
  • Оценка сообщений

Вот мое текущее решение:

Exponent = 0.01 (Popular), 0.5 (Upcoming)
SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
Rank = (log10(PostScore)*10000) / pow(SecondsSincePublised,Exponent) 

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

Может ли кто-нибудь предложить другой алгоритм, который я могу изменить компонент экспоненты, чтобы настроить распад?

Ответ 1

Вы пробовали алгоритм ранжирования, используемый новостями Hacker? Это просто реализовать.

Score = (P-1) / (T+2)^G

where,
P = points of an item (and -1 is to negate submitters vote)
T = time since submission (in hours)
G = Gravity, defaults to 1.8 in news.arc

Вы можете изменить гравитацию, чтобы настроить распад.

Для получения дополнительной информации см. Как работает алгоритм ранжирования Hacker News

Ответ 2

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

Здесь пример (параметры 0.01 и 1.0005 являются произвольными и должны быть оптимизированы в соответствии с вашей целью).

Популярные:

SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
Rank = (log10(PostScore)*10000) / pow(SecondsSincePublised,0.01)

Наступающий:

SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
Rank = (log10(PostScore)*10000) / pow(1.0005,SecondsSincePublised)