【问题标题】:PHP Reddit Ranking Algorithm - Calculate RankPHP Reddit 排名算法 - 计算排名
【发布时间】:2015-04-15 10:36:22
【问题描述】:

我正在开发一个讨论板,它根据热度/排名列出所有主题(如 reddit)。所以我采用了reddits算法并开始尝试。我用了这个例子:http://blog.sodhanalibrary.com/2014/04/reddit-ranking-algorithm-implementation.html

function score($ups,$downs){
    return $ups - $downs;
}

function epoch_seconds($timestamp){
    $epoch = new DateTime("1970-01-01 00:00:00");
    $unix = new DateTime($timestamp);
    $td = $epoch->diff($unix);

    $days = $td->format('%a');
    $hours = $td->format('%h');
    $minutes = $td->format('%i');
    $seconds = $td->format('%s');
    $age = ($days * 86400) + ($hours * 3600) + ($minutes * 60) + $seconds;

    return $age;
}

function calculateRank($ups,$downs,$date){
    $s = score($ups,$downs);
    $order = log10(max(abs($s), 1), 10); 

    if($s > 0) {
        $sign = 1;
    } elseif($s < 0) {
        $sign = -1;
    } else {
        $sign = 0;
    }

    $seconds = epoch_seconds($date) - 1134028003;

    return round($order + (($sign * $seconds)/45000), 7);
}

例子:

echo calculateRank(1,0,"2015-02-14 12:00:00"); // = 6441.9377111

我不明白的是,如果分数(赞成票和反对票之间的差异)为 0,则排名为 0。这意味着,带有 +1/-1 的全新文章将名列涅槃。

echo calculateRank(1,1,"2015-02-14 12:00:00"); // = 0

此外,如果分数为负数,则排名为负数。这意味着具有 +1/-2 的全新文章的排名会比必杀技更远。

echo calculateRank(1,2,"2015-02-14 12:00:00"); // = -6441.9377111

选择查询看起来像这样:

SELECT * FROM articles ORDER BY rank DESC 

根据我向您展示的结果,这意味着一篇 10 年前的文章得分为正(例如:1 次赞成 / 0 次反对)的排名会更高,然后是每篇得分为 0 或负面的文章分数,无论日期。这不可能是正确的,让我感到困惑。

我正在寻找的是类似的东西。我已经通过不允许分数为 0 来摆脱零排名。但是,负分数(例如:0 赞成 / 2 反对)应该降低分数而不是倒置分数。

非常感谢任何帮助! 谢谢。

【问题讨论】:

  • 看过文章such as this one试图解释排名方法?如果是这样,我相信你的问题很适合CodeReview(尽管代码看起来不错,尽管DateTime 已经实现了getTimestamp())或Mathematics(要知道只是因为数字很高,它们不是涅槃附近)
  • 问题是,即使是 10 年前的文章,其排名也会高于其他所有得分为 0 或负分的文章。这让我感到困惑,因为这不可能是正确的。
  • @kingkero - 这个问题不要求进行代码审查,并且会在那里作为题外话关闭。这个问题是在问“这个排名算法如何处理新帖子?”,而不是“我的代码看起来不错并遵循最佳实践吗?”。
  • @user3614800 您需要评估这是否符合您的需求。 Reddit 有很多帖子出现,因此他们更重视最近的帖子。从 SO 经验来看,如果分数为负数,则通常不值得一读

标签: php mysql algorithm ranking reddit


【解决方案1】:

我根据自己的需要调整了算法。 我想出了以下几点:

if($score >= 0) {
    $sign = 1;
} elseif($score < 0) {
    $sign = -1;
}
return round( ($sign * $order) + ($seconds / 45000) , 7);

这样,负分的文章只会降低排名而不是倒置排名。 (例如,-1 分的惩罚不应该是:“去涅槃!”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2011-06-18
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多