1

我想为网页中的新闻实施排名系统。

我需要以下方面的指导:

  • 我的做法。这是对的吗?这是疯狂/愚蠢吗?
  • 如果是正确的,就其实施。

相关信息:

  • 我正在使用带有代码点火器的 PHP、MYSQL。
  • 用户可以对网页新闻进行up_vote 和down_vote。
  • 新闻将按其“Wilson 评分区间”进行排名,并稍作修改:
    • 时间引力(最新消息可能最先出现)。
    • 然而,时间衰减将在 48 小时后停止(新闻的重力效应在 48 小时后将相同)。

方法 我想通过 Mysql 做所有事情:

  • 我会将时间引力威尔逊分数(TGWS)——在gravityRating 函数中获得的分数——存储到news_table 中。
  • 我会创建一个触发器。我会重新计算新行的 TGWS 被向上/向下投票。
  • 我会创建一个事件。每 30 分钟它会更新过去 48 小时内发布的新闻的 TGWS。(48 小时后,在投票发出之前分数不会改变,因此不需要重新计算超过 48 小时的新闻)。

是否有意义?

实施 确定。我知道 PHP 中的代码(见下文)。但是我如何将 Wilson Score 代码移植到 Mysql?那有可能吗?它已经在某个地方完成了吗?我已经在 Mysql 中创建了触发器、函数、事件和过程,但是我不知道如何移植这个。

谢谢!

<?php

class Rating
{
  public static function ratingAverage($positive, $total, $power = '0.05')
  {
    if ($total == 0)
      return 0;

    $z = Rating::pnormaldist(1-$power/2,0,1);
    $p = 1.0 * $positive / $total;
    $s = ($p + $z*$z/(2*$total) - $z * sqrt(($p*(1-$p)+$z*$z/(4*$total))/$total))/(1+$z*$z/$total);
    return $s;
  } 

  public static function pnormaldist($qn)
  {
    $b = array(
      1.570796288, 0.03706987906, -0.8364353589e-3,
      -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5,
      -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8,
      0.3657763036e-10, 0.6936233982e-12);

    if ($qn < 0.0 || 1.0 < $qn)
      return 0.0;

    if ($qn == 0.5)
      return 0.0;

    $w1 = $qn;

    if ($qn > 0.5)
      $w1 = 1.0 - $w1;

    $w3 = - log(4.0 * $w1 * (1.0 - $w1));
    $w1 = $b[0];

    for ($i = 1;$i <= 10; $i++)
      $w1 += $b[$i] * pow($w3,$i);

    if ($qn > 0.5)
      return sqrt($w1 * $w3);

    return - sqrt($w1 * $w3);
  }

    public static function gravityRating($positive, $total, $time, $power = '0.05')
  {
    if ($total == 0)
      return 0;
    return (Rating::ratingAverage($positive, $total, $power) / pow($time,0.5)); //para reducir el valor del tiempo solo dividir time por algo.
  }
}
4

1 回答 1

0

我认为你的问题没有任何意义。实际上没有时间引力之类的东西,而且如果您只想显示最新消息,您可以对新闻进行排序。威尔逊间隔与时间无关,因此每 30 分钟计算一次威尔逊间隔也不会改变任何东西,这也是事实。

于 2012-02-28T09:28:44.877 回答