Hacker News排名算法工做原理

这篇文章我要向你们介绍Hacker News网站的文章排名算法工做原理,以及如何在本身的应用里使用这种算法。这个算法很是的简单,但却在突出热门文章和遴选新文章上表现的异常优秀。算法

深刻news.arc 程序代码编程

Hacker News是用Arc语言开发的,这是一种Lisp方言,由Y Combinator投资公司创始人Paul Graham创造。Hacker News的开源的,你能够在arclanguage.org找到它的源代码。深刻发掘 news.arc 程序,你会找到这段排名算法代码,就是下面这段:ide

 
  1. ; Votes divided by the age in hours to the gravityth power.  
  2. ; Would be interesting to scale gravity in a slider.  
  3.  
  4. (= gravity* 1.8 timebase* 120 front-threshold* 1   
  5.    nourl-factor* .4 lightweight-factor* .3 )  
  6.  
  7. (def frontpage-rank (s (o scorefn realscore) (o gravity gravity*))  
  8.   (* (/ (let base (- (scorefn s) 1)  
  9.           (if (> base 0) (expt base .8) base))  
  10.         (expt (/ (+ (item-age s) timebase*) 60) gravity))  
  11.      (if (no (in s!type 'story 'poll))  1 
  12.          (blank s!url)                  nourl-factor*  
  13.          (lightweight s)                (min lightweight-factor*   
  14.                                              (contro-factor s))  
  15.                                         (contro-factor s)))) 

本质上,这段 Hacker News采用的排名算法的工做原理看起来大概是这个样子:post

 
  1. Score = (P-1) / (T+2)^G  
  2.  
  3. 其中,  
  4. P = 文章得到的票数( -1 是去掉文章提交人的票)  
  5. T = 从文章提交至今的时间(小时)  
  6. G = 比重,news.arc里缺省值是1.8 

正如你看到的,这个算法很容易实现。在下面的内容里,咱们将会看到这个算法是如何工做的。网站

比重(G)和时间(T)对排名的影响url

比重和时间在文章的排名得分上有重大的影响。正常状况下以下面所述:spa

  • 当T增长时文章得分会降低,这就是说越老的文章分数会越底。
  • 当比重加大时,老的文章的得分会减的更快

为了能视觉呈现这个算法,咱们能够把它绘制到Wolfram Alpha.net

得分随着时间是如何变化的rest

你能够看到,随着时间的流逝,得分骤然降低,例如,24小时前的文章的分数变的很是低——无论它得到了如何多的票数。blog

Plot语句:

 
  1. plot(  
  2.     (30 - 1) / (t + 2)^1.8,   
  3.     (60 - 1) / (t + 2)^1.8,  
  4.     (200 - 1) / (t + 2)^1.8 
  5. ) where t=0..24 

比重参数是如何影响排名的

图中你能够看到,比重越大,得分降低的越快。

Plot语句:

 
  1. plot(  
  2.     (p - 1) / (t + 2)^1.8,   
  3.     (p - 1) / (t + 2)^0.5,  
  4.     (p - 1) / (t + 2)^2.0 
  5. ) where t=0..24, p=10 

Python语言实现

以前已经说了,这个评分算法很容易实现:

 
  1. def calculate_score(votes, item_hour_age, gravity=1.8):  
  2.     return (votes - 1) / pow((item_hour_age+2), gravity) 

关键是要理解算法中的各个因素对评分的影响,这样你能够在你的应用中进行定制。我但愿这篇文章已经向你说明了这些。

祝编程快乐!

编辑:

Paul Graham 分享了修正后的HN 排名算法

 
  1. (= gravity* 1.8 timebase* 120 front-threshold* 1 
  2.    nourl-factor* .4 lightweight-factor* .17 gag-factor* .1)  
  3.  
  4. (def frontpage-rank (s (o scorefn realscore) (o gravity gravity*))  
  5.   (* (/ (let base (- (scorefn s) 1)  
  6.           (if (> base 0) (expt base .8) base))  
  7.         (expt (/ (+ (item-age s) timebase*) 60) gravity))  
  8.      (if (no (in s!type 'story 'poll))  .8 
  9.          (blank s!url)                  nourl-factor*  
  10.          (mem 'bury s!keys)             .001 
  11.                                         (* (contro-factor s)  
  12.                                            (if (mem 'gag s!keys)  
  13.                                                 gag-factor*  
  14.                                                (lightweight s)  
  15.                                                 lightweight-factor*  
  16.                                                1))))) 

英文原文:How Hacker News ranking algorithm works

译文连接:http://www.aqee.net/how-hacker-news-ranking-algorithm-works/