簡體   English   中英

人氣算法

[英]Popularity Algorithm

我想在上傳“最熱門”插圖的用戶提交插圖網站的主頁上填寫。

以下是我可以采取的措施:

  • 有多少人喜歡這個插圖
    • votes表包括投票日期
  • 上傳插圖時
    • illustration表已創建日期
  • 評論數量(不如最高評論總數大約10)
    • comments表有評論日期

我已經四處尋找,但不希望用戶權限發揮作用,但大多數算法都包括這一點。

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

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

我如何衡量年齡反對選票? 當然,提交較少的網站需要減少日期權重嗎?

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

例如,這是您可能想要嘗試的一個偽示例。 當然,您需要根據自己對網站的體驗來調整每個類別的權重。 評論很少見,但是用戶需要付出更多努力而不是喜歡/投票,因此他們可能會獲得更多的重量。

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

if(age < 86400) score = score * 1.5

這種方法可以為過去一天上傳的新內容帶來獎勵。 如果您想以類似的方式僅對最近被收藏或評論過的內容進行處理,您可以在查詢中添加一些WHERE約束,從數據庫中獲取分數。

實際上有兩個很大的原因不能動態計算這個排名。

  1. 要求您的數據庫獲取所有數據並對每個頁面加載進行計算只是為了重新排序項目會導致昂貴的查詢。
  2. 可能是一個較小的問題,但如果你在網站上的活動量相對較小,排名的微小變化可能會導致內容大幅度移動。

這使得您可以定期緩存結果,也可以設置一個cron作業來更新一個新的數據庫列,其中包含您正在排名的分數。

顯然這有一些主觀性 - 沒有一個“正確”的算法來確定適當的平衡 - 但我會從像單位年齡的投票開始。 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)) 依此類推......根據你對該算法的具體要求,可能需要進行一些實驗來確定哪種公式可以得到最好的結果。

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

就像是:

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

k越高,權重就越少。

您還可以將時間更改為首次出現的時間+上次活動的時間,這樣可以確保舊插圖隨着時間的推移而消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM