基于用戶投票的排名算法(三):Stack Overflow

jopen 12年前發布 | 16K 次閱讀 算法

        上一篇文章,我介紹了 Reddit 的排名算法。

        它的特點是,用戶可以投贊成票,也可以投反對票。也就是說,除了時間因素以外,只要考慮兩個變量就夠了。

        但是,還有一些特定用途的網站,必須考慮更多的因素。世界排名第一的程序員問答社區 Stack Overflow,就是這樣一個網站。

基于用戶投票的排名算法(三):Stack Overflow

        你在上面提出各種關于編程的問題,等待別人回答。訪問者可以對你的問題進行投票(贊成票或反對票),表示這個問題是不是有價值。

基于用戶投票的排名算法(三):Stack Overflow

        一旦有人回答了你的問題,其他人也可以對這個回答投票(贊成票或反對票)。根據投票結果,系統自動找出最佳回答。

基于用戶投票的排名算法(三):Stack Overflow

        排名算法的作用是,找出某段時間內的熱點問題,即哪些問題最被關注、得到了最多的討論。

        在 Stack Overflow 的頁面上,每個問題前面有三個數字,分別表示問題的得分、回答的數目和該問題的瀏覽次數。以這些變量為基礎,就可以設計算法了。

基于用戶投票的排名算法(三):Stack Overflow

        創始人之一的 Jeff Atwood,曾經在幾年前,公布過排名得分的計算公式。

基于用戶投票的排名算法(三):Stack Overflow

        寫成 php 代碼,就是下面這樣:

基于用戶投票的排名算法(三):Stack Overflow

        各個算法變量的含義如下:

        (1)Qviews(問題的瀏覽次數)

        某個問題的瀏覽次數越多,就代表越受關注,得分也就越高。這里使用了以 10 為底的對數,用意是當訪問量越來越大,它對得分的影響將不斷變小。

        (2)Qscore(問題得分)和 Qanswers(回答的數量)

        首先,Qscore(問題得分)= 贊成票-反對票。如果某個問題越受到好評,排名自然應該越靠前。

        Qanswers 表示回答的數量,代表有多少人參與這個問題。這個值越大,得分將成倍放大。這里需要注意的是,如果無人回答,Qanswers 就等于0,這時 Qscore 再高也沒用,意味著再好的問題,也必須有人回答,否則進不了熱點問題排行榜。

        (3)Ascores(回答得分)

        一般來說,"回答"比"問題"更有意義。這一項的得分越高,就代表回答的質量越高。

        但是我感覺,簡單加總的設計還不夠全面。這里有兩個問題。首先,一個正確的回答勝過一百個無用的回答,但是,簡單加總會導致,1個得分為 100 的回答與 100 個得分為 1 的回答,總得分相同。其次,由于得分會出現負值,因此那些特別差的回答,會拉低正確回答的得分。

        (4)Qage(距離問題發表的時間)和 Qupdated(距離最后一個回答的時間)

        改寫一下,可以看得更清楚:

        Qage 和 Qupdated 的單位都是秒。如果一個問題的存在時間越久,或者距離上一次回答的時間越久,Qage 和 Qupdated 的值就相應增大。

        也就是說,隨著時間流逝,這兩個值都會越變越大,導致分母增大,因此總得分會越來越小。

        (5)總結

        Stack Overflow 熱點問題的排名,與參與度(Qviews 和 Qanswers)和質量(Qscore 和 Ascores)成正比,與時間(Qage 和 Qupdated)成反比。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!