您的位置:首页 > 其它

基于用户投票的排名算法(三):Stack Overflow

2015-10-08 17:00 405 查看
作者: 阮一峰

日期: 2012年3月11日

上一篇文章,我介绍了Reddit的排名算法。

它的特点是,用户可以投赞成票,也可以投反对票。也就是说,除了时间因素以外,只要考虑两个变量就够了。

但是,还有一些特定用途的网站,必须考虑更多的因素。世界排名第一的程序员问答社区Stack Overflow,就是这样一个网站。





你在上面提出各种关于编程的问题,等待别人回答。访问者可以对你的问题进行投票(赞成票或反对票),表示这个问题是不是有价值。



一旦有人回答了你的问题,其他人也可以对这个回答投票(赞成票或反对票)。



排名算法的作用是,找出某段时间内的热点问题,即哪些问题最被关注、得到了最多的讨论。

在Stack Overflow的页面上,每个问题前面有三个数字,分别表示问题的得分、回答的数目和该问题的浏览次数。以这些变量为基础,就可以设计算法了。



创始人之一的Jeff Atwood,曾经在几年前,公布过排名得分的计算公式。



写成php代码,就是下面这样:





各个算法变量的含义如下:

(1)Qviews(问题的浏览次数)

  


某个问题的浏览次数越多,就代表越受关注,得分也就越高。这里使用了以10为底的对数,用意是当访问量越来越大,它对得分的影响将不断变小。

(2)Qscore(问题得分)和Qanswers(回答的数量)

  


首先,Qscore(问题得分)= 赞成票-反对票。如果某个问题越受到好评,排名自然应该越靠前。

Qanswers表示回答的数量,代表有多少人参与这个问题。这个值越大,得分将成倍放大。这里需要注意的是,如果无人回答,Qanswers就等于0,这时Qscore再高也没用,意味着再好的问题,也必须有人回答,否则进不了热点问题排行榜。

(3)Ascores(回答得分)

  


一般来说,"回答"比"问题"更有意义。这一项的得分越高,就代表回答的质量越高。

但是我感觉,简单加总的设计还不够全面。这里有两个问题。首先,一个正确的回答胜过一百个无用的回答,但是,简单加总会导致,1个得分为100的回答与100个得分为1的回答,总得分相同。其次,由于得分会出现负值,因此那些特别差的回答,会拉低正确回答的得分。

(4)Qage(距离问题发表的时间)和Qupdated(距离最后一个回答的时间)

  


改写一下,可以看得更清楚:

  


Qage和Qupdated的单位都是秒。如果一个问题的存在时间越久,或者距离上一次回答的时间越久,Qage和Qupdated的值就相应增大。

也就是说,随着时间流逝,这两个值都会越变越大,导致分母增大,因此总得分会越来越小。

(5)总结

Stack Overflow热点问题的排名,与参与度(Qviews和Qanswers)和质量(Qscore和Ascores)成正比,与时间(Qage和Qupdated)成反比。

(完)


文档信息

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

发表日期: 2012年3月11日

更多内容: 档案 » 算法与数学

购买文集: 《如何变得有思想》

社交媒体: twitter weibo

Feed订阅:






相关文章

2015.09.01: 理解矩阵乘法

大多数人在高中,或者大学低年级,都上过一门课《线性代数》。这门课其实是教矩阵。

2015.07.27: 蒙特卡罗方法入门

本文通过五个例子,介绍蒙特卡罗方法(Monte Carlo Method)。

2015.06.10: 泊松分布和指数分布:10分钟教程

大学时,我一直觉得统计学很难,还差点挂科。

2013.12.16: 朴素贝叶斯分类器的应用

生活中很多场合需要用到分类,比如新闻分类、病人分类等等。


留言(18条)

刘永新 说:

呵呵,继续来学习,第一次沙发!

2012年3月11日 15:56 | | 引用

iotioa 说:

阮兄的博客现在经常访问不了了啊,呵呵

2012年3月11日 20:17 | | 引用

小兵 说:

这个太复杂了,对于大型社区还行,一般的站点基本上不起作用,还容易被人刷票

2012年3月11日 22:51 | | 引用

自由国度 说:

stackoverflow是系统自动找出最佳回答?一看就知道没用过SF,纸上谈兵。

