排名算法

3,292 阅读11分钟
原文链接: leengui.com

机器学习来做排名运营机器人,做内容排名推荐。时间衰减 t, t^2、用户评价、VIP用户推荐、专家用户推荐(用户加权评价,每个用户权重不同)、分词,话题,信息熵机器学习估算、编辑推荐。
算法评价标准即是运营指标:用户收藏率、点赞率、评价率、转发率、浏览时长、打开次数。

参考文章:
www.cricode.com/2374.html

极客头条是通过什么算法将来进行排名的呢?

答案是:基于用户投票的排名!该算法在数据挖掘领域有这广泛的应用。

基于用户投票的排名算法有多种,下面我们先来介绍各种基于用户投票的排名算法,并最终给出极客头条可能使用的一种排名算法。

排名算法一:Delicious算法

Delicious算法是最简单也是最直观的一种用户投票排名算法:它按照”过去 60 分钟内被收藏的次数”(也就是极客头条中的“顶”按钮)进行排名,每过 60 分钟,就统计一次。

这个算法的优点是比较简单、容易部署、内容更新相当快;缺点是排名变化不够平滑,前一个小时还排在前列的内容,往往第二个小时就一落千丈。

排名算法二:Hacker News算法

Hacker News算法由Paul Graham(此人著有《黑客与画家》一书,名震江湖)设计实现,它通过计算每篇文章的得分来进行排名。

计算公式如下:

“ S c or e ” = P - 1 ( T + 2 ) G " role="presentation">“Score”=P−1(T+2)G “ S c or e ” = P - 1 ( T + 2 ) G

其中,
P 表示帖子的得票数,减去 1 是为了忽略发帖人的投票。
T 表示距离发帖的时间(单位为小时),加上 2 是为了防止最新的帖子导致分母过小(之所以选择2,可能是因为从原始文章出现在其他网站,到转贴至 Hacker News,平均需要两个小时)。
G 表示”重力因子”(gravityth power),即将帖子排名往下拉的力量,默认值为1.8
因此,决定一个文章排名的因素主要有三个:得票数P、距离发帖的时间T、重力因子G。其中G在实现中可以进行适当调整,得到一个理想的经验值,从而保证该推荐算法的准确性!

Hacker News算法的特点是用户只能投赞成票,不能投反对票!对于一些需要正反观点的网站,Hacker News并不适用。

这个算法的特点是不是有点像极客头条的运作方式了?别急,接着往下看。

详细介绍:Hacker News算法

算法三:Reddit算法

顾名思义,这个算法是由美国社交新闻网站Reddit提出的。该算法相对于Hacker News算法来说更加复杂,支持正反投票。该算法考虑了如下几个因素:

1)帖子的新旧程度t
2)赞成票与反对票的差x
3)投票方向y:y 是一个符号变量,表示对文章的总体看法,如果赞成票居多,y就是 +1;如果反对票居多,y就是-1;如果赞成票和反对票相等,y就是0
4)帖子的受肯定程度z:z 表示赞成票超过反对票的数量。如果赞成票少于或等于反对票,那么z就等于1
综合以上四个因素看,Reddit算法似乎比Hacker News算法算法更合理、更靠谱!但是,请继续往下看!

详细介绍:Reddit算法

算法四:Stack Overflow算法

看到这个名字,大家是不是很眼熟?就是那个大名鼎鼎的网站Stack Overflow,世界排名第一的程序员问答社区。

Stack Overflow算法的作用是,找出某段时间内的热点问题,即哪些问题最被关注、得到了最多的讨论。该算法主要考虑如下几个因素:

Qviews(问题的浏览次数)
Qscore(问题得分)和 Qanswers(回答的数量)
Ascores(回答得分)
Qage(距离问题发表的时间)和 Qupdated(距离最后一个回答的时间)
Stack Overflow算法是专门针对热点问题进行排名而设计的算法。最终的排名与参与度(Qviews 和 Qanswers)和质量(Qscore 和 Ascores)成正比,与时间(Qage 和 Qupdated)成反比。

详细介绍:Stack Overflow算法

算法五:牛顿冷却定律

“牛顿冷却定律”描述起来非常简单,用一句话概况就是:物体的冷却速度,与其当前温度与室温之间的温差成正比。

其基本思路如下:

我们把”热文排名”想象成一个”自然冷却”的过程,那么有如下几点成立:

(1)任一时刻,网站中所有的文章,都有一个”当前温度”,温度最高的文章就排在第一位。
(2)如果一个用户对某篇文章投了赞成票,该文章的温度就上升一度。
(3)随着时间流逝,所有文章的温度都逐渐”冷却”。
接下来,我们需要做的事是,把上面三句话抽象成一个数学模型,便得到牛顿冷却定律排名算法。

详细介绍:牛顿冷却定律

算法六:威尔逊区间(数学来了,你准备好了吗?)

威尔逊区间排名算法是一个完全基于概率统计的排名算法。算法基于如下假定:

(1)每个用户的投票都是独立事件。
(2)用户只有两个选择,要么投赞成票,要么投反对票。
(3)如果投票总人数为n,其中赞成票为k,那么赞成票的比例p就等于k/n。
基于上述假定,得到威尔逊区间排名算法步骤如下:

