技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 数学之美:StackOverflow问答排名算法

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

浏览:9780次  出处信息

    先前的文章介绍了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. 用skip list实现实时排名?    (阅读:5278)
  2. Hacker News 排名算法工作原理    (阅读:5179)
  3. 数学之美:Reddit评论排名算法    (阅读:4533)
  4. IMDB评分排名算法    (阅读:4073)
  5. 数学之美:Hacker News的热门排名算法    (阅读:3981)
  6. 实时排名,其实很简单    (阅读:3330)
  7. Reddit排名算法工作原理    (阅读:2044)
  8. 浅谈 WHR 全历史排名    (阅读:1407)
  9. 教你如何查询当前主流数据库及其排名?    (阅读:1370)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1