揭秘我烧网热文排序算法—SmartHot

8个月前 (04-22)

解决问题

操作常量(A)

我烧网中用户对文章的操作包括添柴、泼水(添柴的逆操作)、分享和评论等。添柴、泼水是对文章最简单、最直接的表态:喜欢就添柴,不喜欢就泼水。其他的操作所对应的分数应该参考这两项操作。因此将添柴常量定为:

1,泼水常量定为-1。

A添柴=1

A泼水=-1

分享也是对文章的肯定。如果一个用户给一篇文章添柴,说明他喜欢这篇文章;如果用户分享这篇文章,说明他不仅喜欢这篇文章,还希望其他人也来看这篇文章。两者比较,分享是比添柴更为强烈的行为。因此分享应当比添柴得到更多的分,这里将其设定为1.2。

A分享=1.2

评论则是一个双面性的操作。用户可能为赞同某一篇文章而对其评论,也可能是由于非常反对文章中的观点而进行评论。经过反复思考和研究,我们发现当一个用户对某一篇文章持反对意见而评论时,其实这篇文章是更值得的,因为往往这类文章是那种容易引起争议的或者干脆就是那些最容易被炒火的内

容。从这个角度上看,无论是正面还是负面的评论,这篇文章都应该被,而且应该比添柴、分享有更高的度。所以我们将评论的操作常量定为1.5。

A评论=1.5

时间衰减率(T)

时间衰减率的核心问题就是让文章在多长的时间内衰减多大的比例。

一般来说,我们都希望网站上排在前面的内容是新的、热点的。但是这个“新”可以是一个小时以内,也可以是以内、一周以内。“新”应该视具体情况而定。访问我烧网的人通常是每天来看看有什么新鲜的内容,因此按天来衰减对于我烧网来说是比较理的。以t0表示文章的发布时间,t1表示当前时间,T应该是(t1-t0)的函数,即:

T=f(t1-t0),其中t0和t1以天为单位。

我们在参考了某网站的Digg版之后发现,即使是排在的文章,数也很难超过100;数最多也是100多,极少数的会在200以上,大部分在50~99之间。根据我烧网的文章量和用户量,我们推测文章的得分将很难超过100。

我们列举了一组数据:当t 1 - t 0=0 , 1 , 2 ,3,4,5,6,7,文章得分(D)=10,20,30,40,50,60,

70,80,90,100时,应该设计何种排序方式?

①同的文章t相等,所以D越大排名越靠前。

②同样的D,t1-t0越小排名越靠前。

③昨天的文章100分,今天的文章10分,20分,30分,40分,这个100分的文章应该还是排在前面。

④7天前的文章100分,今天的文章10分,20分,30分,40分,这个100分的文章应该排在中间。

①和②是最基本的原则,很好理解。③和④要解决的是前一个或前N个时间周期的超级热门和今天的一般热门是怎样的先后位置。

那么我们大胆设想了两个函数:

[1]

[2]

将(t1-t0)=0,1,2,3,4,5,6,7分别代入以上两式,得:

T = +, 1 , 1/2 , 1/3 , 1/4 , 1/5 , 1/6 [3]

图1 时间衰减率函数的模型图

T = +, 1 , 1/4 , 1/9 , 1/16 , 1/25 , 1/36 [4]

以上两列结果显然[3]更理,[4]让以前的超级热门也没有任何机会,是不理的。经过优化,我们需要把正无穷的结果剔除,最终得出:T =1/(t1− t0 +1)