对于今年的学生会,我在“歌曲”委员会,我们挑选歌曲。不幸的是,舞蹈中的孩子总是讨厌一些愚蠢的歌曲选择。我想我今年可能会有所不同。上周四,我创建了一个简单的PHP应用程序,以便孩子们可以将歌曲提交到数据库中,提供歌曲名称,艺术家和流派(来自下拉列表)。我还实现了类似于Reddit的投票功能。单击一个upvote按钮,您已经对该歌曲进行了投票,增加了upvote计数。与downvotes相同。
Anywho,在数据库中,我有三个信息,我认为我可以使用它来评价这些歌曲,upvotes,downvotes和时间戳。有一段时间,排名是通过简单地将具有较高“投票”计数的歌曲放在顶部而创建的。也就是说,更多的投票,更少的downvotes(upvotes - downvotes)将位于列表的顶部。这种情况有一段时间了,但截至周日列表中大约有75首歌曲,而首先提交的歌曲只是在列表的顶部。
周日,我将等级算法更改为(upvotes - downvotes)/(CurrentTimestamp - CreationTimestamp),也就是说,在较短的时间内投票计数越高,歌曲在列表中的排名就越高。这样做更好,但仍然不是我喜欢它。
现在发生的事情是,一首歌创建并投票到1的投票数,它最终会在某个地方的列表顶部。有负面投票计数的歌曲不经常被看到,因为孩子通常不会滚动到底部。
我想我可以对数据进行排序,以便较低的歌曲显示在顶部,因此人们不得不看到较低的歌曲。老实说,我以前从未尝试过“流行度”算法,所以,你有什么看法?
网站位于http://www.songs.taphappysoftware.com - 我不知道是否应该将此放在这里,可能会在舞会上引起一些不受欢迎的歌曲:0
答案 0 :(得分:6)
这是一个非常好的问题。这里有一些类似的问题。
This article可能是个好地方。显然,upvotes减去downvotes是一个不好的方法。更好的方法是使用complicated maths为每个分配一个分数并按其排序。
以下是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%的几率, 等
作为可用性的东西,我会按分数对数据进行排序,但我不会向用户显示分数。我只会显示upvotes和downvotes的数量。
答案 1 :(得分:0)
如何通过发布时间或投票数(负+正)来排序歌曲?如果你的目标是让每首歌都能得到同等的关注,这听起来就足够了。