Popülerlik Algoritma

4 Cevap php

Ben yükledi "sıcak" resimli ile benim kullanıcı gönderilen-çizimler sitenin ana sayfasını doldurmak istiyorum.

Burada mevcut olan önlemler şunlardır:

  • How many people have favourited that illustration
    • votes tablo olarak tarihini içerir
  • When the illustration was uploaded
    • illustration tablo oluşturulur tarihi var
  • Number of comments (not so good as max comments total about 10 at the moment)
    • comments tablo açıklama tarihi var

Etrafa arandı, ancak bir rol oynamak kullanıcı yetkisi istemiyorum, ama çoğu algoritmaları olduğunu içerir.

Ben de veri veya getirir MySQL hesaplama yapmak için daha iyi olup olmadığını öğrenmek için gereken her saat ya da öylesine bir PHP / cron yöntem olmalıdır eğer.

Ben sadece ana sayfa doldurmak için 20 illüstrasyonlar gerekir. Ben bu veriler için sayfalama her türlü gerekmez.

Nasıl oya karşı yaş ağırlık mı? Şüphesiz daha az sunulması ile bir site tarihte az ağırlık ihtiyacı eklendi?

4 Cevap

Popülerlik sıralamasında çeşit kullanmak birçok site skoru belirlemek için standart bir algoritma kullanarak ve daha sonra zamanla ebediyen çürüyen bunu. Ne buldum az trafik olan siteler için daha iyi çalışır yeni içerik / etkinlik için bir bonus veriyor çarpan - bu temelde aynı, ama skor sizin seçtiğiniz bir süre sonra değişen durur.

Örneğin, burada denemek isteyebilirsiniz şey bir sözde örnek. Tabii ki, sizin site ile kendi deneyimlerine dayanarak her kategori için atfederek konum ne kadar kilo ayarlamak isteyeceksiniz. Yorumlar nadirdir, ama bir favori / oy daha kullanıcıdan daha fazla çaba alabilir, bu yüzden muhtemelen daha fazla ağırlık verilmelidir.

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

if(age < 86400) score = score * 1.5

Bu tür bir yaklaşım Geçtiğimiz gün içinde yüklenen yeni içerik için bir bonus verecek. Sadece son zamanlarda üzerinde favorilere ya da yorumladı olmuştu içerik için benzer bir şekilde bu yaklaşım istedim, sadece bazı ekleyebilirsiniz NEREDE dışarı DB puanı kapmak sizin sorgu kısıtlamalar.

Anında bu sıralama hesaplamak için değil iki büyük nedeni aslında vardır.

  1. Lütfen DB gerektiren tüm veriler getirme ve sadece pahalı sorgusunda ürün sonuçlarını yeniden düzenlemek için her sayfa yük bir hesaplama yapmak için.
  2. Eğer sitede faaliyet görece küçük bir miktar varsa muhtemelen küçük bir yakaladım, ancak, sıralamada küçük değişiklikler içeriği oldukça ölçüde hareket etmesine neden olabilir.

Bu periyodik sonuçlarını önbelleğe ya göre sıralama konum bu puan tutarak yeni bir veritabanı sütunu güncelleştirmek için bir cron işi kurma ya da size bırakır.

Açıkçası bu biraz öznellik orada - kimse uygun dengeyi belirlemek için "doğru" algoritması - ama ben birim yaş başına oy gibi bir şey ile başlamak istiyorum. Eğer zamanla oyların bölüm göre sıralamak için sormak böylece MySQL temel matematik yapabilir; Ancak, performans nedenleriyle, bu sorgunun sonucunu önbelleğe için iyi bir fikir olabilir. Belki bir şey gibi

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

ama benim SQL paslı ;-)

Basit bir ortalama irade alarak, tabii ki, ön sayfada gösteren yeni görüntüler lehine önyargı. Bu önyargı kaldırmak istiyorsanız, size, görüntü nakledilen sonra belirli bir süre içinde meydana gelen yalnızca oy sayımı, diyebiliriz. Bu süre daha yeni görüntüler için, daha sonra görüntünün yaşına bölünmesi süre ile oy sayısı çarpılarak normalize etmek olurdu. Veya alternatif olarak, oyların sürekli değişen ağırlık, exp(-time(vote) + time(image)) gibi bir şey verebilir. Ve böylece ve böylece ... sen bu algoritma ne yapacağı konusunda ne kadar belirli bağlı olarak, en iyi sonuçları verir formülü anlamaya bazı deneyler sürebilir.

Ben kadar gerçek sensörlü algoritma söz konusu olduğunda hiçbir yararlı fikirler var, ama uygulanması açısından, ben bir periyodik güncelleme ile, bir yerde sonucunu önbelleğe öneririm - pahalı sorgusunda çıkan hesaplama sonuçları, muhtemelen yapmazsanız sürelerinizi yavaşlatmak istiyorum.

Gibi bir şey:

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

Yüksek k daha az ağırlık o favorited olan insanların sayısını sahiptir.

Ayrıca ilk geçen etkinliğin zamanında + göründü zaman gibi bir şey için zaman değişebilir, bu eski çizimler zamanla ortadan olacağını sağlayacak.