Hacker News排名机制详解:评分、争议与惩罚(2013年)
摘要
本文详细分析了Hacker News的排名算法,解释了评分公式、争议故事的惩罚机制,以及重新排名和缓存如何影响首页可见性。
暂无内容
查看缓存全文
缓存时间: 2026/09/20 00:28
# Hacker News排名机制详解:评分、争议性与惩罚
来源:https://www.righto.com/2013/11/how-hacker-news-ranking-really-works.html
Hacker News的排名基本公式早已为人所知(https://www.righto.com/2009/06/how-does-newsyc-ranking-work.html),但仍存在疑问:公开的代码是否就是真实算法?排名是否完全基于投票,还是有不可见因素介入?关于NSA的文章会被压低排名吗?为什么那篇热门文章在你评论后突然从首页消失?
通过连续多天分析Hacker News前60名文章,我可以回答这些问题。公开的公式基本准确,但排名调整远比你想象的复杂——20%的首页文章以各种方式受到了惩罚。标题中含“NSA”的文章会被扣分并迅速下榜。“争议性”文章在评论数超过40条后会被严重降权。本文将详细解析评分与惩罚机制。
[注:HN现已不再惩罚NSA相关文章(详情见https://news.ycombinator.com/item?id=9097596)]
文章评分基于其得票数、提交时间以及各类惩罚因子,使用以下公式:
score=\frac{ \left( votes-1 \right) ^{.8}}{ \left( age _{hours} + 2 \right) ^ {1.8}} * penalties
由于时间指数的权重高于票数,文章得分终将归零,因此没有内容能长期占据首页。这个指数被称为*重力系数*。
你可能认为每次访问Hacker News时,所有文章都会按此公式重新计算并排序。但出于效率考虑,只有特定文章会触发重新排名。当某篇文章获得投票时,系统会将其重新排序至合适位置,其他文章保持不变,从而大幅减少排序运算量。不过,若文章停止获得投票,可能长期滞留在高位。为避免这种情况,系统每30秒会随机选取前50名中的某篇文章进行重新排序。这意味着未获得投票的文章可能被“错误”排名数分钟。此外,页面内容可能缓存90秒。
## 平均每日原始得分与第一名文章
下图展示了11月11日全天HN前60篇文章的原始得分(不含惩罚)。每条线代表一篇文章,颜色对应其页面位置。红线表示HN第一名文章。注意由于惩罚机制,原始得分最高的文章往往并非实际排名第一。
Hacker News全天文章原始得分变化。红线代表排名第一的文章。由于惩罚机制,第一名文章并非总是得分最高。(http://static.righto.com/images/Ken_Shirriffs_blog/hn_topscores-s1433.png)
此图揭示了几个有趣现象:文章得分会急速攀升,随后在数小时内缓慢下降。评分公式解释了大部分原因:以恒定速率获得投票的文章会快速达到峰值并逐渐下降。但观察到的峰值下降更快——这是因为文章通常在最初1-2小时内获得大量投票,随后投票率降低。两因素叠加形成了图中陡峭的曲线。
每天都有少数文章得分远高于其他文章,同时存在大量中游文章。部分文章因运气不佳被更热门文章压制,只能短暂触及第一名位置。
通过对比原始得分最高文章(图表顶部)与实际排名第一文章(红线),可以识别出惩罚生效的时刻。例如文章Getting website registration completely wrong在清晨一度登顶,但因争议性惩罚迅速下滑,使Linux ate my RAM短暂获得第一,随后被Simpsons in CSS超越。稍后Apple Maps刚登顶就触发争议性惩罚,导致排名暴跌。Snapchat文章虽曾登顶,但在上午8:22被施以重罚直接跌出榜单。Why you should never使用MongoDB极受欢迎,本应长期占据第一,却因快速降权徘徊在第七位左右。Severing ties with the NSA起始就因NSA惩罚处于劣势,但仍凭借超高人气登顶,随后又遭受更大惩罚被压低排名。临近午夜时,$4.1m goes missing也受到惩罚——实际上即使没有惩罚,它很快也会被FTL超越。
绿色三角形和文字标注了“争议性”惩罚生效点,蓝色标注了文章被完全降权跌出前60名的位置。更轻度的惩罚未在此图示。
显然HN第一名位置并非“自然形成”,而是持续惩罚多篇文章的结果。**尚不清楚这些惩罚是来自HN管理员还是用户举报。**
## 自动惩罚的提交内容
部分文章会因标题或域名自动受罚。任何标题含*NSA*的文章似乎会自动获得0.4的惩罚系数。我测试了如*awesome*、*bitcoin*、*bubble*等词汇,未发现自动惩罚。观察到多个网站似乎自动获得0.25至0.8的惩罚:arstechnica.com、businessinsider.com、easypost.com、github.com、imgur.com、medium.com、quora.com、qz.com、reddit.com、rt.com、stackexchange.com、theguardian.com、theregister.com、theverge.com、torrentfreak.com、youtube.com。实际列表应更长。(这与曾被“禁止”的站点列表不同。)
eterm提出的一个有趣理论认为,热门来源的新闻常被多人同时提交,导致投票数超过文章“应得”水平。对热门网站自动施罚可抵消这种效应。
## 惩罚的影响
通过评分公式可计算惩罚影响。若文章获得0.4的惩罚系数,相当于每票仅计0.3票,或文章排名下降速度比正常快66%。惩罚系数0.1对应每票仅计0.05票,或排名下降速率达正常3.6倍。因此0.4系数已具显著影响,0.1系数则极为严苛。
**争议性惩罚**
为防止Hacker News出现骂战,评论过多的文章会被作为“争议性”内容重罚。公开代码显示`contro-factor`函数会对评论数超过20且评论数高于投票数的文章生效,按(votes/comments)²缩放。但实际公式存在差异——当评论数超过投票数且至少40条评论时触发。基于实测数据,我推测指数为3而非2,但尚未证实。争议性惩罚可能导致文章排名骤变,例如一篇文章可能前一分钟高居前列,当评论达到40条时突然消失。若你曾疑惑热门文章为何突然消失,争议性很可能是主因。例如Why the Chromebook pundits are out of touch with reality在达到40条评论时从第5位跌至第22位,而Show HN: Get your health records from any doctor'原排名第17,达到40条评论时直接跌出前60名。
## 研究方法
我每分钟爬取`/news`和`/news2`页面(遵守每分钟2页的指南)。使用Beautiful Soup解析(稍显杂乱的)HTML,通过大量Python脚本处理数据,再用强大但晦涩的matplotlib绘制图表。分析核心思路是根据公式生成原始分数并寻找异常。例如在11月9日8:46时,可计算前10名文章的原始分数:
``
2.802 Pyret: A new programming language from the creators of Racket
1.407 The Big Data Brain Drain: Why Science is in Trouble
1.649 The NY Times endorsed a secretive trade agreement that the public can't read
0.785 S.F. programmers build alternative to HealthCare.gov (warning: autoplay video)
0.844 Marelle: logic programming for devops
0.738 Sprite Lamp
0.714 Why Teenagers Are Fleeing Facebook
0.659 NodeKnockout is in Full Tilt. Checkout some demos
0.805 ISO 1
0.483 Shopify accepts Bitcoin.
0.452 Show HN: Understand closures
``
注意前10名中有三篇文章排名低于分数预期:*The NY Times*、*Marelle*和*ISO 1*。由于*The NY Times*排名介于得分1.407与0.785的文章之间,其惩罚系数可推算为0.47至0.85之间。同理其他两篇文章惩罚系数应在0.87-0.93和0.60-0.82范围。我观察到大多数文章按分数排名,而例外文章始终排名显著偏低,表明存在惩罚。这验证了使用中的评分公式与公开代码一致。若公式不同(例如重力指数更大),我预期文章排名会随投票数或时间增长偏离“预期”位置,但从未出现这种情况。
该技术可证实惩罚存在并估算范围,但确定精确惩罚值较困难。虽然可观察随时间变化的范围以期收敛为单值,但多种误差因素造成干扰:1) 邻近文章可能也受惩罚或评分方式不同(如招聘信息);2) 文章并非持续重排,可能临时错位;3) 惩罚系数可能随时间变化;4) 公开投票数与真实票数可能存在差异(因“不良”投票被抑制)。因此我只能确定近似惩罚值,存在相当程度的数值不稳定性。
## 全天惩罚情况
下图展示了一天内的惩罚系数变化。每条线代表特定文章,起始值应为1(无惩罚),施加惩罚后下降至相应值。线条结束于文章跌出前60名,这常发生在惩罚后不久。可见存在0.2和0.4的惩罚,大量文章惩罚系数集中在0.8-0.9区间。大量惩罚似乎发生在上午9点(管理员上线?),全天持续进行。我正在试验不同算法以改善此嘈杂图表。[](http://static.righto.com/images/Ken_Shirriffs_blog/hn_penalties.png) 平均约20%的首页文章受罚,而第二页受罚文章达38%。(首页比例较低,因按定义受罚文章更难上榜。)实际惩罚范围远超预期。
以下是11月11日受惩罚的首页文章列表(排除因惩罚本应上榜但未上榜的文章),长度超出预期,请滚动查看完整列表:
Why the Climate Corporation Sold Itself to Monsanto (http://news.ycombinator.com/item?id=6710023), Facebook Publications (http://news.ycombinator.com/item?id=6707776), Bill Gates: What I Learned in the Fight Against Polio (http://news.ycombinator.com/item?id=6707666), McCain says NSA chief Keith Alexander 'should resign or be fired' (http://news.ycombinator.com/item?id=6709468), You are not a software engineer (http://news.ycombinator.com/item?id=6708647), What is a y-combinator? (http://news.ycombinator.com/item?id=6710450), Typhoon Haiyan kills 10,000 in Philippines (http://news.ycombinator.com/item?id=6706011), To Persuade People, Tell Them a Story (http://news.ycombinator.com/item?id=6707812), Tetris and The Power Of CSS (http://news.ycombinator.com/item?id=6709466), Microsoft Research Publications (http://news.ycombinator.com/item?id=6709901), Moscow subway sells free tickets for 30 sit-ups (http://news.ycombinator.com/item?id=6708758), The secret world of cargo ships (http://news.ycombinator.com/item?id=6710031), These weeks in Rust (http://news.ycombinator.com/item?id=6708537), Empty-Stomach Intelligence (http://news.ycombinator.com/item?id=6709791), Getting website registration completely wrong (http://news.ycombinator.com/item?id=6710916), The Six Most Common Species Of Code (http://news.ycombinator.com/item?id=6711192), Amazon to Begin Sunday Deliveries, With Post Office's Help (http://news.ycombinator.com/item?id=6710232), Linux ate my RAM (http://news.ycombinator.com/item?id=6711069), Simpsons in CSS (http://news.ycombinator.com/item?id=6710863), Apple maps: how Google lost when everyone thought it had won (http://news.ycombinator.com/item?id=6711551), Docker and Go: why did we decide to write Docker in Go? (http://news.ycombinator.com/item?id=6709517), Amazon Code Ninjas (http://news.ycombinator.com/item?id=6710481), Last Doolittle Raiders make final toast (http://news.ycombinator.com/item?id=6711708), Linux Voice - A new Linux magazine that gives back (http://news.ycombinator.com/item?id=6711908), Want to download anime? Just made a program for that (http://news.ycombinator.com/item?id=6712223), Commit 15 minutes to explain to a stranger why you love your job. (http://news.ycombinator.com/item?id=6710854), Why You Should Never Use MongoDB (http://news.ycombinator.com/item?id=6712703), Show HN: SketchDeck - build slides faster (http://news.ycombinator.com/item?id=6712899), Zero to Peanut Butter Docker Time in 78 Seconds (http://news.ycombinator.com/item?id=6712961), NSA's Surveillance Powers Extend Far Beyond Counterterrorism (http://news.ycombinator.com/item?id=6713409), How Sentry's Open Source Service Was Born (http://news.ycombinator.com/item?id=6713324), Real World OCaml (http://news.ycombinator.com/item?id=6711348), Show HN: Get your health records from any doctor (http://news.ycombinator.com/item?id=6713065), Why the Chromebook pundits are out of touch with reality (http://news.ycombinator.com/item?id=6713211), Towards a More Modular Future for JavaScript Libraries (http://news.ycombinator.com/item?id=6711362), Why is virt-builder written in OCaml? (http://news.ycombinator.com/item?id=6711893), IOS: End of an Era (http://news.ycombinator.com/item?id=6713612), The craziest things you can plug into your iPhone's audio jack (http://news.ycombinator.com/item?
相似文章
Hacker News 首页网站
一个显示当前 Hacker News 首页的网站,包含故事和评论的链接。
Show HN: HN名人堂 – 浏览3100个传奇Hacker News链接
一个网络工具,精选了3100多个历史上热门的Hacker News链接,根据提交频率和突破性事件的名人堂入选系统进行分类。
Hacker News 降低 AI 内容的优先级
Hacker News 正在其平台上降低 AI 内容的优先级,以解决对此类内容的担忧。
Show HN: Hacker News 上有多少 AI 内容?
一个实时仪表板,用于计数和显示 Hacker News 上的 AI 相关标题,每次出现新的 AI 标题时都会重置计时器。
Ask HN:你如今如何跟上 HN 的动态?
一篇 Hacker News 帖子及评论讨论了在AI相关内容增多和信息过载的情况下,如何跟上平台的策略。