流行网站帖子的流行度衰减算法

时间:2013-10-07 07:44:10

标签: c# algorithm sphinx

我正在寻找一种算法来按流行度对网站结果进行排序..就像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) 

虽然这个解决方案确实有效,但并不理想。在过去的几个小时里,一个新的热门帖子在流行和即将到来的时候往往排名很高,这不是我想要的。

任何人都可以提出另一种算法,我可以修改指数成分来调整衰变吗?

2 个答案:

答案 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)