IT技术博客大学习 共学习 共进步

数学之美:StackOverflow问答排名算法

标点符 2012-07-12 22:48:27 累计浏览 11,342 次
本机暂存

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

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

    原图已失效

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

    1、问题的投票人数,StackOverflow允许用户投反对票,所以这里可以使用绝对投票数,即正面票-负面票数量。绝对数越高问题越热门。

    2、问题浏览量,或是有效浏览量,有效浏览量可以建立一个停留时间的阀值去衡量。浏览的越多则越热门。

    3、问题的答案数,理论上说答案越多则问题的越热门,但这也并不绝对,有些好的问答可能只有一个好的答案。

    4、问题答案的认可数,即是否存在一个被大量认可的答案。这里存在两种情况,被提问者认可或被其他访问者投票。多少的投票量可以认为是问题答案被认可也是需要考虑的问题。

    5、问题的提问时间和问题的最后答复时间,问题的受欢迎程度应该是随时间变长而变得不热门。

    5、提问者的声望和回答问题的声望,声望越高的问题肯定质量越到,越值得去推荐。

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

    原图已失效

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

import time, math
def hot (Qviews, Qanswers, Qscore, Ascore, date_ask, date_active):
    Qage = round((time.time() - date_ask) / 3600)
    Qupdated = round((time.time() - date_active) / 3600)
    return (math.log10(Qviews) * 4 + Qanswers * Qscore / 5 + Ascore )/(pow((Qage + 1) - (Qage - Qupdated) / 2,1.5))

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

    log(Qviews)*4

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

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

    -(Qanswers * Qscore)/5

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

    3、Ascores(回答得分)

    -sum(Ascores)

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

    4、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

建议继续学习

  1. Hacker News 排名算法工作原理 (累计阅读 7,401)
  2. 数学之美:Reddit评论排名算法 (累计阅读 5,940)
  3. 基于用户行为分析的搜索引擎自动性能评价 (累计阅读 5,681)
  4. Mysql中的排序优化 (累计阅读 5,601)
  5. 皮尔逊积矩相关系数的学习 (累计阅读 5,521)
  6. 实时排名,其实很简单 (累计阅读 4,420)
  7. 一维数组的聚类 (累计阅读 3,580)
  8. 如何准确看清用户需求? (累计阅读 3,500)
  9. 网站分析常用英语名词速览 (累计阅读 3,300)
  10. Reddit排名算法工作原理 (累计阅读 3,300)