2012年3月12日 09:27 | | 引用

qtxie 说:

引用自由国度的发言:


stackoverflow是系统自动找出最佳回答?一看就知道没用过SF,纸上谈兵。

作者说的是“根据投票结果”,stackoverflow自动找出最佳回答,这没有问题啊。

2012年3月13日 11:11 | | 引用

sicifus 说:

引用:“但是我感觉,简单加总的设计还不够全面。这里有两个问题。首先,一个正确的回答胜过一百个无用的回答,但是,简单加总会导致,1个得分为100的回答与100个得分为1的回答,总得分相同。其次,由于得分会出现负值,因此那些特别差的回答,会拉低正确回答的得分。”

————————————————

我倒觉得它的算法是对的,

因为对于目的为“找到热点问题”的排名算法来说,

“讨论参与度”的权重大于“答案正确度”。

试想有一个争论极为激烈、参与者众多,但双方观点争锋相对、阵营势均力敌的话题,

如果在sum(Ascores)这一项里引入了负值抵扣的话,就会变得和平淡的对立话题无法区分了;

而如果引入了针对高分回答的加权,则排名的性质其实变成了受欢迎的最佳答案,而非热点问题排名。

2012年3月13日 12:07 | | 引用

ifeinano 说:

有人研究过豆瓣评论的算法吗,除了有用、没用、时间这些变量之外,貌似还有其他的因素

2012年3月13日 14:46 | | 引用

textbox 说:

最近博客的频率好小啊,博主加油啊。。。。。。

2012年3月13日 17:42 | | 引用

lusernews 说:

"一旦有人回答了你的问题,其他人也可以对这个回答投票(赞成票或反对票)。根据投票结果,系统自动找出最佳回答。"

---

不是自动找出最佳回答的,由提问人来选的。

2012年3月14日 17:40 | | 引用

阮一峰 说:

引用lusernews的发言:


不是自动找出最佳回答的,由提问人来选的。

不好意思,我没在SO上面提问过……

文章已经改过来了。

2012年3月16日 01:56 | | 引用

依云 说:

引用小兵的发言:


这个太复杂了,对于大型社区还行,一般的站点基本上不起作用,还容易被人刷票

看策略和管理了。so 的门槛不低,想刷票太难了,需要一定的积分才能投票,而且每天能投的票数很有限。而积分只有认真参与才能得到。

2012年3月16日 11:39 | | 引用

凡尘飞扬 说:

嗯,很好很有用~~值得我参考来设计互联网咨询价值算法的设计。

2012年3月31日 21:53 | | 引用

bencai 说:

引用sicifus的发言:


对于目的为“找到热点问题”的排名算法来说,

“讨论参与度”的权重大于“答案正确度”。

试想有一个争论极为激烈、参与者众多,但双方观点争锋相对、阵营势均力敌的话题,如果在sum(Ascores)这一项里引入了负值抵扣的话,就会变得和平淡的对立话题无法区分了;而如果引入了针对高分回答的加权,则排名的性质其实变成了受欢迎的最佳答案,而非热点问题排名。

这个还是得看问题展现的应用场景。如果问题的展示是希望得到更多的人参与回答,那么不需要特别针对高分回答进行加权;相反,如果问题的展示是希望给更多的人提供帮助,则需要针对高分问答进行加权。类似于 已解决问题 和 待解决问题。

2012年4月11日 14:38 | | 引用

指针 说:

公式中的4、5、2三个系数是怎么确定的?

2012年4月17日 11:37 | | 引用

米老朱 说:

引用指针的发言:


公式中的4、5、2三个系数是怎么确定的?

同问,系数是如何确定的,有没有什么方法?

2012年5月28日 10:53 | | 引用

world_wind 说:

博主,看了php代码,Qage和Qupdated的单位不是秒,应该是小时,如果是秒的话,分母就太大了。

2013年8月25日 17:40 | | 引用

宋小北 说:

希望博主对各大推荐算法的优缺点进行对比,让读者更清晰。

2014年5月30日 16:47 | | 引用

seagate 说:

引用world_wind的发言:


博主,看了php代码,Qage和Qupdated的单位不是秒,应该是小时,如果是秒的话,分母就太大了。

确实是 小时 ,/3600 .....我正纳闷呢。。。

2014年9月10日 15:39 | | 引用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: