我烧网的热文排序算法也不会对外公布
优采云 发布时间: 2021-07-28 21:20我烧网的热文排序算法也不会对外公布
就像谷歌不会公布其搜索排名算法一样,大多数公司也不会公开公布排名算法。因为这个算法一旦公布,总会有人做SPAM。同样的,我的热点文章排序算法也不会对外公布,我们只是给用户提供一些基本的原理。这个算法被我们命名为SmartHot,是2009年底我烧网修改的时候设计的。现在已经一年多了。这期间,我们对算法做了几次改进和调整,也正因为如此,才有机会分享一下当时的一些设计思路。希望通过对这个算法的生成过程的介绍,希望对更多的网站和程序员有所启发。也希望大家积极参与学习,共同进步。
是一个基于博客内容聚合的阅读社区。和其他内容聚合网站一样,内容量巨大,所以内容抽取尤为重要。在改版之前,我们一直都是手动推荐内容,但是手动方式有两个缺点:一是人工成本太高,二是推荐的内容经常被编辑喜欢,但不一定被用户喜欢。在这次改版中,我们希望通过众包的方式,让用户为用户推荐内容,从而节省团队的人力成本,同时能够真正推荐用户喜欢的内容,让用户互动更加活跃。这个推荐列表是我后来在网上烧的热帖。从访问量统计来看,热点页面的PV也远高于其他页面。热文本的背后,是由这个SmartHot算法支持的。
在提出开发一套文章排序算法之前,我们首先对这次改版做了一个计划。整个计划有一个中心思想,就是让更多的用户参与到网站,通过用户的参与提高网站内容的质量,然后将优质的内容反馈给用户。 SmartHot 必须服务于这个中心思想。后来实践证明,在这套算法的支持下,我烧网实现了飞速发展,最终的主要影响有三点:一是更多用户参与社区活动,二是内容质量大幅提升。三是节省大量人工成本,带来比人工更好的效果。在这个中心思想的指导下,整个团队开始思考热点文章排序算法。
提出问题
首先,用户推荐行为的基础是不允许用户推荐,因为用户贡献过多会让网站失去活力。更明智的做法应该是根据用户的各种单一操作,通过数据挖掘,找到最推荐的文章。这已经被提炼成一个数据挖掘问题——通过对用户行为数据的挖掘,找到一个好的文章然后推荐给所有用户。面对此类问题,团队提出了多种解决方案。最简单最常规的当然是按文章浏览量排序。但是,无数的经验证明,这并不是一个合理的算法。浏览量的高低只能代表访问者被标题、图片等吸引的程度,如果想知道文章用户的真实感受,就得用天柴号(我烧网的用户快递他们对文章添柴的爱)来分类。但是,观看次数和添加的柴火数都是累积数。最终,马太效应不可避免地会出现严重的问题,使得第一个文章总是排在第一位,而新的文章无法进入顶部。这时,将两者结合的想法出现了。
我们以添加的柴火数为前向参数,以浏览次数为后向参数。如果一个文章被用户浏览100次,用户加柴10次,会被计为0.1分(10/100=0.1)。这意味着数字越大的views,最终的排名分数越低!这是一个非常突破性的想法,因为我们知道很多同行都将pageviews作为文章排名的正参数。问题似乎解决了,但新的问题也出现了:大多数用户就是做不到。也就是说,很多用户即使认为文章很好也懒得加柴,这必然导致很多好的文章失去排名第一的机会大量的浏览量。经过考虑,我们最终决定放弃页面浏览量的基础——文章分数是基于额外的柴火数。
在我的烧网中,对文章的其他操作,如评论、分享,也与添加chai类似,并给予一定的分数,以纳入文章的分数。当然,单独按分数排序是不合理的,这和直接按柴数排序的结果是一样的。为了保证用户喜欢的新文章总能排在用户也喜欢的老文章之前,我们必须引入一个时间参数,该参数由用户操作的得分和发布时间决定文章 一起决定文章 的排名值。计时数(包括其他用户操作)为正参数,文章release time 为反向参数,最终排序值与文章score成正比,与release时间成反比。于是另一个重要的原则出现了——文章排名值随着时间的推移而衰减。
分析到这里,团队中的每个人都欣喜若狂:我们知道算法即将完成。但是一个尖锐的矛盾让我们回到了现实:文章score 很容易作弊。如果一个人在文章一篇文章中不断加柴,包括换很多马甲,他可以直接得到很多积分。我们可以限制用户连续加柴的次数,但不能限制用户可以注册的马甲数量。于是,出现了一个关于用户权重-用户系数的参数。用户系数与级别有关,级别越高,用户权限
权重越高,新注册用户的权重越低。基本思路产生之后,问题就很清楚了。下一步就是根据这些问题确定每个目标,然后解决问题。
确定目标
根据前面的分析,可以确定以下目标。
1. 为每个用户操作设置唯一的分数。
2. 设置时间衰减率。
3. 建立用户系数模型,使用户权重随级别变化。
4. 设计一个用户评分系统。
1