用于对投票项目进行分类的技术

时间:2009-06-09 16:47:47

标签: database algorithm language-agnostic sorting

我从数据库中提取项目(在这种情况下,评论,但它应该适用于任何事情)并提供以下信息:

  • 投票数
  • 投票数(因此,总得分和投票数)
  • 项目的创建日期
我有兴趣想出一种方法来对它们进行排序,并考虑以下因素:

  1. “最佳”(评分最高的?)项目应该是第一个
  2. 新建的未被看见或评定的物品不应埋没
  3. 投票数少的项目(与收集的其余部分相比,并非绝对),应该很少(如果有的话)出现在最顶层。

两种天真的方法似乎是:

  • 按项目总分对项目进行排序。这满足上面的1和3,但是失败2,因为新项目将出现在最后并且很少被看到。
  • 按项目的百分比对项目进行排序,为新项目提供一些初始值,使它们靠近前面。这打破3和可能1。

第三种方法可能是在顶部突出显示新项目,直到最少数量的观看/投票。

这似乎是一个相当普遍的问题。有没有办法混合上面的一些方法?是否存在进行某种评级衰减的算法?请分享您的想法!

5 个答案:

答案 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。

  • 不到30分钟,+ 3分
  • 30分钟 - 1小时,+ 2分
  • 1 - 3小时,+ 1点

答案 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)。

现在我最好的建议是显示:

  • 最佳评论
  • 第二名评论
  • 第三名评论
  • [link]“点击查看更多热门评论”
  • [空格]
  • [link]“点击查看更多新评论”
  • 最新评论#10
  • 最新评论#9
  • 最新评论#8
  • 最新评论#7
  • 最新评论#6
  • 最新评论#5
  • 最新评论#4
  • 最新评论#3
  • 最新评论#2
  • 最新评论
  • [添加新评论textarea]

这符合直觉:

  • 你看到的第一件事是最好的,如果不是
  • ,可以向下投票向下
  • 新评论显示在底部,显示在您输入的地方
  • upvotes 总是尝试移动评论
  • 最佳和最新评论不混合
  • 点击[link]插入更多而不修改页面结构

如您所见,您可以使用向上和向下箭头进行向上/向下投票:)

另外,通过放置来改变这一点 “默认视图 |按投票排序|时间升序|时间降序|海报评级| upvotes | downvotes |”任何“标签某处(我认为这样做很好)。

在我看来,我的解决方案很容易满足#1-#3!