Hacker News排名演算法是怎樣工作的:得分、爭議和罰分

programmer_lin發表於2013-12-03

譯者注:根據維基百科相關詞條,Hacker News是一家關於計算機黑客和創業公司的社會化新聞網站,與其它社會化新聞網站不同的是, Hacker News 沒有踩或反對一條提交新聞的選項;只可以贊成或是完全不投票。簡而言之,Hacker News 允許提交任何可以被理解為“任何滿足人們求知慾”的新聞。

更新(11/18):關於罰分機制的文章被罰分了

十分諷刺的是,這篇文章在Hacker News上被罰分了。這篇文章被放到首頁後的幾分鐘,就被罰了0.2分,直接導致這篇文章從網站首頁消失。下圖中的黑色線,描繪了這篇文章在所有Hacker News文章中的排名情況。你可以看到,在被罰分之後,它的排名明顯下跌。灰色線顯示的是如果不被罰分,這篇文章可能的排名情況。如果沒有被罰分,這名文章可以排進前五,但是被罰分之後,這篇文章甚至沒能回到首頁(排進前30)。下方的綠色線描繪了這篇文章的初步評分。(11/26:我被告知,這個罰分是由於“投票探測”程式被錯誤出發引起的)。

Hacker News排名的基本公式已經公開好幾年了,但是人們依然對此有所疑惑。公開的程式碼是不是實現了真正的演算法?排名僅僅與投票有關,還是也受到一些不可見因素的影響?在排名中,關於美國國家安全域性的新聞是不是會被降低排名?為什麼你評論了首頁的文章之後,那篇熱門文章就忽然從首頁消失?

根據幾天來對HN上排名前60的新聞的仔細分析,我可以回答這些問題。公開的計算公式基本上是精確的。對於排名的調整工作比你想象的還要多,首頁上20%的文章會被以各種方式罰分。所有標題中含有“美國國家安全域性”的新聞都會被罰分並且排名迅速下跌。一則“有爭議”的新聞在被評論了40次之後,被嚴厲地罰分。這篇文章詳細解釋了得分和罰分的機制。

 

排名機制是怎樣工作的

文章的得分是基於他們提交以來,獲得的贊成投票數,同時通過下列公示計算出得分。

由於在這個公式中時間的指數比投票的指數更大,因此,一篇文章的得分最終會降到0分。所以,沒有一篇文章會長期在首頁出現。這個指數稱為重力因子。

你可能認為每當你瀏覽HackerNews網站的時候,每則新聞都通過上面的公式計算了得分,並且排序來決定它們在網頁上的最終順序。但是為了高效,新聞只是偶爾被重新排序。當有新聞被使用者贊成時,它被重新排序,在列表中上移或下移調整到適當的排序位置,並不改變其他新聞的得分和相對順序。這樣,重新排序的工作就被大大減少了。但是,有可能一則新聞不再獲得投票並且最終停留在一個較高位置。為了避免這種情況的出現,每隔30秒,隨機選出前50則新聞中的一則進行重新排序。結果是,一則新聞如果一直沒有獲得投票,那麼這則新聞可能在很長時間裡被“錯誤”排序。同時,網頁可以被快取90秒。

 

原始得分和11月11日的頭條新聞

下圖展示了在11.11日當天HN網站上排名前六十的文章的原始得分(不考慮罰分)。每一條線對應一篇文章,不同顏色代表了文章在網頁中的位置。比如,紅色表示在HN中的頭條新聞文章。值得注意的是,由於罰分,獲得最高原始得分的文章往往不是網頁上的頭條新聞。

這幅圖中有一些有意思的現象。一篇文章的得分會很快增長並且在未來的幾小時中緩慢降低。這一現象的主要原因是計算得分的公式:一篇文章得到連續的贊成投票後,得分會迅速到達峰值,然後得分逐步減小。但是,觀察到的峰值增長更快——因為一篇文章在釋出的一兩個小時內會獲得很多的贊成投票,然後投票的速度會減慢。由於這兩個原因,出現了上圖所示的陡峭曲線。

有一小部分文章每天的得分遠遠高於其他文章,同時,很多文章的得分處在所有文章的在中等水平。一些文章的得分很高,但是不幸的是,它們比一些更加受歡迎的文章得分稍低。當目前得分第一的文章得分逐漸降低,而後來的文章得分正在上升的空隙時間內,其他文章很容易獲得暫時的第一名位置。

