StackOverflow问答排名算法

16 sec read

先前的文章介绍了StackOverflow的系统架构,这次继续排序话题,学习的是StackOverFlow的排序算法。

StackOverflow的排序共分为两类,1个是问题排序,1个是答案排序。这里主要介绍的是关于热门问题的排序。

在分析问题前可以先考虑下,如果是你来做这个排名算法需要考虑哪些因素?

  • 问题的投票人数,StackOverflow允许用户投反对票,所以这里可以使用绝对投票数,即正面票-负面票数量。绝对数越高问题越热门。
  • 问题浏览量,或是有效浏览量,有效浏览量可以建立一个停留时间的阀值去衡量。浏览的越多则越热门。
  • 问题的答案数,理论上说答案越多则问题的越热门,但这也并不绝对,有些好的问答可能只有一个好的答案。
  • 问题答案的认可数,即是否存在一个被大量认可的答案。这里存在两种情况,被提问者认可或被其他访问者投票。多少的投票量可以认为是问题答案被认可也是需要考虑的问题。
  • 问题的提问时间和问题的最后答复时间,问题的受欢迎程度应该是随时间变长而变得不热门。
  • 提问者的声望和回答问题的声望,声望越高的问题肯定质量越到,越值得去推荐。

在08年8月23日的时候,StackOverflow的创始人 Jeff Atwood曾经公布了一个热门问题的排名算法(链接):具体为

此算法目前是否还继续使用或者是否改变不得而知。下面我们详细介绍下问题排名中涉及到的变量。将其转化成Python代码为:

Qviews(问题的浏览次数)

log(Qviews)*4

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

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

(Qanswers * Qscore)/5

Qscore(问题得分)= 赞成票-反对票。如果某个问题越受到好评,排名自然应该越靠前。Qanswers 表示回答的数量,代表有多少人参与这个问题。这个值越大,得分将成倍放大。这里需要注意的是,如果无人回答,Qanswers 就等于0,这时 Qscore 再高也没用,意味着再好的问题,也必须有人回答,否则进不了热点问题排行榜。

Ascores(回答得分)

sum(Ascores)

一般来说,”回答”比”问题”更有意义。这一项的得分越高,就代表回答的质量越高。但是简单加总的设计还不够全面。这里有两个问题。首先,一个正确的回答胜过一百个无用的回答,但是,简单加总会导致,1个得分为 100 的回答与 100 个得分为 1 的回答,总得分相同。其次,由于得分会出现负值,因此那些特别差的回答,会拉低正确回答的得分。

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

((Qage+1) – ((Qage – Qupdated)/2)) ^ 1.5

Qage 和 Qupdated 的单位都是小时。如果一个问题的存在时间越久,或者距离上一次回答的时间越久,Qage 和 Qupdated 的值就相应增大。也就是说,随着时间流逝,这两个值都会越变越大,导致分母增大,因此总得分会越来越小。

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

关于上述的答案是否合理的,是否可以再改良,答案是肯定的,如果是你你会怎样去推荐热门问答呢?

参考地址:http://meta.stackoverflow.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions

 

————————-巨大的分割线——————————–

 

update:2018-05-17

今天对Stackoverflow的算法进行了重新解读,加上了自己的理解和思考。正确的公式应该为:

上面的公式和一开始的公式是等价的,但是下面的更容易理解。针对该公式的理解和思考:

为什么不使用“声望值”?

  • 问题的质量与提问者的声望无正相关系
  • 问题的答案与回答者的声望无正相关系
  • 无名小辈也可以有精彩的问题与答案

提问的目的是获得正确的答案,而不是谁参与了此问题。声望值纳入容易造成,在没有声望认识加入的情况下,问题无法进入热门榜。

浏览量与分值的关系

为什么对浏览量做了一次对数处理?防止浏览量较大的问答占着榜单不动,抑制马太效应。

为什么还要✖4?以10为底的对数,制止作用过大,乘4稍微加大权重的影响。

优化空间?

为什么用2为底?因为喜欢优美….

答案数和投票数与分值关系

为什么要相✖?与回答数量正相关?同时与得分正相关?这点无法理解。

为什么要➗5?降低答案数、投票分的权重,考虑到问题答案的权重较少,猜想是想降低问答数的影响。

是否合理?

  • 技术类问答,非开放性问题,往往答案只有一个,提问者的需求也仅仅需要一个答案
  • Qscore=赞成票-反对票,如果这个问题存在较大的争议,赞成票与反对票接近,是否是一个热门的问题?

优化空间?

  • Qanswered:是否有答案,没有为0,有为1
  • Qupvote:赞成票数量(考虑到Stackoverflow可能没有存赞成票数,用Qscore也可以)

答案投票数与分值关系

是否合理?

  • 问题A:有1个答案,投票数为10
  • 问题B:有4个答案,投票数为4,3,2,1
  • 问题C:有2个答案,投票数为10,-5

优化空间?

只取投票数为正的答案,取每个分值平方和的开方

提问时间与最后解答时间与分值关系

为什么要➕1?防止问题刚提交时,公式中分母为0

为什么要➗2?把2小时作为最小的时间粒度单位

为什么要去1.5次方?添加“重力加速度”,提升曲线的陡度

如何理解影响关系?

  • 发布时间越久,分值越低
  • 回答时间越久,分值越低
打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

优秀的产品经理/糟糕的产品经理

每个产品经理都希望自己时优秀的,而不是糟糕的。但如何定义是否优秀却没有一个统一的标准。最近看到了一片文章,中间
1 sec read

Paul Graham 的创业建议

描述创业的13句话 选择好合伙人 快速发布 让你的创意进化 (大多数创意来自实现过程) 理解你的用户 (许多成
19 sec read

享受性质量 HQ

为了支持非任务相关方面的用户体验研究,Hassenzahl等(2002)开发了一份评估享受性质量(Hedoni
3 sec read

One Reply to “StackOverflow问答排名算法”

发表评论

电子邮件地址不会被公开。 必填项已用*标注