Hacker News 排名算法工作原理

简介: 这篇文章我要向大家介绍Hacker News网站的文章排名算法工作原理,以及如何在自己的应用里使用这种算法。这个算法非常的简单,但却在突出热门文章和遴选新文章上表现的异常优秀。

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

image.png


深入 news.arc 程序代码

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

; Votes divided by the age in hours to the gravityth power.

   ; Would be interesting to scale gravity in a slider.

   (= gravity* 1.8 timebase* 120 front-threshold* 1

      nourl-factor* .4 lightweight-factor* .3 )

   (def frontpage-rank (s (o scorefn realscore) (o gravity gravity*))

     (* (/ (let base (- (scorefn s) 1)

             (if (> base 0) (expt base .8) base))

           (expt (/ (+ (item-age s) timebase*) 60) gravity))

        (if (no (in s!type 'story'poll))  1

            (blank s!url)                  nourl-factor*

            (lightweight s)                (min lightweight-factor*

                                                (contro-factor s))

                                              (contro-factor s))))

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

Score = (P-1) / (T+2)^G

其中,

  • P = 文章获得的票数( -1 是去掉文章提交人的票)
  • T = 从文章提交至今的时间(小时)
  • G = 比重,news.arc里缺省值是1.8

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


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

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

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

为了能视觉呈现这个算法,我们可以把它绘制到Wolfram Alpha


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

image.png

你可以看到,随着时间的流逝,得分骤然下降,例如,24小时前的文章的分数变的非常低——不管它获得了如何多的票数。

Plot语句:

   plot(

       (30 - 1) / (t + 2)^1.8,

       (60 - 1) / (t + 2)^1.8,

       (200 - 1) / (t + 2)^1.8

   ) where t=0..24


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

image.png

图中你可以看到,比重越大,得分下降的越快。

Plot语句:

   plot(

       (p - 1) / (t + 2)^1.8,

       (p - 1) / (t + 2)^0.5,

       (p - 1) / (t + 2)^2.0

   ) where t=0..24, p=10


Python语言实现

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

def calculate_score(votes, item_hour_age, gravity=1.8):

   return (votes - 1) / pow((item_hour_age+2), gravity)

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

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

(= gravity* 1.8 timebase* 120 front-threshold* 1

nourl-factor* .4 lightweight-factor* .17 gag-factor* .1)

(def frontpage-rank (s (o scorefn realscore) (o gravity gravity*))

(* (/ (let base (- (scorefn s) 1)

       (if (> base 0) (expt base .8) base))

     (expt (/ (+ (item-age s) timebase*) 60) gravity))

  (if (no (in s!type 'story'poll))  .8

      (blank s!url)                  nourl-factor*

      (mem'bury s!keys)             .001

                                     (* (contro-factor s)

                                        (if (mem'gag s!keys)

                                             gag-factor*

                                            (lightweight s)

                                             lightweight-factor*

                                            1)))))

相关文章
|
3月前
|
数据采集 机器学习/深度学习 算法
|
28天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
1月前
|
机器学习/深度学习 算法 机器人
多代理强化学习综述:原理、算法与挑战
多代理强化学习是强化学习的一个子领域,专注于研究在共享环境中共存的多个学习代理的行为。每个代理都受其个体奖励驱动,采取行动以推进自身利益;在某些环境中,这些利益可能与其他代理的利益相冲突,从而产生复杂的群体动态。
171 5
|
8天前
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解
|
17天前
|
负载均衡 算法 应用服务中间件
5大负载均衡算法及原理,图解易懂!
本文详细介绍负载均衡的5大核心算法:轮询、加权轮询、随机、最少连接和源地址散列,帮助你深入理解分布式架构中的关键技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5大负载均衡算法及原理,图解易懂!
|
23天前
|
算法 数据库 索引
HyperLogLog算法的原理是什么
【10月更文挑战第19天】HyperLogLog算法的原理是什么
39 1
|
29天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
68 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
1月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
49 9
|
1月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
28天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。