基于用戶投票的排名算法(一):Delicious和Hacker News

互聯網的出現,意味著"信息大爆炸"。

用戶擔心的,不再是信息太少,而是信息太多。如何從大量信息之中,快速有效地找出最重要的內容,成了互聯網的一大核心問題。

bg2012022401.jpg

各種各樣的排名算法,是目前過濾信息的主要手段之一。對信息進行排名,意味著將信息按照重要性依次排列,并且及時進行更新。排列的依據,可以基于信息本身的特征,也可以基于用戶的投票,即讓用戶決定,什么樣的信息可以排在第一位。

下面,我將整理和分析一些基于用戶投票的排名算法,打算分成六個部分連載,今天是第一篇。

一、Delicious

最直覺、最簡單的算法,莫過于按照單位時間內用戶的投票數進行排名。得票最多的項目,自然就排在第一位。

舊版的Delicious,有一個"熱門書簽排行榜",就是這樣統計出來的。

bg2012022402.png

它按照"過去60分鐘內被收藏的次數"進行排名。每過60分鐘,就統計一次。

這個算法的優點是比較簡單、容易部署、內容更新相當快;缺點是,一方面,排名變化不夠平滑,前一個小時還排名靠前的內容,往往第二個小時就一落千丈,另一方面,缺乏自動淘汰舊項目的機制,某些熱門內容可能會長期占據排行榜前列。

二、Hacker News

Hacker News是一個網絡社區,可以張貼鏈接,或者討論某個主題。

bg2012022403.png

每個帖子前面有一個向上的三角形,如果你覺得這個內容很好,就點擊一下,投上一票。根據得票數,系統自動統計出熱門文章排行榜。但是,并非得票最多的文章排在第一位,還要考慮時間因素,新文章應該比舊文章更容易得到好的排名。

Hacker News使用Paul Graham開發的Arc語言編寫,源碼可以從arclanguage.org下載。它的排名算法是這樣實現的:

bg2012022404.png

將上面的代碼還原為數學公式:

chart?cht=tx&chl=Score%3D%5Cfrac%7BP-1%7

其中,

  P表示帖子的得票數,減去1是為了忽略發帖人的投票。

  T表示距離發帖的時間(單位為小時),加上2是為了防止最新的帖子導致分母過小(之所以選擇2,可能是因為從原始文章出現在其他網站,到轉貼至Hacker News,平均需要兩個小時)。

  G表示"重力因子"(gravityth power),即將帖子排名往下拉的力量,默認值為1.8,后文會詳細討論這個值。

從這個公式來看,決定帖子排名有三個因素:

第一個因素是得票數P。

在其他條件不變的情況下,得票越多,排名越高。

bg2012022405.png

從上圖可以看到,有三個同時發表的帖子,得票分別為200票、60票和30票(減1后為199、59和29),分別以黃色、紫色和藍色表示。在任一個時間點上,都是黃色曲線在最上方,藍色曲線在最下方。

如果你不想讓"高票帖子"與"低票帖子"的差距過大,可以在得票數上加一個小于1的指數,比如(P-1)^0.8。

第二個因素是距離發帖的時間T。

在其他條件不變的情況下,越是新發表的帖子,排名越高。或者說,一個帖子的排名,會隨著時間不斷下降。

從前一張圖可以看到,經過24小時之后,所有帖子的得分基本上都小于1,這意味著它們都將跌到排行榜的末尾,保證了排名前列的都將是較新的內容。

第三個因素是重力因子G。

它的數值大小決定了排名隨時間下降的速度。

bg2012022406.png

從上圖可以看到,三根曲線的其他參數都一樣,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

(完)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS 修改工程名

一兩個月之前,公司要求將現在的項目(發貨端和接單端在一個項目里),拆分成兩個項目分別是接單端項目和發貨端項目,原有的項目還不能下架。這種情況就要考慮蘋果審核查代碼的重復率的問題了。老板的要求除了改變項目的主…

Windows 下 Python 環境搭建

簡述Python 是跨平臺的,可以運行在 Windows、Mac OS X 和各種 Linux/Unix 系統上。在學習 Python 之前,首先要搭建 Python 環境。完成后,會得到 Python 解釋器(負責運行 Python 程序的),一個命令行交互環境…

面試中關于Java你所需知道的的一切

本篇文章會對面試中常遇到的Java技術點進行全面深入的總結,幫助我們在面試中更加得心應手,不參加面試的同學也能夠借此機會梳理一下自己的知識體系,進行查漏補缺。 1. Java中的原始數據類型都有哪些,它們的大小及對應的封裝類是什…

利用BBRSACryptor實現iOS端的RSA加解密

背景 RSA這種非對稱加密被廣泛的運用于網絡數據的傳輸,但其在iOS上很難直接實現,BBRSACryptor框架通過移植openssl實現了iOS端的RSA,本文將介紹如何使用BBRSACryptor生成證書,加載公鑰,以及后端如何用php讀取證書&…

UIView轉UIimage

/** 將 UIView 轉換成 UIImage param view 將要轉換的View return 新生成的 UIImage 對象 */ - (UIImage *)yj_convertCreateImageWithUIView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGContextRef ctx UIGraphicsGetCurrentContext…

