Reddit:
定义
t = (t1 - epoch)
两个时间 A 和 B,其中,t1 为某篇文章的具体发布时间,精确到秒;epoch 为一个固定的时间常量,2005-12-8 7:46:43。则可以计算得到 t1 和epoch 间隔的秒数t,
定义x为某文章得到支持票数减去得到的否定票数
然后定义y为,
- 1如果支持票数大于否定票数 ,
- -1 如果支持票数小于否定票数,
- 0两者的数目相等.
现在定义:
z = max({x,1})
然后我们就得到了排名
ranking = C log10(z) + yt1
这里C是一个常量 (C = 45000).
1)时间点 epoch,2005-12-8 7:46:43,是一个固定的值,猜测应该是 Reddit 的上线时间。t 反映了文章的新鲜程度。引入 epoch 是一个非常优雅的技巧,它使得新鲜度的度量可以独立于系统当前时间。
2)y 表示支持数和否定数之间的相对关系。被否定多的文章得负分,这是合乎常理的。
3)45000 代表的是一个 12.5 小时周期内的总秒数。它 与 yt 一起使用,随着时间的推移,新文章的得分会逐渐超越高投票数的老文章,从而实现自动更新的效果。
4)log10 的使用是另外一个技巧,它可以使得早期的投票获得更大的权重。比如,前 10 票获得的权重,与 11 到 101 票所获得的权重是一样的。
整个公式的效果可以简单解释为:在 00:00:00 发布的一个帖子 a,如果它想在 12.5 小时之后,能够取得与在 12:30:00 发布的帖子 b 同样的得分,则必须在 00:00:00 点到 12:30:00 这段时间内,把它的得票数扩大 10 倍。注:这个解释不精确,但容易理解一些,不然写着太绕。
不过,其中 45000 与 log10 的选择不是通用的,得根据自己网站实际的情况进行修正。这是一个 trial-and-error 的过程,也是作算法的人最头大的部分。

没有评论:
发表评论