Hacker News 排名算法工作原理-阿里云开发者社区

开发者社区> -开发者助手-> 正文

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)))))

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8821 0
oracle中 connect by prior 递归算法
 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select .
675 0
定位排查工作流的计算结果数据量不符合预期的方法
本文用两个简化过的实际例子,说明如何排查数据经过同步和计算后发现数据条数对不上的情况。
9219 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10639 0
Gauss-Newton算法学习
Gauss-Newton算法是解决非线性最优问题的常见算法之一,最近研读开源项目代码,又碰到了,索性深入看下。本次讲解内容如下: 基本数学名词识记 牛顿法推导、算法步骤、计算实例 高斯牛顿法推导(如何从牛顿法派生)、算法步骤、编程实例 高斯牛顿法优劣总结 一、基本概念定义 1.非线性方程定义及最优化方法简述    指因变量与自变量之间的关系不是线性的关系,比如平方关系、对数关系、指数关系、三角函数关系等等。
1512 0
《机器学习实战》k最近邻算法(K-Nearest Neighbor,Python实现)
============================================================================================ 《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记,包含对其中算法的理解和算法的Pyt...
1582 0
人工智能: 自动寻路算法实现(二、深度优先搜索)
前言 本篇文章是机器人自动寻路算法实现的第二章。我们要讨论的是一个在一个M×N的格子的房间中,有若干格子里有灰尘,有若干格子里有障碍物,而我们的扫地机器人则是要在不经过障碍物格子的前提下清理掉房间内的灰尘。
1499 0
2450
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载