重点描述上面两个公式:
Ts = A – B
相当于
A的发布时间 – 设定时间(默认时间为1970-01-01就可以)
X = U – D
相当于
支持率 – 反对率
来个JAVA实现方式。
private double U = 100;
private double D = 2;
获取默认时间(1970-01-01)
private double getDefaultTime() {
java.text.DateFormat format2 = new java.text.SimpleDateFormat(
"yyyyMMddhhmmss");
String s = format2.format(new Date(0L));
return Double.parseDouble(s);
}
获取某篇文章的发布时间
private double getPostPublish(Date date) {
java.text.DateFormat format2 = new java.text.SimpleDateFormat(
"yyyyMMddhhmmss");
String s = format2.format(date);
return Double.parseDouble(s);
}
获取秒时间差
private double getSecondsDifference(Date date) {
return getPostPublish(date) - getDefaultTime();
}
获取X
public double getX() {
return U - D;
}
获取Y
public double getY(double x) {
if(x > 0)
return 1;
if(x == 0)
return 0;
return -1;
}
获取Z
public double getZ(double x) {
if(Math.abs(x) >=1) {
return Math.abs(x);
}
return 1;
}
获取作热排名
public double hotRanking() {
double x = getX();
return Math.log10(getZ(x)) + getY(x) * getSecondsDifference(new Date())/45000;
}
到这里,算法算是实现啦。
发表时间的影响
发表时间和话题排名的影响可以被概括如下:
发表时间对排名有很大影响,该算法使得新的话题比旧的话题排名靠前
话题的得分不会因为时间的流失而减少,但是新的话题会比旧的话题得分高。这与 Hacker New 的算法不同 (随着时间的发展降低话题的得分)
下图展示了话题得分在好评和差评的数量不变时,随着时间而变化的情况:
对数关系
Reddit 的热排序算法使用了对数函数来衡量前面的投票与其他投票的差距:
前十个好评和之后的100个,1000个投票有相同的权重。
参见下面的图:
去掉对数函数之后(译注:采用线性函数)的效果
反对票的影响
Reddit 是为数不多的几个可以投反对票的网站。正如上边代码所述,一个话题的得分被定义成:好评数 - 差评数
下边的图可以帮助我们理解:
这一点对那些同时有大量赞成和反对票的话题(比如说一些有争议的话题)有显著影响。这种话题的排名会比只有赞成票的话题低一些,这也就解释了为什么 kittens 和其他一些没有争议的话题排名如此靠前。
话题排名算法的结论
发表时间是一个非常重要的参数,通常,新的话题要比旧的话题排名靠前
前10个好评跟接下来的100个有着同样的权重。比如一个有着10个好评的话题,跟有50个好评的话题有着相似的排名
有争议的话题(支持票和反对票的数量相近)要比支持票占大多数的话题排名靠后
参考资料:
http://www.iteye.com/news/28228
http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/how-reddit-ranking-algorithms-work.html