所以我正在研究威尔逊的得分间隔来整理我网站上的热门内容,但现在它只是静态的。我的意思是它会一直保持相同的分数,直到有人投票或投票给它。
这就是我想要实现分数随时间减少的原因。喜欢这篇文章。 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)越多,他的评分值越高?在互联网上做过类似的事情吗?
这里有人在这里使用过这样的东西吗?
答案 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作业,以惩罚长时间未更新的分数。