我从数据库中提取项目(在这种情况下,评论,但它应该适用于任何事情)并提供以下信息:
两种天真的方法似乎是:
第三种方法可能是在顶部突出显示新项目,直到最少数量的观看/投票。
这似乎是一个相当普遍的问题。有没有办法混合上面的一些方法?是否存在进行某种评级衰减的算法?请分享您的想法!
答案 0 :(得分:2)
您可以尝试创建一个指标,该指标将项目的年龄与其收到的投票数相关联,并使用该指标对项目进行排名;也就是说,不能期望新项目有大量的选票,因此它们的新颖性使得它们的权重更高;类似地,具有大量投票的旧项目可以被认为是“受欢迎的”,并且可以具有高排名。您可能希望以对数刻度查看时间,因为收到的投票数会随着时间的推移而“变平”。
通过这种方式,新项目可能排名很高;但是,如果没有多少票,它会在你的列表中随着时间的推移而下降。但如果确实如此,它会上升;但是,只有拥有大量选票的旧项目仍在列表中。
整个主题很复杂;在找到一个适合您需求的算法之前,你可能需要先算一下算法。
答案 1 :(得分:0)
我建议让评分函数依赖于时间 - 例如指数下降。
score = sum(vote.value * exp(-vote.age))
vote.value假定为+1或-1。这将使旧票的影响力下降,并仍然保持相同年龄的选票顺序。如果您没有所有选票的年龄,您可以使用评论的年龄。
此外,您可以添加一个随着投票数增加而下降的值。这将带来很少票的评论到列表的前面。
score = c1 * sum(vote.value * exp(-vote.age)) + c2 * exp(-comment.votes.count)
c1和c2是调整函数的常量。
答案 2 :(得分:0)
按总分排序,并为新项目提供奖励积分。
e.g。
答案 3 :(得分:0)
在我看来,你需要发明一个评分系统,为每个因素赋予权重 - 绝对上升与下降,百分比上升与下降和年龄 - 然后调整权重,直到得到你想要的结果。像
这样的东西得分= ABS_WEIGHT *(up_votes - down_votes)+ PCT_WEIGHT *(up_votes * 100 / down_votes) - AGE_WEIGHT * days_since_created
答案 4 :(得分:0)
我的第一个想法是创建一个混合分数,这样你就可以看到最新和最好的评论。你可能会更好地尝试现实生活中的一些随机参数(例如,尝试在SO的问题列表中使用它们),然后根据第一原则进行设计。
我的第二个想法是有两个部分:前5名+全新 - 第一名。我可以说,你可以改变5成为别的东西,比如2 * sqrt(total_number)。
现在我最好的建议是显示:
这符合直觉:
如您所见,您可以使用向上和向下箭头进行向上/向下投票:)
另外,通过放置来改变这一点 “默认视图 |按投票排序|时间升序|时间降序|海报评级| upvotes | downvotes |”任何“标签某处(我认为这样做很好)。
在我看来,我的解决方案很容易满足#1-#3!