【问题标题】:How to implement a custom rating system (with a declining date relevance)如何实施自定义评级系统(日期相关性下降)
【发布时间】:2008-12-15 13:35:18
【问题描述】:

在用户可以提交“故事”方面,我正在开发一个类似于 digg 的网站。

我会记录每个项目获得了多少“投票”和“类似添加”。类似的添加被定义为两个用户添加相同的“链接”。

这是算法的部分(本质上是最重要的):

y = day number 
sy = number of adds on day y

∑ y[1:10]  sy / y

所以基本上计算指定日期的“类似添加”的数量,然后除以自发布内容以来的秒数。在过去 10 天内执行此操作(例如)。

但是,我不确定如何实现它以使其表现良好。我能想到的每一种方法都会很慢。

我能想到实现这一点的唯一方法是计算过去 10 天内提交的每个项目的添加数量,这将永远持续下去。 (所以一个按日期分组的 sql 命令在过去 10 天内执行了 10 次 - 显然这种方法很糟糕)。

即使我保留一个每天更新一次的表(并在后台运行上述 sql),一旦数据库变大,它仍然会非常慢。加上评级将“过时”,因为它不是实时的(例如突发新闻“项目”永远不会到达顶部)。

有没有人知道如何做这件事?

【问题讨论】:

  • 你说的是“秒后”,但我在任何地方都没有看到你的公式。是几秒后添加了类似的添加,还是几秒后链接了原始文章?
  • @Tom H.:距离添加原始文章已经几秒钟了。

标签: sql linq algorithm


【解决方案1】:

试试这个:每个人都有一票。你的投票坚持你投票的最后一件事。时间的东西将来自用户行为。

【讨论】:

  • 这是一个有趣的想法。你也可以扩展它。也许给人们 10 票,当他们用完所有票时,他们最老的票会转移到他们投票的最新“故事”。
  • 这将完成计算“投票”的相同任务,但不会优先考虑最近提交的内容。
【解决方案2】:

您可以使用对数加权平均值。这样做的好处是您只需要存储“当前值”和加权平均值。在您的情况下,“当前值”可能是当天的投票数,您可以每晚重新计算加权平均值。

const float WeightFactor = 0.70; //for example
float PreviousAverage = GetPreviousAverage();
float CurrentValue = GetVoteCountToday();

float NewAverage = (WeightFactor * CurrentValue) + ( (1-WeightFactor) * PreviousAverage);

这只有在你有一个以设定频率出现的新值时才真正有效。如果您想在任意时间重新计算您的投票,那么这是行不通的。

【讨论】:

    【解决方案3】:

    不需要执行 10 次 SQL 即可获得结果,您可以在一次执行中获得结果,如下所示:

    select sum(dayval)
    from
    ( select count(*) / (current_date-day+1) dayval
      from votes
      where story_id = 123
      and day >= current_date - 9
      group by (current_date-day+1)
    )
    

    (实际代码因使用的 DBMS 而异)。

    我并不是说这会表现良好!

    也许是一种折衷方案:在每日批处理过程中计算并存储“一天的开始”值,然后为一天中收到的每张选票将存储值加 1?

    【讨论】:

    • 你说得对,我忘了我可以在一个声明中做到这一点。但它仍然会很慢。我想知道具有复杂算法的网站如何处理这些问题。
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2014-06-23
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多