10

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

尽管此解决方案确实有效,但它并不理想。在过去的几个小时内,一篇新的热门帖子通常在热门和即将发布的帖子中都排名靠前,这并不是我真正想要的。

谁能建议另一种算法,我可以修改指数分量来调整衰减?

4

2 回答 2

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

您可以改变重力来调整衰减。

有关更多信息,请参阅Hacker News 排名算法的工作原理

于 2013-10-07T08:46:08.057 回答
5

您是否尝试对“流行”和“即将到来”使用不同的衰减函数?例如,对“即将发布”使用指数衰减率,对“流行”使用多项式衰减率,这样,几个小时后(如果优化正确),帖子在即将发布时获得高分的可能性很小。虽然在多项式衰减函数中,相邻时间之间的关系越来越小,但指数衰减函数并非如此。

这是一个示例(参数 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)
于 2013-10-07T08:33:08.153 回答