仔細觀察原始得分最高的文章(上圖所示)和紅線所示的排名最好文章的差別,你會發現罰分規則的應用。早上,《Getting website registration completely wrong》一文獲得了第一名,但是由於爭議它被罰分並且排名迅速下降到了首頁底部。因此,《Linux ate my RAM》就在《Simpsons in CSS》獲得第一之前,輕鬆佔領了第一的位置。過了一會兒,在《Apple Maps》達到了第一之後,也被罰分,導致它失去了第一的位置並且在排名上迅速下滑。《Snapchat》也排到過第一名的位置,但是,在上午8:22分,這篇文章被罰分,然後排名迅速下跌,完全消失在圖中。《Why you should never use MongoDB》一文非常受歡迎,並且在11月11日這一天的大部分時間裡,名列第一,除了它被罰分後下滑到左右第七的位置。《Severing ties with the NSA》一文在一開始就由於標題中的美國國家安全域性被罰分,但是因為它非常受歡迎,因此在罰分之後依然獲得了第一名的位置。但是,它很快被強加了更嚴厲的罰分,迫使這篇文章下滑至首頁的底部。最後,在這一天即將結束的時候《$4.1m goes missing》一文被罰分。事實表明,即使沒有被罰分,它第一的位置也會被《FTL》一文取代。

圖中綠色的三角形和文字說明了爭議罰分的應用。藍色的三角形和文字表示文章由於罰分而被遺忘,跌出了前60的排名。這裡沒有展示較為溫和的罰分。

顯然,HN網站上第一名的內容並不是“自然”形成的,而是持續對很多文章應用罰分機制造成的。目前不清楚的是,這些罰分是由於HN管理員還是來自已標記文章。

 

獲得自動罰分的提交

一些文章,由於標題會在提交時被自動罰分,還有一些文章由於涉及的領域也會被自動罰分。比如:任何在標題中含有NSA美國國家安全域性的文章會被自動罰0.4分。我試圖找了一些會被自動罰分的關鍵詞,比如:可怕的,比特幣和泡沫,但是它們沒有被罰分。

我注意到,很多網站引用的文章會被自動罰分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.我確定,實際的名單比這個更長。(這是“禁用”網站的一部分)
一項有趣的理論是:從流行網站上獲得的新聞會被許多人並行提交,因此會比其他文章獲得更多的贊成投票。對於來自於流行網站的新聞自動罰分,有助於抵消這樣的作用。

 

罰分的影響

採用得分計算公式,可以計算罰分的影響。如果一篇文章被罰了0.4分,那麼這篇文章獲得的每一個贊成投票,被算成0.3票。或者,這篇文章會以比正常下降速度快66%的速度在排名中下滑。0.1分的罰分,相當於每一個贊成投票,被算為0.05票,或者是,文章以3.6倍下滑速度在排名中下降。因此,0.4分的罰分影響很大,而0.1分的罰分可以認為是相當嚴厲的。

 

爭議

為了防止在HN上發生網路論戰,當文章有“過多”評論是會由於“爭議”被狠狠罰分。在公開的程式碼中,控制因子被設定在一篇文章多餘20條評論,以及評論多餘贊成投票。滿足這兩個條件的文章,會被以(贊成/評論)^2的比例計算得分。但是,實際應用的公式並不如此——文章獲得的評論多於贊成投票,同時評論數多餘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中的網頁。我用BeautifulSoup工具解析(有時醜陋的)HTML,並且通過大量的Python指令碼語言處理結果,並且利用難以理解但是功能強大的matplotlib將結果繪製為圖。

分析的基本思想是:利用公式生成初始得分,然後尋找異常情況。在某一個時間點上(比如:11/09 8:46),我們可以計算出排名前十的新聞對應的初始得分:

  • 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

我們注意到,其中有三則新聞的排名低於他們得分的排名:The NY Times,MarelleandISO 1.因為NY Times的排名在1.407到0.785之間,因此它的罰分在0.47到0.85之間。同樣的,其他兩者的罰分分別在0.87到0.93,0.60到0.82之間。

我注意到,大部分的新聞是根據它們的得分排序的,同時,異常的表現都是比排名預期要低,暗示著新聞被罰分。這說明實際使用的算分公式與公開的程式碼基本相符。如果兩個公式不同,比如重力因子的指數較大,那麼我會發現隨著他們投票數目的增加或是時間的推移,他們會從“預期”的排名中消失,但是我沒有見到這種情況。

這樣的方法可以證明罰分機制的存在,並且給出罰分的範圍。但是確定精準的罰分是很困難的。你可以預定一個時間範圍,並且希望罰分值會收斂到一個明確的數值上。但是,不同的錯誤來源使得罰分很混亂。首先,相鄰的新聞可能也被罰分,或者採用不同方式算分(比如:招聘啟事)。其次,因為文章不是隨時被重新排序的,一篇文章的位置只是暫時的。第三,隨著時間的變化,對一篇文章的罰分可能有變化。第四,得到的投票數目可能並不是真正意義上的投票數,因為沒有“不贊成”投票。結果是,我試圖確定罰分的估計值,但是數值極不穩定。

 

一整天的罰分分佈

下圖展示了一天中統計的罰分值。每一條線,代表一篇特定的文章。每一條線的初始值為1(沒有罰分),當文章被罰分時,線條隨之下降。當文章不在前60的時候,這條線就不存在了。罰分可能是0.2和0.4分,也有很多在0.8到0.9的範圍內。看起來,一整天中,早上9點的罰分比較多。由於圖中的噪聲太多,我試驗了不同的演算法來改善這幅圖。