Linq 合并數據并相加

有幾條數據是這樣的 Person 123 456 789 Person 321 654 987 想合并成 Person 444 1110 1776 直接一條linq搞定 var newQuery from p in query group p by p.Name into gselect new { Name g.Name, Value g.Sum(x > x.Value) }; 轉…

python 各種模塊學習

from:https://blog.csdn.net/weiwangchao_/article/details/70570508轉載:。。。。Python的模塊大全,很全,有詳細介紹!另外附Python兩個教程1. Python詳細教程(廖雪峰的官方網站,語言簡潔&#…

Linux(Fedora21)安裝google chrome瀏覽器

2019獨角獸企業重金招聘Python工程師標準>>> Linux(Fedora21)安裝Google Chrome瀏覽器 qianghaoaho(孤狼) 1.添加google chrome的源: cd /etc/yum.repos.d/ vim chrome.repo添加如下內容: [google64] …

啟動頁更換圖片后,加載不出來

這個問題,重啟一下手機就可以了,我的就是這么解決的。

R-大數據分析挖掘(5-R基礎回顧)

&#xff08;一&#xff09;R函數 R是一種解析型語言&#xff0c;輸入后可直接獲取結果 函數&#xff08;輸入參數&#xff0c;參數&#xff09; R的函數分為“高級”和“低級函數”     ??高級函數可調用低級函數     ??高級函數稱為泛型函數 ??函數名 <-‐…

jquery點擊label觸發2次的問題

今天寫問卷的時候遇到個label點擊的時候&#xff0c;監聽的click事件被執行兩次&#xff1b;產生這個的原因么。。。事件冒泡 <div class"questionBox checkBox"><div class"title"> 2.你如何理解創新意識的重要性?</div><div class…

git本地項目管理

Git 基本工作流程 | git倉庫 | 暫存區 | 工作目錄 | | ---------------- | ------------------ | ------------------- | | 用于存放提 交記錄 | 臨時存放被修改文件 | 被Git管理的項目目錄 | Git 的使用 1.5.1 Git 使用前配置 在使用 git 前&#xff0c;需要告訴 git 你…

Python中self用法詳解

在介紹Python的self用法之前&#xff0c;先來介紹下Python中的類和實例…… 我們知道&#xff0c;面向對象最重要的概念就是類&#xff08;class&#xff09;和實例&#xff08;instance&#xff09;&#xff0c;類是抽象的模板&#xff0c;比如學生這個抽象的事物&#xff0c;…

siwft初學(一)

今天剛開始學習swift語言。首先須要下載xcode6 beta版本號。正式版本號然后會公布。自己學習總結一下&#xff0c;假設有誤。請大家指出。 創建project的時候。language選擇swift語言。 swift語言比起c&#xff0c;oc很的簡潔。開始真有點不適應&#xff0c;沒有main函數&#…

python簡單爬蟲(一)

學習python前糾結了下&#xff0c;到底是應該一個個知識點吃透&#xff0c;然后寫些小程序。還是應該快速掌握基礎語法&#xff0c;快速實踐。思考后認為前者這么學習速度真心不高&#xff0c;于是花2天時間看了下python3的語法&#xff0c;雖然很多都不明白&#xff0c;但是帶…

Github遠程倉庫管理

1. Github 在版本控制系統中&#xff0c;大約90%的操作都是在本地倉庫中進行的&#xff1a;暫存&#xff0c;提交&#xff0c;查看狀態或者歷史記錄等等。除此之外&#xff0c;如果僅僅只有你一個人在這個項目里工作&#xff0c;你永遠沒有機會需要設置一個遠程倉庫。 只有當…

oracle 中的trunc()函數及加一個月,一天,一小時,一分鐘,一秒鐘方法

返回處理后的數據&#xff0c;不同于round()&#xff08;對數值進行四舍五入處理&#xff09;&#xff0c;該函數不對指定小數前或后的數值部分進行舍入處理。 語法&#xff1a;trunc(number[,decimals]) 其中&#xff0c;number為待做處理的數值&#xff0c;decimals為需要保留…

【Halcon】Halcon與OpenCV介紹、比較

from:https://blog.csdn.net/taily_duan/article/details/514997691.MVTec HALCONMVTec HALCON 是世界上最全能的機器視覺軟件.世界各地的用戶從HALCON為快速開發圖像分析和機器視覺程序的靈活架構獲益匪淺.HALCON 提供了超過1100多種具備突出性能控制器的庫,如模糊分析,形態,模…

直接拿來用!最火的Android開源項目(完結篇)

直接拿來用&#xff01;最火的Android開源項目&#xff08;完結篇&#xff09; 2014-01-06 19:59 4785人閱讀 評論(1) 收藏 舉報 分類&#xff1a;android 高手進階教程&#xff08;100&#xff09; 摘要&#xff1a;截至目前&#xff0c;在GitHub“最受歡迎的開源項目”系…

ABP理論學習之Web API控制器(新增)

返回總目錄 本篇目錄 介紹AbpApiController基類 本地化審計日志授權工作單元其他介紹 ABP通過Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器。你可以像以往創建Asp.Net Web API控制器那樣創建Web API控制器。依賴注入對于有規律的ApiController&#xff08;其實就是繼承自Ab…