9

今年学生会,我是“歌曲”委员会的,我们挑选歌曲。不幸的是,舞会上的孩子们总是讨厌一些愚蠢的歌曲选择。我想今年我可以让它变得不一样。上周四,我创建了一个简单的 PHP 应用程序,这样孩子们就可以将歌曲提交到数据库中,提供歌曲名称、艺术家和流派(从下拉列表中)。我还实现了类似于 Reddit 的投票功能。点击一个upvote按钮,你已经为这首歌投票,增加了upvote计数。与否决票相同。

任何人,在数据库中,我有三个信息,我认为我可以用来对这些歌曲进行评分,赞成票,反对票和时间戳。有一段时间,排名是通过简单地将“票数”较高的歌曲放在顶部来创建的。也就是说,赞成票越多,反对票越少(赞成票 - 反对票)将位于列表顶部。这在一段时间内奏效了,但到周日为止,列表中大约有 75 首歌曲,而最先提交的歌曲只是在列表的顶部。

周日,我将排名算法更改为 (upvotes - downvotes) / (CurrentTimestamp - CreationTimestamp),也就是说,在更短的时间内投票数越高,歌曲在列表中的排名就越高。这工作,更好,但仍然不是我想要的。

现在发生的情况是,一首歌曲被创建并被投票支持为 1 的那一刻,它最终在某个地方的列表顶部。由于孩子通常不会滚动到底部,因此不会经常查看投票数为负数的歌曲。

我想我可以对数据进行排序,使较低的歌曲出现在顶部,因此人们被迫看到较低的歌曲。老实说,我以前从来没有研究过“流行”算法,那么,你的想法是什么?

网站在http://www.songs.taphappysoftware.com - 我不知道我是否应该把它放在这里,可能会在舞会上导致一些不需要的歌曲:0

4

2 回答 2

6

这是一个非常好的问题。这里有几个类似的问题。

这篇文章可能是一个很好的起点。显然,赞成票减去反对票是一种不好的方法。更好的方法是使用复杂的数学为每个分数分配一个分数并按此排序。

这是文章中的 Ruby 评分函数:

require 'statistics2'

def ci_lower_bound(pos, n, power)
    if n == 0
        return 0
    end
    z = Statistics2.pnormaldist(1-power/2)
    phat = 1.0*pos/n
    (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
end

pos是正面评分的数量,n是评分的总数,power是指统计功效:选择 0.10 表示您的下限正确的可能性为 95%,选择 0.05 表示您的下限正确的可能性为 97.5%,等等。

作为可用性的事情,我会按分数对数据进行排序,但我不会向用户显示分数。我只会显示赞成票和反对票的数量。

于 2010-09-14T01:23:20.203 回答
0

按发布时间或投票数(负+正)对歌曲进行排序如何?如果您的目标是对每首歌曲给予同等重视,这听起来就足够了。

于 2010-09-14T01:24:54.683 回答