基於使用者投票的排名演算法(一):Delicious和Hacker News
| 2012-03-04 09:28
網際網路的出現,意味著"資訊大爆炸"。
使用者擔心的,不再是資訊太少,而是資訊太多。如何從大量資訊之中,快速有效地找出最重要的內容,成了網際網路的一大核心問題。
各種各樣的排名演算法,是目前過濾資訊的主要手段之一。對資訊進行排名,意味著將資訊按照重要性依次排列,並且及時進行更新。排列的依據,可以基於資訊本身的特徵,也可以基於使用者的投票,即讓使用者決定,什麼樣的資訊可以排在第一位。
下面,我將整理和分析一些基於使用者投票的排名演算法,打算分成四個部分連載,今天是第一篇。
一、Delicious
最直覺、最簡單的演算法,莫過於按照單位時間內使用者的投票數進行排名。得票最多的專案,自然就排在第一位。
舊版的Delicious,有一個"熱門書籤排行榜",就是這樣統計出來的。
它按照"過去60分鐘內被收藏的次數"進行排名。每過60分鐘,就統計一次。
這個演算法的優點是比較簡單、容易部署、內容更新相當快;缺點是排名變化不夠平滑,前一個小時還排在前列的內容,往往第二個小時就一落千丈。
二、Hacker News
Hacker News是一個網路社群,可以張貼連結,或者討論某個主題。
每個帖子前面有一個向上的三角形,如果你覺得這個內容很好,就點選一下,投上一票。根據得票數,系統自動統計出熱門文章排行榜。但是,並非得票最多的文章排在第一位,還要考慮時間因素,新文章應該比舊文章更容易得到好的排名。
Hacker News使用Paul Graham開發的Arc語言編寫,原始碼可以從arclanguage.org下載。它的排名演算法是這樣實現的:
將上面的程式碼還原為數學公式:
其中,
P表示帖子的得票數,減去1是為了忽略發帖人的投票。
T表示距離發帖的時間(單位為小時),加上2是為了防止最新的帖子導致分母過小(之所以選擇2,可能是因為從原始文章出現在其他網站,到轉貼至Hacker News,平均需要兩個小時)。
G表示"重力因子"(gravityth power),即將帖子排名往下拉的力量,預設值為1.8,後文會詳細討論這個值。
從這個公式來看,決定帖子排名有三個因素:
第一個因素是得票數P。
在其他條件不變的情況下,得票越多,排名越高。
從上圖可以看到,有三個同時發表的帖子,得票分別為200票、60票和30票(減1後為199、59和29),分別以黃色、紫色和藍色表示。在任一個時間點上,都是黃色曲線在最上方,藍色曲線在最下方。
如果你不想讓"高票帖子"與"低票帖子"的差距過大,可以在得票數上加一個小於1的指數,比如(P-1)^0.8。
第二個因素是距離發帖的時間T。
在其他條件不變的情況下,越是新發表的帖子,排名越高。或者說,一個帖子的排名,會隨著時間不斷下降。
從前一張圖可以看到,經過24小時之後,所有帖子的得分基本上都小於1,這意味著它們都將跌到排行榜的末尾,保證了排名前列的都將是較新的內容。
第三個因素是重力因子G。
它的數值大小決定了排名隨時間下降的速度。
從上圖可以看到,三根曲線的其他引數都一樣,G的值分別為1.5、1.8和2.0。G值越大,曲線越陡峭,排名下降得越快,意味著排行榜的更新速度越快。
知道了演算法的構成,就可以調整引數的值,以適用你自己的應用程式。
[參考文獻]
* How Hacker News ranking algorithm works
* How to Build a Popularity Algorithm You can be Proud of
(完)
作者: 阮一峰
VIA http://www.ruanyifeng.com/blog/2012/02/ranking_algorithm_hacker_news.html
相關文章
- 基於使用者投票的排名演算法:Delicious和Hacker News演算法
- 基於使用者投票的排名演算法:Reddit演算法
- 基於使用者投票的排名演算法:Stack Overflow演算法
- 基於使用者投票的排名演算法(二):Reddit演算法
- 基於使用者投票的排名演算法(三):Stack Overflow演算法
- 基於使用者投票的排名演算法:牛頓冷卻定律演算法
- Hacker News排名演算法是怎樣工作的:得分、爭議和罰分演算法
- 基於使用者投票的排名演算法(四):牛頓冷卻定律演算法
- 基於使用者投票的排名演算法(六):貝葉斯平均演算法
- 基於使用者投票的排名演算法(五):威爾遜區間演算法
- [Hacker News 週報] #583
- [Hacker News 週報] 現代 CLI 大全;Deno 推出 FaaS 服務;基於 Rust 的隧道工具Rust
- 為什麼Hacker News昨晚一夜當機
- Hacker News:2018年4月程式語言排行榜 Python排名第一Python
- Hacker News:2018年度報告
- 如果前端不使用SPA又能怎樣?- Hacker News前端
- [Hacker News 週報] GitHub Action 教程;在 serverless 中使用 SQLiteGithubServerSQLite
- [Hacker News 週報] Deno 原生 SSR web 框架;基於 Vite 的單元測試框架;程式設計師社交新嘗試Web框架Vite程式設計師
- Hacker需要掌握的基礎
- [Hacker News 週報] 基於 WASM 在瀏覽器中執行 Office;K8s 紀錄片;GitHub 功能增強ASM瀏覽器K8SGithub
- [Hacker News 週報] CRUD 最佳工具;論文專用 PDF 閱讀器;JS 協同演算法庫JS演算法
- 基於使用者的協同過濾演算法演算法
- [Hacker News 週報] SQLite 再次流行;JS 效能分析指南;魔方競速工具 CubeDeskSQLiteJS
- 排名演算法(一)--PageRank演算法
- 基於圖的機器演算法 (一)演算法
- [Hacker News 週報] Vite 3.0 釋出;Bun 效能實測;效能更強的 Prometheus 替代方案VitePrometheus
- Hacker-基礎學習(1)
- 基於遺傳演算法的HFSS和C#聯合模擬(一)演算法C#
- [Hacker News 週報] 25 倍快的 Redis 競品;開源 serverless PG 方案;快速編寫 UML 圖RedisServer
- 基於JSP自定義投票網站系統設計JS網站
- [譯] 基於評論的機器學習線上課程排名機器學習
- [Hacker News 週報] 自部署 PaaS coolify;現代化終端 Warp;Ruby 增加 WASM 支援ASM
- [Hacker News 週報] 資料視覺化神器;10大 web 黑客技術;Postman 支援 gRPC視覺化Web黑客PostmanRPC
- 基於AD作用於域使用者和計算機的組策略(1)計算機
- 基於AD作用於域使用者和計算機的組策略(2)計算機
- [Hacker News 週報] JS 型別系統提案;開源遊戲引擎 Godot;資料庫索引工作原理JS型別遊戲引擎Go資料庫索引
- 美國西弗吉尼亞州完成首例基於區塊鏈的州選舉投票區塊鏈
- 基於Gridsome建立一個基於Vue.JS和Markdown的部落格Vue.js