2013-10-07 12 views
10

Web sitesi sonuçlarını popülerliğe göre sıralamak için bir algoritma arıyorum .. Reddit gibi eski bir mesaj o kadar az oy/puan var. reddit tarafından kullanılan Burada Popüler web sitesi yayınları için popülerlik çökmesi algoritması

genel çözüm kabul edilir:

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 

Ben reddit algoritması fazla oldu ve onu bir durum için uygun rağmen ne gerçekten ihtiyacım iki algoritmalar Popüler yayınlar için biridir ettik ve Gelecek mesajlar için başka:

  • Popüler Yayınlar
  • Yaklaşan mesajına

Popülerler, daha yavaş ilerlerken, Gelecek yayınların günümüzde popüler yayınlara daha fazla odaklanacağı, N saat/gün/vb. Sonra keskin bir şekilde düştüğü biraz daha eski yayınlara daha fazla ağırlık kazandıracak.

ben Sfenks ifadeler kullanarak bu yüzden hugly karmaşık algo yazamaz yazıyorum ve sadece aşağıdaki işlevlere erişebilirsiniz:

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

Yani gönderim başına aşağıdaki verilere sahip: saniyede

  • Mesaj yaş
  • Mesaj
skor bu çözüm onun ideal değil çalışır

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

rağmen:

İşte benim şimdiki çözümdür. Son birkaç saat içinde yeni ve popüler bir gönderi genellikle hem popüler hem de yaklaşan sıralarda yer alıyor.

Çürümeyi ayarlamak için bir bileşen bileşenini değiştirebileceğim başka bir algoritma önerebilecek biri var mı?

cevap

11

Eğer Hacker haberleri kullandığı sıralama algoritmasını denediniz mi? Uygulaması basittir.

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 

Bozulmayı ayarlamak için Yerçekimini değiştirebilirsiniz.Daha fazla bilgi için

How Hacker News ranking algorithm works

+0

bu ilginç görünüyor, ben yerel olarak uygulamak ve ben almak sonuçların ne tür görmeye gidiyorum bakın. – antfx

4

"Popüler" ve "yaklaşan" için farklı çürüme işlevlerini kullanmayı denediniz mi? Örneğin, "yaklaşan" ve "popüler" için polinom bozulma oranı için üstel bir azalma oranı kullanın, bu şekilde, birkaç saat sonra (doğru şekilde optimize edilmişse), bir gönderinin yaklaşmakta olan puanının çok yüksek olacağı çok az bir ihtimal vardır. Polinom bozunum fonksiyonlarında iken bitişik zamanlar arasındaki ilişki küçülmekte, üstel bir bozunum fonksiyonunda durum böyle değildir.

İşte bir örnek (0.01 ve 1.0005 parametresi isteğe bağlıdır ve hedefinize göre optimize edilmelidir).

Popüler:

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

Yaklaşan:

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