上一篇文章介绍了Hacker News 的排名规则。这次要介绍的是另外一个社会化新闻类网站Reddit 。Reddit对文章和评论使用了不同的排名算法,这边文章要介绍的是前者,后面的关于评论的排名在后面的文章作再作介绍。 Reddit与Hacker News有很大的不同点就是,Hacker News文章标题前面只有一个向上的小箭头,即只能投赞成票,而Reddit的每个文章标题前会有两个箭头,即一个向上,一个像下。分别代表“赞成”与“反对”。 Reddit已经把他们的所有源代码进行了公开,你可通过如下地址(https://github.com/reddit/reddit)进行下载研究。具体涉及到排序部分的代码如下:https://github.com/reddit/reddit/blob/master/r2/r2/lib/db/_sorts.pyx。为了效率,由于此部分代码是使用Python的C语言扩展来写,下面是用Python重写的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from datetime import datetime, timedelta
from math import log
epoch = datetime( 1970 , 1 , 1 )
def epoch_seconds(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):
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 )
|
从上面的代码中可以看到整个逻辑并不复杂,下面就来深入研究下起实现的方式。以下为对于代码中使用到的数学公式的描述。
从上面的代码级公式中我们可以了解到Reddit的排名算法主要与以下内容有关:
1、文章的发表时间t
t = 发表时间 – 2005 年 12 月 8 日7:46:43
在上一篇 Hacker News的文章中,用来标注文章新旧程度的单位为小时,而Reddit的单位为秒,其使用Unix时间戳(从1970年1月1日到当前时间的秒数)进行的计算,代码中的1134028003代表的日期为2005 年 12 月 8 日7:46:43。这个应该是Reddit这个网站的上线时间。通过上面的公式可以看到一旦帖子发表,t就是固定值,不会随时间改变,而且帖子越新,t值越大。
发表时间和话题排名的影响可以被概括如下:
- 发表时间对排名有很大影响,该算法使得新的话题比旧的话题排名靠前
- 话题的得分不会因为时间的流失而减少,但是新的话题会比旧的话题得分高。这与 Hacker New 的算法不同 (随着时间的发展降低话题的得分)
下图展示了话题得分在好评和差评的数量不变时,随着时间而变化的情况:
2、赞成票与反对票的差x
x = 赞成票 – 反对票
真是由于Reddit提供了投反对票的功能,所以可以使一些具有争议的话题会排的较后,下图展示了在好评和差评不变时,随着时间而变化的情况:
3、投票方向y
y 是一个符号变量,表示对文章的总体看法。如果赞成票居多,y就是 +1;如果反对票居多,y就是-1;如果赞成票和反对票相等,y就是0。y是文章评价的一种定性表达,0表示没有倾向,大于0表示正面评价,小于0表示负面评价。
4、帖子的受肯定程度z
z 表示赞成票超过反对票的数量。如果赞成票少于或等于反对票,那么z就等于1。
结合以上几个变量,Reddit 的最终得分计算公式如下:
这个公式可以分成两个部分来讨论:
1、logZ
这个部分表示,赞成票超过反对票的数量越多,得分越高。 需要注意的是,这里用的是以 10 为底的对数,意味着z=10可以得到 1 分,z=100可以得到 2 分。也就是说,前 10 个投票人与后 90 个投票人(乃至再后面 900 个投票人)的权重是一样的,即如果一个帖子特别受到欢迎,那么越到后面投赞成票,对得分越不会产生影响。而当反对票超过或等于赞成票,z=1,因此这个部分等于0,也就是不产生得分。
Reddit 的热排序算法使用了对数函数来衡量前面的投票与其他投票的差距使其前十个好评和之后的100个,1000个投票有相同的权重。 参见下面的图:
如果不采用对数,而使用线性函数的效果如下:
Reddit敢于如此消弱投票的作用,其实与其庞大的流量和用户参与度相关。如果没有以上因素算法很难实现很好的推荐。
2、yt/45000
这个部分表示,t越大,得分越高,即新帖子的得分会高于老帖子。它起到自动将老帖子的排名往下拉的作用。 分母的 45000 秒,等于 12.5 个小时,也就是说,后一天的帖子会比前一天的帖子多得 2 分。结合前一部分,可以得到结论,如果前一天的帖子在第二天还想保持原先的排名,在这一天里面,它得到的净赞成票必须增加100 倍。
y 的作用是用来产生正分和负分。当赞成票超过反对票时,得分为正;当赞成票少于反对票时,得分为负;当两者相等,得分为0。这就保证了得到大量净赞成票的文章,会排在前列;得到大量净反对票的文章,会排在最后。投票对于总分的贡献不大,但是当投票的意见倾向发生变化时(由正面评价转向负面评价),投票对于总分的作用却是决定性(Y的取值)。
总结
以上内容分析这么多,是该进行总结的时候了,关于Reddit的排名,基本上是由发表时间决定的,只有相同时段的文章才有可比性。晚半天,投票就要翻10倍,只能同时段的文章相比。只有超级受欢迎的文章才会排在最前面,有争议或者一般性的文章很难靠前。基于上述也就决定了 Reddit是一个符合大众胃口的网站,并不是一个很激进可以展示少数派想法的地方。
说了这么多,再来看下Reddit与Hacker News的区别,到底哪一个的算法更好一些呢?其实算法并没有优劣之分,两种方法更有千秋,重要的是你打算用在什么地方。Reddit流量大,所以可以减少投票的权重,而也因为流量大,使得每篇文章在没有收到新的投票的时候无需重新计算得分,也可大大的减少服务器的运算成本。
参考文章:http://amix.dk/blog/post/19588
相关推荐
- **数学问题**: 需要数学知识,如组合数学、概率论、线性代数等,来求解的问题。 - **数据结构应用**: 如堆、栈、队列、优先队列、字典树、并查集等数据结构的应用。 - **图论问题**: 处理网络、图的连通性、最短...
5. 协同算法:掌握协同过滤的基本思想,学习如何计算用户或物品的相似度,以及如何进行预测。 6. 模型改进:研究如何解决协同过滤的问题,如使用混合模型、矩阵分解技术等。 同时,可以参考以下资源: - 学术论文:...
2. 设计算法:根据问题特点设计解决方案,可能需要结合多种算法。 3. 编写代码:使用C++、Java、Python等编程语言实现算法。 4. 测试调试:对代码进行详尽的测试,确保在各种输入情况下都能正确运行。 5. 提交答案:...
- **论坛和社区**:Stack Overflow、Reddit等网站上有大量关于离散数学问题的讨论,可以从中获得灵感和解答疑惑。 ### 结语 离散数学是计算机科学的基础之一,掌握其核心概念和技术对于深入理解和解决计算机科学...
3. **数学知识**:组合数学、图论、数论、概率论等。 4. **编程语言**:常见比赛语言包括C++、Java、Python等,掌握一门或多门语言的基础语法和高级特性至关重要。 其次,NOI(全国青少年信息学奥林匹克竞赛)是...
### YOLO实时目标检测算法概要介绍与分析 #### YOLO算法概述 YOLO(You Only Look Once)作为一种先进的实时目标检测算法,自2016年首次提出以来便受到了广泛的关注。该算法由Joseph Redmon等人设计,旨在解决传统...
它还主办了著名的ACM International Collegiate Programming Contest (ICPC),这是一项面向全球大学生的年度多阶段团队比赛,旨在测试学生们的算法设计、逻辑分析、数学、编程以及应对高压环境的能力。 #### ACM ...
TensorFlow的核心是数据流图,其中节点代表数学操作,边则代表在这些操作之间流动的多维数据数组(张量)。在这个聊天机器人项目中,TensorFlow被用来构建和优化深度学习模型,可能包括循环神经网络(RNN)或者...
- **《算法导论》**:这本书是算法领域的经典之作,在“栈的应用”章节中详细介绍了后缀表达式的理论基础和求值方法,是系统学习算法的必备资源之一。 4. **编程实践** - **在线编程环境与代码库**:GitHub 和 ...
1. YOLOv3目标检测算法:用于图像中物体的识别和定位。 2. Reddit和Twitter API:为项目提供社交媒体数据,可能是图片或视频,作为对象检测的输入。 3. AWS云服务:提供计算资源和存储,支持项目的数据处理、模型...
4. **学术论坛和社区**:如Stack Exchange - Operations Research、Reddit - r/math、r/statistics等社区,可以找到关于建模和数据分析的讨论,获取实用的信息和经验分享。 综上所述,通过合理利用上述资源,参赛者...
**DSP(Digital Signal Processor)数字信号处理器**是专门设计用于执行数字信号处理算法的微处理器。它在通信、音频处理、图像处理、雷达与声纳系统、自动化、医疗设备等领域有着广泛的应用。本主题将深入探讨DSP的...
/r/DailyProgrammer 是Reddit上的一个热门板块,它为程序员们提供了一系列的编程挑战,旨在提升技能,增强解决问题的能力。这个资源库,名为“DailyProgrammer-master”,很可能包含了参与者们为这些挑战提交的解决...
- **标准库**: 学习使用标准库中的函数,如字符串处理函数(strcpy、strlen等)、数学函数(sin、cos等)。 - **第三方库**: 探索和使用如GLib、GTK+等第三方库,这些库可以提供更多的功能支持。 #### 八、指针和内存...
这些库涵盖了算法、容器、泛型编程、图像处理、数学计算、多线程等多个领域,极大地提高了C++的编程效率和代码质量。Boost库虽然不是官方标准的一部分,但其在C++社区中的地位几乎等同于“准”标准库。 #### 二、为...
zxing.java源码解析 mytools 常用工具类 技术站点 Hacker News:非常棒的针对...编程之美 黑客与画家 编程珠玑 C++ Prime Effective C++ TCP/IP详解 Unix 编程艺术 《精神分析引论》弗洛伊德 搞定:无压力工作的艺术
4. **社区和论坛**:加入DSP相关的社区和论坛,如DSP Stack Exchange、Reddit的r/dsp板块,可以与其他爱好者交流经验,解决学习过程中遇到的问题。 总之,DSP是一门深奥且实用的技术,对于希望在信号处理领域有所...
zxing.java源码解析 articles 转载: 技术站点 •Hacker ...•编程之美 •黑客与画家 •编程珠玑 •C++ Prime •Effective C++ •TCP/IP详解 •Unix 编程艺术 •《精神分析引论》弗洛伊德 •搞定:无压力工
NLP是一门融合了语言学、计算机科学和数学建模的交叉学科,旨在使计算机能够理解、解释和生成人类语言。 #### 二、NLP的主要任务与应用 NLP涉及众多不同的任务和技术,主要包括但不限于: 1. **文本分类**:自动...