项目排名,使用Reddit排名算法按置信度排序

8

我有兴趣使用这个排名类,它基于Evan Miller的一篇文章,用于对我的表格进行排名,该表格具有赞和踩。我正在为一个活动网站开发与Stack Overflow的点赞/踩系统非常相似的系统,通过使用这个排名类,我感觉结果会更加准确。我的问题是如何按照“热度”函数进行排序?

private function _hotness($upvotes = 0, $downvotes = 0, $posted = 0) {
    $s = $this->_score($upvotes, $downvotes);
    $order = log(max(abs($s), 1), 10);

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

    $seconds = $posted - 1134028003;

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

我想每次用户投票时,我都可以在我的表中添加一列,重新计算新投票的热度数据,并在主页面上按该列排序。但我更有兴趣将此功能与上述函数结合起来实时处理,但我不确定是否可能。
来自Evan Miller的方法:
SELECT widget_id, ((positive + 1.9208) / (positive + negative) - 
                   1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) / 
                          (positive + negative)) / (1 + 3.8416 / (positive + negative)) 
       AS ci_lower_bound FROM widgets WHERE positive + negative > 0 
       ORDER BY ci_lower_bound DESC;

但我不想在SQL中进行这个计算,因为我觉得这样会很混乱,并且如果我在多个页面使用此代码,则难以更改。


看一下这个,可能会对你有所帮助。http://blog.glocal.com/2012/12/tuning-your-own-reddit-style-ranking.html - Grigor
3个回答

3
访问相应的“帖子”表格(阅读、写入、排序、比较等)非常快速,因此依赖数据库是非临时数据存储的“最即时”替代方案(内存/会话仍然更快,但从逻辑上讲,不能用于存储此信息)。
你应该更加关注构建一个能够提供所需结果的良好排名算法(你提出了两种不同的系统,提供不同的结果),并努力使整个代码和代码数据库交互尽可能高效。
原则上,小型迭代简单的命令为这种情况提供了最快最可靠的解决方案。例如:
1. 每次投票时调用排名函数(如您提出的第一个或任何其他基于所需排名规则构建的函数)。它将在“帖子”表格中对应的列中写入(查询越简单越好:您可以创建尽可能复杂的排名系统,但请尽量依赖于PHP而不是查询)。 2. 每当需要比较帖子时,使用简单的SELECT按排名顺序读取“帖子”表格记录(您可以有多个“评估列”(例如,赞成票、反对票、其他考虑因素),但最好只有一个具有最终排名)。

1

你说得对,这样的查询非常混乱且昂贵。

动态混合PHP/MySQL也是个坏主意,因为你必须选择所有帖子的值并计算热度,然后选择最热门的列表。极其昂贵。

你应该考虑将至少部分计算结果保存到数据库中。排序肯定要保存到数据库中。每次显示时计算一次,而不是每次都计算,每次保存/更新时只计算一次总是更好的。尝试对计算排序的节省时间进行基准测试,而不是每次计算热度时都进行计算。好的事情是,排序永远不会改变,除非有人点赞/踩,这些数据你已经保存到数据库中了,标志也是同样的情况。

即使你将标志保存到数据库中,由于发布的时间戳参数,你仍然不能避免实时计算。

我会看看它会产生什么差异以及在哪里产生差异,并仅针对那些关键地方使用CLI脚本每隔x段时间计算一次热度,在影响较小的地方则每隔y段时间计算一次。

采用这种方法,只有在必要时才会重新计算热度。这将使您的应用程序更加高效。


0

我不确定您的数据库和架构是否支持,但您是否考虑编写自定义排序的UDF?

Stackoverflow上的一篇帖子讨论了如何实现这一点在这里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接