日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于用户投票的排名算法Reddit

發布時間:2025/7/25 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于用户投票的排名算法Reddit 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于用戶投票的排名算法(二):Reddit

作者:?阮一峰

日期:?2012年3月 7日

(不好意思,這個系列中斷了近兩周,我會盡快在這幾天,把后面幾篇寫完。)

上一次,我介紹了Hacker News的排名算法。它的特點是用戶只能投贊成票,但是很多網站還允許用戶投反對票。就是說,除了好評以外,你還可以給某篇文章差評。

Reddit是美國最大的網上社區,它的每個帖子前面都有向上和向下的箭頭,分別表示"贊成"和"反對"。用戶點擊進行投票,Reddit根據投票結果,計算出最新的"熱點文章排行榜"。

怎樣才能將贊成票和反對票結合起來,計算出一段時間內最受歡迎的文章呢?如果文章A有100張贊成票、5張反對票,文章B有1000張贊成票、950張反對票,誰應該排在前面呢?

Reddit的程序是開源的,使用Python語言編寫。排名算法的代碼大致如下:

這段代碼考慮了這樣幾個因素:

(1)帖子的新舊程度t

  t = 發貼時間 - 2005年12月8日7:46:43

t的單位為秒,用unix時間戳計算。不難看出,一旦帖子發表,t就是固定值,不會隨時間改變,而且帖子越新,t值越大。至于2005年12月8日,應該是Reddit成立的時間。

(2)贊成票與反對票的差x

  x = 贊成票 - 反對票

(3)投票方向y

  

y是一個符號變量,表示對文章的總體看法。如果贊成票居多,y就是+1;如果反對票居多,y就是-1;如果贊成票和反對票相等,y就是0。

(4)帖子的受肯定(否定)的程度z

  

z表示贊成票與反對票之間差額的絕對值。如果對某個帖子的評價,越是一邊倒,z就越大。如果贊成票等于反對票,z就等于1。

結合以上幾個變量,Reddit的最終得分計算公式如下:

  

這個公式可以分成兩個部分來討論:

(一)

  

這個部分表示,贊成票與反對票的差額z越大,得分越高。

需要注意的是,這里用的是以10為底的對數,意味著z=10可以得到1分,z=100可以得到2分。也就是說,前10個投票人與后90個投票人(乃至再后面900個投票人)的權重是一樣的,即如果一個帖子特別受到歡迎,那么越到后面投贊成票,對得分越不會產生影響。

當贊成票等于反對票,z=1,因此這個部分等于0,也就是不產生得分。

(二)

  

這個部分表示,t越大,得分越高,即新帖子的得分會高于老帖子。它起到自動將老帖子的排名往下拉的作用。

分母的45000秒,等于12.5個小時,也就是說,后一天的帖子會比前一天的帖子多得2分。結合前一部分,可以得到結論,如果前一天的帖子在第二天還想保持原先的排名,在這一天里面,它的z值必須增加100倍(凈贊成票增加100倍)。

y的作用是產生加分或減分。當贊成票超過反對票時,這一部分為正,起到加分作用;當贊成票少于反對票時,這一部分為負,起到減分作用;當兩者相等,這一部分為0。這就保證了得到大量凈贊成票的文章,會排在前列;贊成票與反對票接近或相等的文章,會排在后面;得到凈反對票的文章,會排在最后(因為得分是負值)。

(三)

這種算法的一個問題是,對于那些有爭議的文章(贊成票和反對票非常接近),它們不可能排到前列。假定同一時間有兩個帖子發表,文章A有1張贊成票(發帖人投的)、0張反對票,文章B有1000張贊成票、1000張反對票,那么A的排名會高于B,這顯然不合理。

結論就是,Reddit的排名,基本上由發帖時間決定,超級受歡迎的文章會排在最前面,一般性受歡迎的文章、有爭議的文章都不會很靠前。這決定了Reddit是一個符合大眾口味的社區,不是一個很激進、可以展示少數派想法的地方。

[參考資料]

  *?How Reddit ranking algorithms work

(完)

留言(31條)

發表這類專業化太強的內容,確實很耗費時間,期待后面的內容

2012年3月 7日 16:40?|?∞?|?引用

文中對z的解釋跟代碼不一致啊。代碼中是 max(abs(s), 1), 也就是說只看贊成票和反對票的差距,差距越大值越大。并沒有區別對待贊成票還是反對票的意思。

2012年3月 7日 17:32?|?∞?|?引用

引用令狐蟲的發言:

文中對z的解釋跟代碼不一致啊。代碼中是 max(abs(s), 1), 也就是說只看贊成票和反對票的差距,差距越大值越大。并沒有區別對待贊成票還是反對票的意思。

對z的解釋確實跟代碼不一致啊,求解釋

2012年3月 7日 17:48?|?∞?|?引用

引用邵偉超的發言:

對z的解釋確實跟代碼不一致啊,求解釋

啊,我看代碼不仔細,這個地方沒注意到。

這篇文章要大幅度改寫了……

2012年3月 7日 18:26?|?∞?|?引用

改過z了,現在與代碼一致了。

2012年3月 7日 18:59?|?∞?|?引用

分析的不錯,感覺算法寫的中規中矩。

2012年3月 7日 19:22?|?∞?|?引用

這幾天正想琢磨,結果就看到了,真是不錯。

2012年3月 7日 22:46?|?∞?|?引用

不知道有沒有中文網站可以和Reddit相提並論

2012年3月 7日 22:49?|?∞?|?引用

這個絕對值的設計好像沒什么用啊,反對票遠大于贊成票的文章一下子就被sign*seconds/45000給踢到后面去了,很難靠按照對數增長的order拉回來。

2012年3月 8日 01:04?|?∞?|?引用

