作热排名算法(hot ranking)的工作原理


重点描述上面两个公式:
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

猜你喜欢

转载自lzj0470.iteye.com/blog/1933054