2013-10-07 61 views
10

我正在尋找一種算法來根據流行度對網站結果進行排序..就像Reddit的所以年紀越大的帖子,它的投票/得分越低。受歡迎的網站帖子的流行度衰減算法

這裏是普遍接受的解決方案13759 reddit的:

t = (time of entry post) - (Dec 8, 2005) 
x = upvotes - downvotes 

y = {1 if x > 0, 0 if x = 0, -1 if x < 0) 
z = {1 if x < 1, otherwise x} 

rank = log(z) + (y * t)/45000 

我一直在reddit的算法,雖然它會適合一個情況,我真正需要的是兩種算法,一個熱門的帖子而另一個爲即將舉行的帖子:

  • 熱門職位
  • 即將帖子

熱門會衰減得更慢,給稍微老的帖子更多的重量,即將發佈的帖子將更多地關注熱門帖子,在N小時/天/等之後急劇下降。

我寫這篇文章使用獅身人面像表情,所以我不能寫一個hugly複雜的算法中,我只可以訪問以下功能:

http://sphinxsearch.com/docs/current.html#numeric-functions

所以我每個職位以下數據:

  • 後年齡秒
  • 後得分

這是我目前的解決方案:

Exponent = 0.01 (Popular), 0.5 (Upcoming) 
SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate) 
Rank = (log10(PostScore)*10000)/pow(SecondsSincePublised,Exponent) 

雖然這種解決方案確實工作的效果並不理想。在過去幾個小時裏,一個新的和受歡迎的帖子在流行和即將發佈中都很高,這並不是我想要的。

任何人都可以提出另一種算法,我可以修改指數組件來調整衰減?

回答

11

你試過排名由黑客新聞使用的算法? 實施起來很簡單。

Score = (P-1)/(T+2)^G 

where, 
P = points of an item (and -1 is to negate submitters vote) 
T = time since submission (in hours) 
G = Gravity, defaults to 1.8 in news.arc 

您可以通過改變重力來調整衰減。

欲瞭解更多信息,請參閱How Hacker News ranking algorithm works

+0

這看起來很有趣,我要在本地執行它,看看我得到什麼樣的結果。 – antfx

4

您是否嘗試過使用「流行」和「即將到來」的不同衰減功能?例如,對於「即將到來的」使用指數衰減率,對於「流行」使用指數衰減率,這樣,在幾個小時後(如果正確優化的話),在即將到來的時間裏,一個帖子的得分會很高。而在多項式衰減函數中,相鄰時間之間的關係越來越小,這與指數衰減函數不同。

下面是一個示例(參數0.01和1.0005是任意的,應根據您的目標進行優化)。

人氣:

SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate) 
Rank = (log10(PostScore)*10000)/pow(SecondsSincePublised,0.01) 

即將來臨:

SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate) 
Rank = (log10(PostScore)*10000)/pow(1.0005,SecondsSincePublised)