Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re: More useful "best" and "worst" nodes display

by hossman (Prior)
on May 12, 2004 at 06:20 UTC ( #352655=note: print w/replies, xml ) Need Help??

in reply to More useful "best" and "worst" nodes display

I've spent a lot of time considering various ways of implimenting a "most poopular" list for various systems that involve user rankings of content. In my opinion there are two good solutions, one of which is much better then the other -- but much more complex. Both work equally well for votes with boolean value (ie: 1), perlmonks style +/- votes (a value of -1 or +1), or scale votes (ie: a value of 1..10).

Unfortunately both require recalculating the score of every piece of content on a regular basis (even if it has had no new votes).

  • Weighted by Age of Content

    This one is fairly straight forward. You start by picking a unit of time (say: 1 day, or 1 week). For each $item determine the age in that unit: $item->age() and it's total number of votes: $item->totalVotes().

    You also need to pick a weighting function weight() -- it can be any function of $age, the simplest one being a linear function with constant slope...

    sub weight { my $age = shift; return $age / $FACTOR; }
    The overall popularity score of each item becomes:
    $score = $item->totalVotes() * weight($item->age());

  • Weighted by Age of Vote

    This is the complex one. Instead of a applying a weight function to the age of the item, you apply a weight function to the difference between the age of the item, and the age of each vote. Of course, this requires that you have some way to get a list of every vote ever cast for an item: $item->votes(), and the date of each vote so you can calculate the age: ($item->votes())[$i]->age()

    $score = 0; foreach $vote ($item->votes()) { $score += $vote->value() * weight($item->age() - $vote->age()); }

The first method, with the linear weighting function I mentioned, leans towards promoting either recent items or older items (depending on the value of $FACTOR). The second however can be used to lean towards items which continue to earn votes long after they were orriginally written.

In both cases, changing the weight function to something that is not so linear can allow you to tune it to perfection -- including adding bias at certain dates when you know there were radical shifts in votig rules (ie: on this date, the number of votes per person was significantly increased, so add more bias to votes cast before that date)

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://352655]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (3)
As of 2023-06-08 22:06 GMT
Find Nodes?
    Voting Booth?
    How often do you go to conferences?

    Results (35 votes). Check out past polls.