結論不太對。文章討論的都只是hot函數,原鏈接里還有個controversy函數。最后不一定只是用hot排序的。

2012年3月 8日 03:07?|?∞?|?引用

這個公式基本決定了:"Reddit的排名,基本上由發帖時間決定"!

2012年3月 8日 09:48?|?∞?|?引用

我看了一下github上帝reddit源代碼,發現他其實除了hot以外還有計算爭議值:


cpdef double controversy(long ups, long downs):
"""The controversy sort."""
return float(ups + downs) / max(abs(score(ups, downs)), 1)

在queries.py中新票和老票都是同時計入了hot, top 和controversy的值。雖然沒有仔細看,但是應該是如果1000贊成+1000反對還是會比1贊成+0反對要排前的。

2012年3月 8日 10:10?|?∞?|?引用

大蝦,能知道編輯器名字嗎,code看起來很舒服

2012年3月 8日 11:47?|?∞?|?引用

都是人才阿。。。

2012年3月 8日 14:31?|?∞?|?引用

最后的分析有道理

2012年3月 8日 15:34?|?∞?|?引用

引用令狐蟲的發言:

文中對z的解釋跟代碼不一致啊。代碼中是 max(abs(s), 1), 也就是說只看贊成票和反對票的差距,差距越大值越大。并沒有區別對待贊成票還是反對票的意思。

因為他有y來控制方向呀。。所以對z不區分應該沒什么問題的

2012年3月 8日 17:02?|?∞?|?引用

引用Johnny的發言:

大蝦,能知道編輯器名字嗎,code看起來很舒服

代碼是圖片來的,可以點開,點開來看就知道了。

2012年3月14日 13:07?|?∞?|?引用

引用Hank的發言:

不知道有沒有中文網站可以和Reddit相提並論

開源中國社區好像是Reddit排名算法,不太確定。

2012年3月16日 10:33?|?∞?|?引用

如果反對票超過贊成票,且超過越多,Z也越大 這個怎么解釋啊?

2012年3月16日 10:56?|?∞?|?引用

博主的php編輯器是什么軟件呀 好酷呀 英文字體也特別養眼 希望告知軟件名稱和字體哦 支持下~

2012年3月21日 16:30?|?∞?|?引用

引用sophia的發言:

如果反對票超過贊成票,且超過越多,Z也越大這個怎么解釋啊?

同問!!

order = log(max(abs(ups - downs), 1), 10) 這部分對結果影響不小吧

2012年3月23日 17:42?|?∞?|?引用

引用alexwhu的發言:

同問!!

order = log(max(abs(ups - downs), 1), 10) 這部分對結果影響不小吧

對于downs 比 ups 多的items, 主要靠 y*t / 45000 來調節了。

為什么不來更狠點的?

order = y * log(max(abs(ups - downs), 1), 10) + y*t / 45000

如果這么狠的話,那么downs比ups多的items,估計就永無天日能被用戶看到了,

其實有時候,downs比ups多的items,也是很有意思的item,至少能夠吸引用戶眼球,

所以,使用log(max(abs(ups - downs), 1), 10),來給予他們一些能夠“見天日”的機會,之余到底能否排上名“見到天日”,就看 y*t 了,如果是很舊的items,那么真的無法排上名了,如果是很新的items,雖然反對票很多,但是因為item出來新,還是可以給用戶看看的...

2012年3月23日 17:56?|?∞?|?引用

我認為這算法設計的思路還是挺好的,新舊、方向、拉伸力度,值得學習。
文章很好的解釋了其中的思路!

2012年3月31日 16:35?|?∞?|?引用

應該可以再加上一項 k*(贊成數+反對數),投票總數也是一項指標呢

2012年4月 1日 10:30?|?∞?|?引用

那個 yt,還以為是 y的 t次方呢,看了半天沒看懂,后來看了結尾給的鏈接文章,才明白原來是 y 乘 t, 呵呵!

2012年11月 7日 18:40?|?∞?|?引用

用php搭建的,算法與reddit一樣。歡迎訪問 lvv2.com 如果您訪問不到的話,那就是在墻外了。這里沒有言論審查。。其中,有爭論的 選項算法是
$s = $ups+$downs;
$argue = $ups>$downs?$downs/$ups:$ups/$downs;
$order = log10(max($s,1))*$argue;
$seconds = $date - strtotime('2011-05-10');
return round($order + $seconds/45000,7);

歡迎各位提建議補充,lvv2.com

2012年12月22日 22:07?|?∞?|?引用

從公式上看,兩篇先后發布的文章,如果贊成和反對票一直是0,那么他們的分值都一樣是0。這樣一來新發布的文章不就一直排不到前面,二來兩篇這樣的文章也不知道該怎么排序。這樣真的沒問題嗎?

2013年9月29日 17:10?|?∞?|?引用

reddit還有一個排名【上升】是根據上升速度來排的,誰知道這個是怎么實現的嗎?

2014年2月26日 20:46?|?∞?|?引用

reddit的算法有一些漏洞,比如假設兩篇文章,相距5秒發布。每一個都收到兩個負面評價,seconds對于新文章值更大一些,但是因為sign為負值,新的文章評分反而比舊的文章低。詳見http://blog.jobbole.com/53406/

2014年2月27日 10:07?|?∞?|?引用

您好看了你的關于reddit的文章,請問是否可以邀請您一起做基于這個系統的一個知識社交網站
我QQ65384403 謝謝 請加我

2015年2月17日 10:26?|?∞?|?引用

嗨, 請問這個排序算法問什么不用機器學習來做呢??
用邏輯回歸, 預估一個帖子是否被用戶查看的概率, 用這個概率來排序.

2015年9月30日 13:49?|?∞?|?引用


總結

以上是生活随笔為你收集整理的基于用户投票的排名算法Reddit的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。