2013-10-07 7 views
10

Sto cercando un algoritmo per ordinare i risultati dei siti Web in base alla popolarità .. come Reddit è così il post più vecchio meno potere ha voti/punteggio.Algoritmo di decadenza della popolarità per i popolari post del sito web

Ecco l'generalmente accettato soluzione ed usati per 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 

Sono stato sopra l'algoritmo di Reddit e anche se si adatta per una situazione, che cosa ho veramente bisogno è di due algoritmi, uno per i messaggi popolari e un altro per i prossimi post:

  • Post più popolari
  • messaggi Prossimi

I più popolari decadono più lentamente, dando più peso ai post più vecchi in cui i post futuri si concentreranno maggiormente sui post più popolari oggi, lasciando cadere nettamente dopo N ore/giorni/ecc.

sto scrivendo questo usando le espressioni Sphinx quindi non posso scrivere un algo hugly complicato e ho solo l'accesso alle seguenti funzioni:

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

Così ho i seguenti dati per messaggio:

  • età Share secondi
  • Messaggio punteggio

Qui è la mia soluzione attuale:

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

Anche se questa soluzione non funziona la sua non è l'ideale. Un post nuovo e popolare nelle ultime due ore è spesso al primo posto sia in pubblico che in quello imminente, il che non è proprio quello che voglio.

Qualcuno può suggerire un altro algoritmo che possa modificare un componente esponenziale per regolare il decadimento?

risposta

11

Hai provato classifica algoritmo utilizzato da notizie Hacker? È semplice da implementare.

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 

È possibile variare Gravità per regolare il decadimento.

Per ulteriori informazioni fare riferimento a How Hacker News ranking algorithm works

+0

questo sembra interessante, ho intenzione di attuarla a livello locale e vedere che tipo di risultati che ottengo. – antfx

4

Hai provato a utilizzare diverse funzioni di decadimento per "popolare" e "imminente"? ad esempio, usa un tasso di decadimento esponenziale per "imminente" e il tasso di decadimento polinomiale per "popolare", in questo modo, dopo alcune ore (se ottimizzato correttamente), ci sono poche possibilità che un post raggiunga un punteggio alto in arrivo. mentre nelle funzioni di decadimento polinomiale la relazione tra i tempi adiacenti si riduce, non è il caso di una funzione di decadimento esponenziale.

Ecco un esempio (i parametri 0.01 e 1.0005 sono arbitrari e devono essere ottimizzati in base al proprio obiettivo).

Popolare:

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

Prossimamente:

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