按热度对歌曲列表进行排序

9
今年我参加学生会,负责“歌曲”委员会,我们挑选歌曲。不幸的是,跳舞派对上的孩子们总会讨厌一些愚蠢的歌曲选择。我想今年能够做出不同的改变。上周四,我创建了一个简单的PHP应用程序,以便孩子们可以将歌曲提交到数据库中,提供歌曲名称,艺术家和流派(从下拉列表中选择)。我还实现了类似于Reddit的投票功能。点击点赞按钮,您就点赞了该歌曲,并增加了点赞计数。反之亦然。
无论如何,在数据库中,我有三个信息片段,我认为可以用来评估这些歌曲:点赞数,反对数和时间戳。有一段时间,排名是通过简单地将具有更高“投票”计数的歌曲排在前面来创建的。也就是说,赞成票多,反对票少(赞成票-反对票)将位于列表的顶部。那运作得很好,但到周日,列表上有大约75首歌,最先提交的歌曲仍然位于列表的顶部。
周日,我将排名算法更改为(赞成票数-反对票数)/(当前时间戳-创建时间戳),也就是说,投票数量越高,时间越短,该歌曲就会在列表中排名更高。这样做效果更好,但仍不如我所期望的那样。
现在发生的情况是,一首歌曲被创建并得到1个赞成票数时,它将出现在列表的顶部某个位置。反对票数为负数的歌曲很少被查看,因为孩子们通常不会滚动到列表底部。
我想我可以排序数据,以便较低的歌曲出现在顶部,这样人们就必须看到较低的歌曲。老实说,我从未必须处理过“流行度”算法,所以,您有什么想法吗?
网站位于http://www.songs.taphappysoftware.com- 我不知道是否应该在这里放置它,可能会导致派对上播放一些不受欢迎的歌曲:0

我认为算法没问题,问题在于用户界面。有关一首歌曲的信息太多了,很多都是不必要的。为什么不只是把排名放在前面,然后在旁边加上一个+和-符号呢?用瓷砖视图(flikr)展示它们。这样,你可以展示更多的歌曲而无需滚动。你还可以将标题和说明框变小,并给它们一个更引人注目的颜色来弥补其大小。 - gianebao
1
我改正我的说法。@David Johnstone的排名算法更好。 - gianebao
不要相信算法。使用您自己的品味(毕竟您是歌曲委员会的一员)。或者雇用一位DJ。电台上已经有足够多的计算机生成的播放列表了。 - Thilo
好的,音乐委员会有约8名学生,代表大约1600名学生的高中。我正在Stack-Overflow上发布,显然我不是一个很好的舞者,我的音乐品味可能不能代表整个学校。- 我们在学校周围张贴广告,宣传网站,并将于接下来的两个星期五播放视频公告。该网站只是为了更好地了解人们的需求,这样委员会就不会完全盲目行事。 - Matt Egan
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%,以此类推。

作为可用性考虑,我会按得分对数据进行排序,但不会向用户显示分数,只会显示赞和踩的数量。


我/他应该使用什么来表示power?我并不完全确定它的意思。 - Justin L.
啊,我正在阅读关于牛顿冷却定律的文章,我记得明年会涉及到这个。这似乎是一个不错的实现方式,比威尔逊得分区间要少一些计算量。对于牛顿冷却,有一个问题,如果点赞过程会增加歌曲的“温度”,那么反对票是否应该降低温度(我想通过较小的数量来权衡点赞)? - Matt Egan
@Matt Egan:指数衰减“热度”算法肯定比威尔逊得分方法简单,尽管它们执行不同的任务。最终,您仍需要确定每首歌曲有多好(公平起见,您不需要计算机来解决此问题)。实施起来不应该太难,特别是如果您像Ruby示例中那样拥有统计软件包。关于取消投票和温度:我自己也在考虑这个问题,我认为它们都应该增加“热度”(也许赞成票+10,反对票+5?) - David Johnstone
@Matt Egan:我认为“热度”应该是人们如何积极地与它进行交互的度量,而不是衡量其有多好。但这取决于你希望它如何行动。例如,如果很多人都投赞成票,你想发生什么?或者很多人都投反对票呢?或者半数投赞成?或者75%赞成?还是75%反对?由你决定 :-) 无论哪种方式,你现在都可以实现它,并根据需要调整数字。 - David Johnstone
顺便说一下,这里有一个PHP实现(包括Ruby的Statistics2.pnormaldist实现):http://www.derivante.com/2009/09/01/php-content-rating-confidence/ @Matt Egan - David Johnstone
显示剩余17条评论

0

按发布时间或投票数(负面+正面)排序歌曲怎么样?如果你的目标是给每首歌平等的关注,这听起来足够好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接