阅读更多

9顶
0踩

行业应用

转载新闻 Reddit 排名算法工作原理

2013-08-27 14:08 by 副主编 WnouM 评论(1) 有8977人浏览



Reddit是个社交新闻站点,其口号是“提前于新闻发生,来自互联网的声音”。用户(也叫redditors)能够浏览并且可以提交互联网上内容的链接或发布自己的原创帖子。其他的用户可对发布的链接进行高分或低分的投票,得分突出的链接会被放到首页。另外,用户可对发布的链接进行评论以及回复其他评论者。

本文将跟大家探讨一下Reddit的文章排名算法和评论排名算法的工作原理。Reddit使用的算法也是很简单,容易理解和实现。这篇文章里我将会对其进行深入分析。

首先我们关注的是文章排名算法。第二部分将重点介绍评论排名算法,Reddit的评论排名跟文章排名使用的不是同一种算法(这点跟Hacker News不一样),Reddit的评论排名算法非常有趣,它是由xkcd的作者Randall Munroe发明的。

深入研究文章排名算法代码

Reddit的源代码是开源的,你可以下载它的任意代码。它是用Python写成的,代码放在这里。里面的排名算法部分是用Pyrex实现的,这是一种开发Python的C语言扩展的编程语言。这里用Pyrex主要是出于速度的考虑。我用纯Python重写了他们的Pyrex实现,这样更容易阅读。

Reddit缺省的排名是“热门”排名,实现代码如下:

#Rewritten code from /r2/r2/lib/db/_sorts.pyx

from datetime import datetime, timedelta
from math import log

epoch = datetime(1970, 1, 1)

def epoch_seconds(date):
    """Returns the number of seconds from the epoch to date."""
    td = date - epoch
    return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)

def score(ups, downs):
    return ups - downs

def hot(ups, downs, date):
    """The hot formula. Should match the equivalent function in postgres."""
    s = score(ups, downs)
    order = log(max(abs(s), 1), 10)
    sign = 1 if s > 0 else -1 if s < 0 else 0
    seconds = epoch_seconds(date) - 1134028003
return round(order + sign * seconds / 45000, 7)


这个“热门“排名算法用数学公式表达是下面这个样子(我从SEOmoz找到了它,但我怀疑他们未必是原作者):



文章提交时间对排名的影响

文章提交时间对排名的影响可以总结为以下几点:

  • 提交时间对排名影响巨大,越新的文章排名会越高
  • 文章排名得分不会随时间的流逝而降低,但新文章会比老文章获得更高的分。这跟Hacker News的排名算法有很大区别,它的得分会随时间流逝而降低。
下面是一个图片,表现的是具有相同支持和反对的票数,但时间不同的文章的排名得分情况:



对数加强

Reddit在‘热门’排名中使用了对数函数来强化前几票的份量。基本是这个原理:

  • 前10个赞成票的份量和后面100个的份量,以及再后面1000票的份量是相同的,以此类推
下面是效果图:



如果不使用对数加强,则分数会是这样:



反对票对排名的影响

Reddit是少数几个能投反对票的网站之一。就像你从代码里看到的,一篇文章的的’得分‘定义如下:

  • up_votes – down_votes
这就是说,我们可以把它表现为下图:



这种计算方式会对既有很的赞成票,又有很多反对票的文章(比如很有争议的文章)带来重大影响,它们可能会比那些只有很少赞成票的文章获得更低的分数。这也就说明了为什么小猫小狗之类的帖子(以及其它无争议的文章)会获得如此高的评分。

对Reddit文章排名算法的总结

  • 提交时间是一项非常重要的指标,新文章比老文章得分更高
  • 头10个赞成票的份量和后100个的份量相同。获得10个赞成票和获得50个赞成票的排名很接近
  • 具有相近赞成票和反对票数的有争议文章会比只获得赞成票的排名低。
Reddit评论排名算法工作原理

