如何使威尔逊得分间隔随时间减少

时间:2012-07-27 00:56:53

标签: php mysql algorithm rating-system

所以我正在研究威尔逊的得分间隔来整理我网站上的热门内容,但现在它只是静态的。我的意思是它会一直保持相同的分数,直到有人投票或投票给它。

这就是我想要实现分数随时间减少的原因。喜欢这篇文章。 How Reddit ranking algorithms work。在那篇文章中,他们解释了内容的Reddit得分随着时间的推移而降低。

目前我有这个PHP功能,根据上下投票给我一个分数:

function wilsonScore($up, $down)
{

    $score = (($up + 1.9208) / ($up + $down) - 1.96 * sqrt(($up * $down) / 
             ($up + $down) + 0.9604) / ($up + $down)) / (1 + 3.8416 / ($up + $down)) ;

    return $score;
}

我希望得分相同,但在整理时会在SQL代码中添加一些东西。

SQL代码如下所示:

SELECT *
FROM photos
WHERE   status = 0 
    AND net_votes > 0          // display only picture that got rated over 0
ORDER BY score DESC

我的想法是最终会得到一个会以对数方式降低分数的算法,在发布时间的前1-2-3天不会影响得分,那么分数开始下降

修改

理论上可行的是,在分数中添加一些内容,以便用户在网站上获得的声誉(如SO)越多,他的评分值越高?在互联网上做过类似的事情吗?

这里有人在这里使用过这样的东西吗?

2 个答案:

答案 0 :(得分:2)

您可以在SQL中执行此操作:

$sql = "SELECT  `up`,
                `down`, 
                `date`, 
                (((`up` + 1.9208) / (`up` + `down`) - 1.96 * SQRT((`up` * `down`) / (`up` + `down`) + 0.9604) / (`up` + `down`)) / (1 + 3.8416 / (`up` + `down`))) AS `wilson`, 
                ((((`up` + 1.9208) / (`up` + `down`) - 1.96 * SQRT((`up` * `down`) / (`up` + `down`) + 0.9604) / (`up` + `down`)) / (1 + 3.8416 / (`up` + `down`))) / LN(DATEDIFF(NOW(), `date`) + EXP(1))) AS `weighted_wilson` 

    FROM        `photos`

    ORDER BY    `weighted_wilson` DESC
    ";

使用自然对数衰减(调整为从原始威尔逊分数开始)。显然你可以玩这些值。

您当然可以调整每个用户授予的向上或向下投票数量(即有经验的用户授予更大的上/下移动)。

答案 1 :(得分:0)

基本上,每次调用该函数时,您都会生成该分数,并且每次显示该函数时都会调用该函数?那么我要做的是制作一个得分对象,其中包含反映数据库中某些行的以下成员

$score->id; //int
$score->score; //float
$score->up; //int
$score->down; //int
$score->last_vote; //timestamp

每当有人投票或投票,你就会从那里处理一个新的分数。你不应该在每次有人看到它时重新处理它,除非你想要考虑它。您还可以每天运行一次cron作业,以惩罚长时间未更新的分数。