I'm currently ranking videos on a website using a bayesian ranking algorithm, each video has:
likes
dislikes
views
upload_date
Anyone can like
or dislike
a video, a video is always views + 1
when viewed and all videos have a unique upload_date
.
Data Structure
The data is in the following format:
| id | title | likes | dislikes | views | upload_date |
|------|-----------|---------|------------|---------|---------------|
| 1 | Funny Cat | 9 | 2 | 18 | 2014-04-01 |
| 2 | Silly Dog | 9 | 2 | 500 | 2014-04-06 |
| 3 | Epic Fail | 100 | 0 | 200 | 2014-04-07 |
| 4 | Duck Song | 0 | 10000 | 10000 | 2014-04-08 |
| 5 | Trololool | 25 | 30 | 5000 | 2014-04-09 |
Current Weighted Ranking
The following weighted ratio algorithm is used to rank and sort the videos so that the best rated are shown first.
This algorithm takes into account the bayesian average to give a better overall ranking.
Weighted Rating (WR) = ((AV * AR) + (V * R))) / (AV + V)
AV = Average number of total votes
AR = Average rating
V = This items number of combined (likes + dislikes)
R = This items current rating (likes - dislikes)
Example current MySQL Query
SELECT id, title, (((avg_vote * avg_rating) + ((likes + dislikes) * (likes / dislikes)) ) / (avg_vote + (likes + dislikes))) AS score
FROM video
INNER JOIN (SELECT ((SUM(likes) + SUM(dislikes)) / COUNT(id)) AS avg_vote FROM video) AS t1
INNER JOIN (SELECT ((SUM(likes) - SUM(dislikes)) / COUNT(id)) AS avg_rating FROM video) AS t2
ORDER BY score DESC
LIMIT 10
Note: views
and upload_date
are not factored in.
The Issue
The ranking currently works well but it seems we are not making full use of all the data at our disposal.
Having likes
, dislikes
, views
and an upload_date
but only using two seems a waste because the views
and upload_date
are not factored in to account how much weight each like
/ dislike
should have.
For example in the Data Structure table above, items 1
and 2
both have the same amount of likes
/ dislikes
however item 2
was uploaded more recently so it's average daily views are higher.
Since item 2
has more likes and dislikes in a shorter time than those likes
/ dislikes
should surely be weighted stronger?
New Algorithm Result
Ideally the new algorithm with views
and upload_date
factored in would sort the data into the following result:
Note: avg_views
would equal (views / days_since_upload)
| id | title | likes | dislikes | views | upload_date | avg_views |
|------|-----------|---------|------------|---------|---------------|-------------|
| 3 | Epic Fail | 100 | 0 | 200 | 2014-04-07 | 67 |
| 2 | Silly Dog | 9 | 2 | 500 | 2014-04-06 | 125 |
| 1 | Funny Cat | 9 | 2 | 18 | 2014-04-01 | 2 |
| 5 | Trololool | 25 | 30 | 5000 | 2014-04-09 | 5000 |
| 4 | Duck Song | 0 | 10000 | 10000 | 2014-04-08 | 5000 |
The above is a simple representation, with more data it gets a lot more complex.
The question
So to summarise, my question is how can I factor views
and upload_date
into my current ranking algorithm in a style to improve the way that videos are ranked?
I think the above example by calculating the avg_views
is a good way to go but where should I then add that into the ranking algorithm that I have?
It's possible that better ranking algorithms may exist, if this is the case then please provide an example of a different algorithm that I could use and state the benefits of using it.