10

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

这就是为什么我想实现分数随时间降低的原因。就像在这篇文章中一样。Reddit 排名算法如何工作。在那篇文章中,他们解释了 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)越多,他的评分就越值得?互联网上是否已经存在类似的东西?

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

4

2 回答 2

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
    ";

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

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

于 2012-08-07T20:59:04.367 回答
0

所以本质上,每次调用该函数时您都会生成该分数,并且每次显示该函数时都调用该函数?那么我要做的是用以下成员创建一个分数对象,这些成员反映了数据库中的一些行

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

每次有人投赞成票或反对票时,您都会从那里处理一个新分数。每次有人查看它时,您都不必重新处理它,除非您也想考虑这一点。您还可以每天运行一次 cron 作业来惩罚长时间未更新的分数。

于 2012-08-07T20:53:06.670 回答