Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

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)

In reply to Re: More useful "best" and "worst" nodes display by hossman
in thread More useful "best" and "worst" nodes display by deprecated

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?

What's my password?
Create A New User
Domain Nodelet?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (4)
As of 2023-05-30 18:42 GMT
Find Nodes?
    Voting Booth?

    No recent polls found