平均有20%的首頁文章,38%的第二頁文章被罰分。(由於某種定義,首頁被罰分的文章出現在首頁的概率較小,因此首頁的罰分比例較低)相比於你的估計,可能有更多的文章被罰分。

下面列舉了11/11頁中被罰分的文章(不包含如果不被罰分,會出現在該頁的文章)。這個列表比預期要長得多。
Why the Climate Corporation Sold Itself to Monsanto,Facebook Publications,Bill Gates: What I Learned in the Fight Against Polio,McCain says NSA chief Keith Alexander ‘should resign or be fired’,You are not a software engineer,What is a y-combinator,Typhoon Haiyan kills 10,000 in Philippines,To Persuade People, Tell Them a Story,Tetris and The Power Of CSS,Microsoft Research Publications,Moscow subway sells free tickets for 30 sit-ups,The secret world of cargo ships,These weeks in Rust,Empty-Stomach Intelligence,Getting website registration completely wrong,The Six Most Common Species Of Code,Amazon to Begin Sunday Deliveries, With Post Office’s Help,Linux ate my RAM,Simpsons in CSS,Apple maps: how Google lost when everyone thought it had won,Docker and Go: why did we decide to write Docker in Go,Amazon Code Ninjas,Last Doolittle Raiders make final toast,Linux Voice – A new Linux magazine that gives back,Want to download anime Just made a program for that,Commit 15 minutes to explain to a stranger why you love your job.,Why You Should Never Use MongoDB,Show HN: SketchDeck – build slides faster,Zero to Peanut Butter Docker Time in 78 Seconds,NSA’s Surveillance Powers Extend Far Beyond Counterterrorism,How Sentry’s Open Source Service Was Born,Real World OCaml,Show HN: Get your health records from any doctor,Why the Chromebook pundits are out of touch with reality,Towards a More Modular Future for JavaScript Libraries,Why is virt-builder written inOCaml,IOS: End of an Era,The craziest things you can plug into your iPhone’s audio jack,RFC: Replace Java with Go in default languages,Show HN: Find your health plan on Health Sherpa,Web Latency Benchmark: A new kind of browser benchmark,Why are Amazon, Facebook and Yahoo copying Microsoft’s stack ranking system,Severing Ties with the NSA,Doctor performs surgery using Google Glass,Duplicity + S3: Easy, cheap, encrypted, automated full-disk backups,Bitcoin’s UK future looks bleak,Amazon Redshift’s New Features,You’re only getting the nice feedback,Software is Easy, Hardware is of Medium Difficulty,Facebook Warns Users After Adobe Breach,International Space Station Infected With USB Stick Malware,Tidbit: Client-Side Bitcoin Mining,Go: “I have already used the name for *MY* programming language”,Multi-Modal Drone: Fly, Swim & Drive,The Daily Go Programming Newspaper,“We have no food, we need water and other things to survive.”,Introducing the Humble Store,The Six Most Common Species Of Code,$4.1m goes missing as Chinese bitcoin trading platform GBL vanishes,Could Bitcoin Be More Disruptive than the Internet,Apple Store is updating.

 

得分計算公式的程式碼

HN伺服器上提供了得分演算法的一種實現,以及更新的得分計算公式:

以防你不會閱讀Arc程式碼,上面的程式碼中定義了一些變數:gravity* = 1.8,timebase* = 120(minutes), etc. 然後定義了一種首頁排名方法,對於新聞s排名主要考慮了贊成投票(realsocore)和存在時間(item-age)。

罰分的情況由一組if定義的各種case定義。如果一篇文章中沒有“內容(story)”或者“投票”,那麼罰分為0.8。如果URL為空,那麼引數為norl-factor*.如果內容被標記為“隱藏(bury)”,那麼引數為0.001同時文章被遺忘。最後,預設的情況考慮了爭議和遺傳演算法/輕便的因素。爭議因素contro-factor用來壓制可能引起網路論戰的文章,這一因素稍後會詳細說明。

如果文章被標記為惡作劇(joke)那麼引數值為0.1,同時一篇“輕量級”的文章會有0.17的引數值。實際應用的罰分系統比公開程式碼中還要複雜的多。

 

結論

Hacker News主頁上的文章位置並不是嚴格按照你的估計。經過對Hacker News網頁上的文章的仔細計算,我們可以對實際應用的算分公式有深入瞭解。雖然,贊成投票顯然是影響排名的因素,但是,同時還有一個複雜的“罰分”系統使得文章排名下降或是徹底消失。這不僅僅是為了阻止垃圾資訊,也會影響一些很流行的文章。如果一篇文章的評論數多餘贊成投票,不要評論那篇文章,否則你會讓它徹底消失!

相關文章