`
wbj0110
  • 浏览: 1599279 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多

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

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

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

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

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

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

Python代码 
  1. #Rewritten code from /r2/r2/lib/db/_sorts.pyx  
  2.   
  3. from datetime import datetime, timedelta  
  4. from math import log  
  5.   
  6. epoch = datetime(197011)  
  7.   
  8. def epoch_seconds(date):  
  9.     """Returns the number of seconds from the epoch to date."""  
  10.     td = date - epoch  
  11.     return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)  
  12.   
  13. def score(ups, downs):  
  14.     return ups - downs  
  15.   
  16. def hot(ups, downs, date):  
  17.     """The hot formula. Should match the equivalent function in postgres."""  
  18.     s = score(ups, downs)  
  19.     order = log(max(abs(s), 1), 10)  
  20.     sign = 1 if s > 0 else -1 if s < 0 else 0  
  21.     seconds = epoch_seconds(date) - 1134028003  
  22. return round(order + sign * seconds / 450007)  



这个“热门“排名算法用数学公式表达是下面这个样子(我从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实现(同时去掉了其中的缓存优化代码): 

Python代码 
  1. #Rewritten code from /r2/r2/lib/db/_sorts.pyx  
  2.   
  3. from math import sqrt  
  4.   
  5. def _confidence(ups, downs):  
  6.     n = ups + downs  
  7.   
  8.     if n == 0:  
  9.         return 0  
  10.   
  11.     z = 1.0 #1.0 = 85%, 1.6 = 95%  
  12.     phat = float(ups) / n  
  13.     return sqrt(phat+z*z/(2*n)-z*((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)  
  14.   
  15. def confidence(ups, downs):  
  16.     if ups + downs == 0:  
  17.         return 0  
  18.     else:  
  19.         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评论

分享到:
评论
2 楼 yujiaao 2013-09-24  
google了一下,好象是这个:https://github.com/reddit
1 楼 yujiaao 2013-09-24  
源代码在哪里,是网站将链接去掉了么?

相关推荐

    基于用户投票的排名算法.pdf

    基于用户投票的排名算法是一种将信息按照重要性依次排列的方法,该算法广泛应用于互联网中的各种平台,例如 Delicious、Hacker News 和 Reddit 等。这些平台都使用了基于用户投票的排名算法来对信息进行排名,帮助...

    hot-ranking:Reddit 热门排名算法

    Reddit 热门排名算法 基于 reddit 热门排名算法计算和 item 的分数。 对于科学背后的阅读 安装 npm install hot-ranking 用法 hot(upvotes, downvotes, date) // Load library var hot = require("hot-ranking"); ...

    从豆瓣电影评分算法说起.pdf

    从给定的文件内容中我们可以提炼出以下知识点: 1. 豆瓣电影评分算法:该算法的简化版是将用户的五星评分转换为0到...通过了解和学习各种投票排名算法,可以更加深入地理解在线评分系统的工作原理以及它们面临的挑战。

    测量给定数据集相关性的算法类似于Reddit

    标题提到“测量给定数据集相关性的算法类似于Reddit”,这可能指的是Reddit使用的热点排名算法,它涉及到对用户行为数据的分析,以确定内容的相关性和流行度。 Reddit是一个社交新闻网站,它的热点排名算法基于用户...

    Reddit产品数据集.zip

    《Reddit产品数据集:探索与分析》 Reddit是全球知名的社交新闻网站,用户可以在各个“子论坛”(Subreddits)中分享、讨论各种话题,包括科技、娱乐、生活等各个方面。"Reddit产品数据集.zip" 提供了一个深入了解...

    Reddit is fun gold

    reddit is fun yeppy caye!

    reddit官方网站源代码reddit.zip

    这是reddit官方网站源代码。 标签:reddit

    reddit-top-50:Reddit排名前50位的帖子-使用Vue.js和Reddit API在Deviget进行前端挑战

    Reddit排名前50位的帖子(VueJS的概念证明)-Diogo Bernardelli 下载/克隆项目 在终端上,键入以下命令 $ git clone https://github.com/diogobernardelli/reddit-top-50.git 依存关系 Linux系统 $ sudo apt-get ...

    relativeReddit:Reddit 评论相对排名

    相对 Reddit 评论 ... 相对 Reddit 的工作原理是将评论的分数与其回应的评论的分数进行比较。 一条典型的评论收到的赞成票大约是其父评论的一半,因为 Redditor 停止阅读帖子并因此停止赞成。 以下面的例

    使用遗传 算法为 reddit 上的 meme 生成字符串_JavaScript_代码_下载

    标题中的“使用遗传算法为reddit上的meme生成字符串”是一个有趣的编程挑战,它涉及到遗传算法、字符串处理和JavaScript编程。遗传算法是一种模拟自然选择和遗传学的计算模型,常用于解决优化问题。在这个项目中,...

    Android-这是目前发布过的最好RedditApp

    【Android开发:打造最佳Reddit应用】 在Android平台上,开发一款优秀的Reddit应用程序是一项具有挑战性的任务,需要对Android SDK、UI设计、网络编程以及数据管理有深入的理解。标题中的"Android-这是目前发布过的...

    reddit_crawlers, 将尝试制作有趣的reddit爬虫,提供一些洞察力.zip

    reddit_crawlers, 将尝试制作有趣的reddit爬虫,提供一些洞察力 reddit_crawlers将尝试制作有趣的reddit爬虫,提供一些洞察力使用 python praw库对于着色 bot: 我们使用以下 python 附加软件包:...

    go-rate:Reddit使用的简单评分算法

    排名算法安装$ go get github.com/alextanhongpin/go-rate跑func main () { upvotes := 1000 downvotes := 10 score := rate . Wilson ( upvotes , downvotes ) // or createdAt := time . Now () score := rate . ...

    Reddit-Flair-Detector:使用机器学习算法的Reddit Flair检测器

    Reddit天赋探测器Reddit Flair Detector Web应用程序,使用机器学习算法来检测印度subreddit帖子的风格。 该应用程序可以在。目录结构该目录是用于在Heroku服务器上托管的Django Web应用程序设置。 文件和文件夹的...

    angular-reddit demo所需要的材料

    在本项目中,"angular-reddit demo" 是一个基于Angular框架构建的示例应用,它展示了如何使用...通过学习和运行这个示例,开发者可以深入了解Angular的工作原理和最佳实践,进一步提升其在实际项目中的应用能力。

    angular4 教材 第一个reddit例子

    **Angular4 教材:构建你的第一个Reddit应用** 在Angular4的世界里,开发高效且功能丰富的Web应用程序变得轻而易举。本教材旨在通过构建一个简单的Reddit应用实例,引导你了解Angular的基础用法。让我们逐步深入这...

    Reddit 2.5 million 社交新闻数据.zip

    《Reddit 2.5百万社交新闻数据:洞察网络舆论与信息传播》 Reddit,作为全球知名的社交新闻网站,用户可以在其平台上提交链接、文本、图片等各类内容,并通过投票机制来决定这些帖子的热度和影响力。这个名为...

    协同算法+粒子群算法 核心的学习资源推荐平台

    通过研究这样的项目,你可以深入理解PSO的工作原理,学习如何在实际问题中应用PSO,并对比协同算法的不同实现策略。 在学习过程中,你可以关注以下几个关键点: 1. 理解基本概念:熟悉粒子群优化算法的数学模型,...

    Reddit 用户交互记录【Kaggle竞赛】.zip

    标题 "Reddit 用户交互记录【Kaggle竞赛】.zip" 提供的信息表明,这是一个与Reddit平台用户活动相关的数据集,用于Kaggle竞赛。Kaggle是全球知名的在线数据科学和机器学习竞赛平台,它经常发布各种数据挑战,鼓励...

Global site tag (gtag.js) - Google Analytics