第一步,计算每个项目的”好评率”(即赞成票的比例)。
第二步,计算每个”好评率”的置信区间(以 95% 的概率)。
第三步,根据置信区间的下限值,进行排名。这个值越大,排名就越高。
这样做的原理是,置信区间的宽窄与样本的数量有关。比如,A有 8 张赞成票,2张反对票;B有 80 张赞成票,20张反对票。这两个项目的赞成票比例都是 80%,但是B的置信区间(假定[75%, 85%])会比A(假定[70%, 90%])窄得多,因此B的置信区间的下限值(75%)会比A(70%)大,所以B应该排在A前面。

置信区间的实质,就是进行可信度的修正,弥补样本量过小的影响。如果样本多,就说明比较可信,不需要很大的修正,所以置信区间会比较窄,下限值会比较大;如果样本少,就说明不一定可信,必须进行较大的修正,所以置信区间会比较宽,下限值会比较小。

“威尔逊区间”排名算法解决了投票人数过少、导致结果不可信的问题。

详细介绍:威尔逊区间排名算法

算法七:贝叶斯平均(大神出没)

程序员必须知道的10个基础算法及其讲解一文中,我们就介绍了贝叶斯概率。

“威尔逊区间”能解决了投票人数过少、导致结果不可信的问题,例如如果只有 2 个人投票,”威尔逊区间”的下限值会将赞成票的比例大幅拉低。这样做虽然保证了排名的可信性,但却带来了另一个问题:排行榜前列总是那些票数最多的项目,新项目或者冷门的项目,很难有出头机会,排名可能会长期靠后。

贝叶斯平均排序算法考虑了如下几个因素:

1)C,投票人数扩展的规模,是一个自行设定的常数,与整个网站的总体用户人数有关,2)可以等于每个项目的平均投票数。
3)n,该项目的现有投票人数。
4)x,该项目的每张选票的值。
5)m,总体平均分,即整个网站所有选票的算术平均值。
这种算法被称为“贝叶斯平均”(Bayesian average)。因为它借鉴了“贝叶斯推断”(Bayesian inference)的思想:既然不知道投票结果,那就先估计一个值,然后不断用新的信息修正,使得它越来越接近正确的值。

上述几个因素中的m(总体平均分)是”先验概率”,每一次新的投票都是一个调整因子,使总体平均分不断向该项目的真实投票结果靠近。投票人数越多,该项目的”贝叶斯平均”就越接近算术平均,对排名的影响就越小。

因此,这种方法可以给一些投票人数较少的项目,以相对公平的排名。

详细介绍:贝叶斯平均

好了,几种有名的基于用户投票的排名算法介绍完了,上述算法看起来是一个比一个靠谱,用起来是一个比一个难用!

回到本文的题目,如果是你来实现这个排名算法你会采用哪一种呢?极客头条究竟采用了哪种排名算法?

根据本人有限的知识体系,极客头条的排名方法很有可能就是Stack Overflow算法的一个具体应用。

结合本文介绍的算法,以下是本人对于极客头条产品设计实现的几点思考,路过的高手见笑了!
第一:采用Stack Overflow算法进行推荐排名,并根据自身的特点进行适当的修改简化。

理由主要有两点:

1)从表面上看,极客头条该算法主要参考的因素为发布时间、用户赞成数、评论数目、点击数目(很有可能极客头条也将点击数目加入了考量,这个无法肯定)。

2)Stack Overflow算法相对比较简单,易于实现调优。事实上简单的算法往往能达到最好的效果,这就是所谓的大道至简吧!

有兴趣的可以看这篇文章:Google 阿卡 47 的制造者阿米特.辛格博士,体验一下大道至简!

第二:为什么极客头条不设置”踩”按钮?

这是因为,如果将反对按钮一加进来,排名结果立马变得不可控,效果会马上变差。主要原因是,不排除有个别投机分子,会将极客头条当做导流量的渠道(或者仅仅是出于好玩,随便一踩),一旦有作弊的情况,比如出现刻意踩别人的文章,顶自己的文章,问题将变得麻烦,推荐效果也就难以保障了。去掉反对按钮后,问题会简单很多。关于作弊的问题,有兴趣的可以看这篇文章:闪光的不一定是金子——谈谈搜索引擎作弊问题(Search Engine Anti-SPAM)

第三:极客头条可以开放一个管理员权限,管理员能够人为将文章置顶,让排名算法结果适当受人工控制,而不是全自动化。机器,在目前的情况下,还不能完全替代人类,尤其在内容编辑方面。

第四:如果人力物力允许,可以将机器学习应用到排名上来,实现一个更加智能的排名算法。

想象一下这个场景:在三分钟之内同时有50篇文章被提交审核通过(事实上,这应该有可能,因为极客头条的编辑就有30个之多)。假设在几分钟内,没有生成点赞数据和评论数据,那么,算法就只能按时间来排序了,仅仅按时间排序,效果肯定不尽如人意。
一个可能的解决方案是:根据以往的极客头条数据,统计出一些受欢迎的主题、关键字等信息,建立一个数学模型。当同时有大量新文章到来时,先对新文章进行分词,再根据这个数学模型,对每篇文章进行评分,按得分排行。当然,可以考虑文章来源,对于可靠的文章来源,可以给予更高的评分,例如:伯乐网、CSDN、快课网(this is a kidding)等等网站。