我正在寻找一种算法来按流行度对网站结果进行排序..就像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)
虽然这个解决方案确实有效,但并不理想。在过去的几个小时里,一个新的热门帖子在流行和即将到来的时候往往排名很高,这不是我想要的。
任何人都可以提出另一种算法,我可以修改指数成分来调整衰变吗?
答案 0 :(得分:12)
您是否尝试过黑客新闻使用的排名算法? 它很容易实现。
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
您可以改变重力来调整衰减。
有关更多信息,请参阅How Hacker News ranking algorithm works
答案 1 :(得分:4)
您是否尝试过“流行”和“即将推出”使用不同的衰减功能?例如,使用“即将来临”的指数衰减率和“流行”的多项式衰减率,这样,几个小时后(如果正确优化),一个帖子在即将到来时得分很高的可能性很小。而在多项式衰减函数中,相邻时间之间的关系变小,而指数衰减函数则不然。
以下是一个示例(参数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)