2009-01-30 143 views
4

我想通過上傳的「最熱門」插圖填充我的用戶提交的插圖網站的主頁。受歡迎程度算法

這裏有措施,我提供以下信息:

  • 有多少人收藏最多的是插圖
    • votes表包括日投票
  • 當插圖上傳
    • illustration標籤樂已創建日期
  • (合計約10最多評論不太好,此刻)的評論數
    • comments表有

找遍周圍評論日期,但不希望用戶權限發揮作用,但大多數算法都包含這一點。

我還需要找出是否最好在MySQL中進行計算,以獲取數據或者每小時應該有一個PHP/cron方法。

我只需要20個插圖來填充主頁。我不需要爲這些數據進行任何分頁。

我該如何衡量年齡與選票?當然,提交數量較少的網站在添加日期時需要的重量較輕?

回答

4

許多使用某種類型的流行度排名的網站通過使用標準算法來確定分數然後隨着時間的推移而永久衰減。我發現,對於流量較少的網站而言,效果更好的是可以爲新內容/活動提供獎勵的乘數 - 它本質上是相同的,但在您選擇一段時間後,分數會停止變化。

例如,下面是您可能想要嘗試的某個虛擬示例。當然,您需要根據自己的網站體驗調整歸因於每個類別的重量。評論很少見,但比用戶喜歡的/投票更多的努力,所以他們可能會得到更多的分量。

score = (votes/10) + comments 
age = UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date_created) 

if(age < 86400) score = score * 1.5 

這種類型的方法會爲上一天上傳的新內容提供獎勵。如果你想以類似的方式來處理近期已經被收錄或評論過的內容,那麼你可以在你的查詢中添加一些WHERE約束來從數據庫中獲取分數。

實際上有兩個很大的原因不是在飛行中計算這個排名。

  1. 要求您的數據庫獲取所有數據並對每個頁面加載進行計算以重新排序項目會導致代價高昂的查詢。
  2. 可能是一個小問題,但如果您在網站上的活動數量相對較少,則排名的小改動可能會導致內容移動得非常劇烈。

這會讓您週期性地緩存結果,或者設置一個cron作業來更新一個新的數據庫列,並保持您排名靠前的分數。

0

就實際算法而言,我沒有任何有用的想法,但是在實現方面,我建議在某個地方緩存結果,並定期更新 - 如果結果計算導致昂貴的查詢,那麼您可能不想減慢你的響應時間。

0

喜歡的東西:

(count favorited + k) */time since last activity

越高k是重量少了具有其收藏的人數。

您也可以將時間更改爲最初出現的時間+最後一次活動的時間,這樣可以確保較舊的插圖隨時間消失。

2

顯然這裏有一些主觀性 - 沒有一個「正確的」算法來確定適當的平衡 - 但我會從每單位年齡的投票開始。 MySQL可以進行基本的數學計算,因此您可以要求它根據時間投票的商數進行排序;但是,出於性能原因,緩存查詢結果可能是一個好主意。也許像

SELECT images.url FROM images ORDER BY (NOW() - images.date)/COUNT((SELECT COUNT(*) FROM votes WHERE votes.image_id = images.id)) DESC LIMIT 20 

,但我的SQL是生鏽;-)

以簡單平均,當然,有利於新的圖像偏移顯示出來的頭版上。如果你想消除這種偏見,那麼你可以只計算在圖片發佈後的特定時間限制內發生的那些投票。對於比該時間限制更近的圖像,您必須通過將時間限制乘以投票數然後除以圖像的年齡來歸一化。或者,您可以給選票連續變化,如exp(-time(vote) + time(image))。依此類推......取決於你對這個算法的作用有多特別,可能需要一些實驗來弄清楚什麼公式提供了最好的結果。

+0

我同意。可衡量的流行度的數量應該隨着時間的推移來衡量,否則你最終只能得到一個半陳舊的主頁。例如,在過去24小時內獲得最多積分的項目。 – Ross 2009-01-31 13:48:11