xkcd网站的Randall Munroe是Reddit网站上的‘最佳文章’排名算法的发明者。他写了一篇很好的文章来解释它。

你应该读一读这篇文章,它以很通俗的语言解释了这个算法。这篇的文章的重点是:

  • ‘热门‘排名算法对评论进行排名不是很有效,它会显得对早期的评论过于偏爱。
  • 在一个评论系统中,我们的目的是找出最佳评论,不论它是什么时间提交的。
  • 1927年Edwin B. Wilson找到了一种很好的算法,被叫做”Wilson score interval”,它可以被用于“信任排序(the confidence sort)”
  • 信任排序把文章的获得的票数当作全体读者的一个抽样统计——就像一次民意测验。
  • 《How Not To Sort By Average Rating》这篇文章对这种信任评级算法做了详细的解释,绝对值得一读!
深入分析评论排序代码

Reddit里的信任排序算法是在_sorts.pyx这个文件里实现的,我用纯Python重写了它们的Pyrex实现(同时去掉了其中的缓存优化代码):

#Rewritten code from /r2/r2/lib/db/_sorts.pyx

from math import sqrt

def _confidence(ups, downs):
    n = ups + downs

    if n == 0:
        return 0

    z = 1.0 #1.0 = 85%, 1.6 = 95%
    phat = float(ups) / n
    return sqrt(phat+z*z/(2*n)-z*((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)

def confidence(ups, downs):
    if ups + downs == 0:
        return 0
    else:
        return _confidence(ups, downs)


信任排序使用Wilson score interval算法,它的数学表达式是这样的:



在上面的公式中,各个参数的定义如下:

  • p是支持票的百分比
  • n总票数
  • zα/2是正态分布(1-α/2)分位数
我们对上面的介绍做一些总结:

  • 信任排序是把票数看作一次全体读者的抽样调查
  • 信任排序会给一条评论一个临时评级,认为它有85%的可信度
  • 票数越多,可信度越高
  • Wilson’s interval算法能很好的处理票数很少和低端概率情况
Randall在他的文章里对信任排序的工作原理给了一个很好的例子:

如果一条评论只有一个赞成票和0个反对票,它有100%的支持率,但因为投票数太少,系统将会把它放在排名底部。但如果它有10个赞成票,而其只有1个反对票,那系统将会把它放到比具有40个赞成票和20个反对票的评论更高的排名上——可以推断出,当这个评论获得40个赞成票时,它极有可能获得的反对票会少于20。这种算法最好的部分是,如果推断错了,那它会很快的获得更多的数据来证明,因为它已经被排到了顶部。

发表时间对排名的影响:没有!

信任排序一个优点是评论发表时间是不产生影响作用的(这跟‘热门排序’和Hacker News的排名算法是不一样的)。评论是通过信任评级,通过数据取样计算,一条评论获得的票数越多,它能获得的评级越接近他的真实的得分。

图表视图

让我们把信任排序做成图表,看一看它是如何影响评论排序的。我们使用Randall的例子:



可以看到,信任排序并不在意一条评论获得了多少票数,它关注的是它的支持率和数据采样规模!

排序之外的应用

正像Evan Miller所说的,Wilson’s score interval算法可以在非排名应用里使用,他列举了3个例子:

  • 检查垃圾信息:看过这条信息的人中有多大比例认为它是垃圾信息?
  • 制作“最优”排名:看过这条信息的人中有多大比例认为它是“最好的….”?
  • 制作“邮件转发”排名:看过条信息这的人中有多大比例点击了‘Email’按钮?
使用这个算法你只需要两个数据:

  • 取样总数
  • 支持数
这个算法是如此有效,但很奇怪很多的网站如今仍然是最原始的评级方法,这包括著名的亚马逊,它仍然使用“得分 = 支持票 / 总票数”。

英文原文:How Reddit ranking algorithms work / 译:外刊IT评论
  • 大小: 7 KB
  • 大小: 18.3 KB
  • 大小: 3.8 KB
  • 大小: 3.9 KB
  • 大小: 4 KB
  • 大小: 3.1 KB
  • 大小: 1.4 KB
  • 大小: 2.6 KB
来自: 外刊IT评论
9
0
评论 共 1 条 请登录后发表评论
1 楼 dohkoos 2014-04-04 22:54
xkcd网站的Randall Munroe是Reddit网站上的‘最佳文章’排名算法的发明者。

明显不是发明者啊,只是推荐了该算法而已。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 零基础数据分析的我用了半年时间利用信用卡交易数据建模协助警方破获电信诈骗集团

    五年前,我离开了国企工厂的安乐窝,借一个偶然的机会进入了天津唯一的第三方支付公司中汇支付。这是我职业生涯中跨度最大的转变之一。说实话这个跨度挺大的,以后我每次的换工作行业、领域跨度都很大。​@[TOC]

  • 新人怎么入门游戏建模?从哪一个软件开始学习?

    入门游戏建模,从零基础变成有基础:包括美术基础,软件基础(3Dmax,ZBrush,PS) 主要包括:3Dmax基础、UV拆分和摆放、贴图绘制基础。 (1)底模软件(3dmax或Maya) 你可以从基础的3D建模软件学起了,它可以是3D...

  • 学习游戏3D建模电脑推荐,入门级应该怎么学才能做出好看的模型?

    一 学3D建模 电脑配置需要高配还是低配? 这个必须是高配,低配你电脑卡的就直接就跑不动了,你平时用的那种一般的电脑,顶多算个小...这绝对是全B站最用心(没有之一)的建模电脑配置讲解!_哔哩哔哩_bilibilihttps:

  • 游戏3D建模要美术基础吗?

    关于3D建模软件有哪些,这个问题,我在下面会详细的讲解,一堆,会看的你眼疼,这个问题不着急,淡定。首先我需要讲的是跳出软件这个层面来理解软件,放大我们的格局来学习软件,只有理解了更大的层面,才能更好的去...

  • 数据中台和ERP是啥关系?不都是信息系统吗? by彭文华

    这是彭文华的第142篇原创最近感觉选题进入平台期了,急需各位同学骚扰聊天,好激发我的灵感。啥问题都行,我不挑的,啥事都能聊。还好,昨天朋友老赵就问我一个问题,然后我给他说了半个小时,要不我...

  • 我用python写了一套股票万金油,回报小雪下面给我吃

    回复“pythonpdf“,立刻领取100本全品类Python电子书2020年春。H江畔的L地段,是众多跨国银行的Z区及Y洲总部所在地,Z国最具影响力的金融中心之一。受全球疫情影响,今年...

  • 4米乘以12米CAD图_这篇文章解决了我多年CAD制图比例问题!

    设计院来了个年轻人——如果跟着我每一步都做完之后,你还不懂CAD制图比例,那你就过来掐死我吧——谨以此文送给刚刚毕业的学生朋友们!——我多么希望我刚毕业的时候能够看到这么一篇攻略!!!恨不能把这个给十年...

  • 小白学习3D游戏建模从什么软件开始?人物角色建模怎么做?

    一 建模软件多如牛毛,要么不学,要么就学主流,非主流一边凉快去吧。 关于3D建模软件有很多,都了解,都学没什么意义,最后只会犯选择困难症,把在社会上应用最普遍的,最主流的学会,就能很好的在3D建模这个行业混...

  • 3D游戏建模需要学会哪些软件?想入行游戏建模的你都学习了吗?

    一、次世代的制作流程: 1、根据二维原画设定制作中模; 2、导进ZB进行高模雕刻; 3、拓补低模(即在游戏中的模型); 4、展分UV; 5、烘焙(将高模细节烘焙到低模上面); 6、绘制贴图; 7、引擎中调整。 ...

  • 3D人物建模需要哪些软件?资深大牛全方位从入门到实战解析

    maya游戏模型制作是指:maya游戏模型制作师根据原画师提供的原画稿件,制作出游戏中的环境、机械、道具、人物、动物、怪物等模型,分为maya游戏角色模型制作和maya游戏场景模型制作。 Autodesk Maya用于不少的动画...

  • 我用python写了一套股票万金油,回报小雪下面给我吃!

    2020年春。 H江畔的L地段,是众多跨国银行的Z区及Y洲总部所在地,Z国最具影响力的金融中心之...其中一扇不起眼的窗户,19寸电脑显示屏上,红绿的代码焦急的闪烁着。屏幕前,是一位妙龄少女,居家的粉红暖靴,玉腿颀长

  • 大疆RoboMaster技术总监:我是如何成为一名机器人工程师的

    作者 | 大疆创新RoboMaster技术总监YY硕▌前言很多朋友私信问我对机器人和人工智能感兴趣,该怎么展开学习。最近稍微有点空,我写写我的看法。两年前,我在知乎回答如...

  • Flexsim项目:××便利贴供应链建模与仿真设计

    本课程设计旨在通过学习FlexSim仿真软件,应用理论知识解决生产物流问题。以××便利贴的部件入库和组装出库为案例,通过模拟发现问题,减少浪费,提高运营效率。流程涵盖材料处理、染色、组装、质检等环节,使用...

  • 国内有高仿的Chat GPT4吗?可以直接中文提问,回答质量也不错的AI软件。这些完全可以替代

    从去年 12 月份开始一直到现在,ChatGPT 发展非常迅猛,但国内的大厂也没闲着,好用的AI工具此起彼伏,不少AI工具支持提问且回答质量真的蛮不错的,只要你可以用好它,不开玩笑的说,你的学习工作效率直接翻倍。...

  • 大疆技术总监:如何用六年成为一个全能的机器人工程师(转载)

    (机器人学的核心问题是做好和物理世界的交互。现在主流的机器人学分支里,处理与物理世界的交互的学科分为三类:传感器和处理算法;多刚体系统动力学控制;机器人自主移动。)

  • 基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip

    基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip

  • Linux课程设计.doc

    Linux课程设计.doc

  • 课程考试的概要介绍与分析

    课程考试资源描述 本资源是为应对各类课程考试而精心准备的综合性学习包。它包含了多门学科的考试指南、历年真题、模拟试题以及详细的答案解析。这些资源旨在帮助学生系统复习课程内容,理解考试要点,提高解题技巧,从而在考试中取得优异成绩。 资源中不仅包含了基础的考试资料,还特别加入了考试技巧讲解和备考策略分析。学生可以通过这些资源了解不同题型的解题方法和思路,学会如何在有限的时间内高效答题。此外,还有针对弱项科目和难点的专项训练,帮助学生攻克学习瓶颈。 为了确保资源的时效性和准确性,我们会定期更新考试资料和模拟试题,及时反映最新的考试动态和趋势。同时,也提供了在线交流平台,方便学生之间互相讨论、分享学习心得。 项目源码示例(简化版,Python) 以下是一个简单的Python脚本示例,用于生成包含选择题和答案的模拟试题: python import random # 定义选择题题库 questions = [ {"question": "Python的创始人是谁?", "options": ["A. 林纳斯·托瓦兹", "B. 巴纳姆", "C. 比尔·盖茨", "D.

  • 基于Django的食堂点餐系统

    基于 MySQL+Django 实现校园食堂点餐系统。 主要环境: PowerDesigner MySQL Workbench 8.0 CE Python 3.8 Django 3.2.8 BootStrap 3.3.7 Django-simpleui

  • 基于SpringBoot的同城宠物照看系统源码数据库文档.zip

    基于SpringBoot的同城宠物照看系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics