Я ищу алгоритм для сортировки результатов веб-сайта по популярности. Например, 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)
Хотя это решение действительно работает, оно не является идеальным. Новый и популярный пост за последние пару часов часто занимает высокое место как в популярном, так и в предстоящем, что не совсем то, что я хочу.
Может ли кто-нибудь предложить другой алгоритм, который я могу изменить компонент экспоненты, чтобы настроить распад?