标点符(钱魏 Way)

SegmentFault问答排序算法

SegmentFault 参考了Stack Overflow的热门算法设置了自己的排序算法,具体排序算法如下:

热门文章

对于热门文章,使用了如下公式:

function-1

其中

  • views:浏览量,对浏览量做了一次去对数处理,主要是为了防止某些浏览量较大的文章异军突起,待在榜单迟迟不动。
  • recommendScore/collectScore:文章的推荐数和收藏数,直接加和到分子中,作为文章热门程度的考虑因素。
  • articleComments:文章评论数,这个也作为一个影响文章热度的因素,不过为了降低其影响,对其作了一次取对数操作,主要是考虑到评论数量的影响力并没有上面两个的高。
  • (age/2 + update/2 + 1) ^ i:分母是对时间因子的考虑,宏观上来看,就是文章热度和创建时间成反比。细节上,做成了个指数函数,可以通过对 i 变量的调控来改变时间因子在对热度的影响。
    • age:内容发布时间
    • update:内容最后更新时间(所有时间值单位均为 h/3600)
    • i:重力因子,取值的大小会直接决定热门排序(后面将介绍这点)

热门问答

对于热门问答,使用了如下公式:

function-2

热门问答的计算参考了 Stack Overflow 对于回答数量和问题得票数的处理。同时,结合我们的实际,将评论的得票数也做为一个因素加入计算。

  • Qanswers / Qscore:分别是问题的答案数量和问题的得票数
  • anwserScores / commentSocres:分别是该问题下所有答案的总得票数和所有评论的总得票数
  • update:该问题下答案的最新更新时间

其余的变量含义和文章算法相同。

日/周/月热门

首先要明确各类不同热门内容的目的。

  • 日热门的主要目的就是突出最近一天内的热门内容,更方便于内容被大家看到,文章快速地形成讨论、受关注的问题尽快得到解决;
  • 周热门的主要目的很明确,就是突出过去一周内的热门内容,同时,给新产生的优秀内容机会,让其有机会进入热门列表;
  • 月热门同周热门目的一样,但更需要给新内容进入列表的机会,以让内容经常更新。

所以,该怎么做呢?

对于同一内容,上面的计算公式均可化简为:

function-3

可以看出,其热度和创建时间成反比,那么这个反比的值最终就由重力因子 i 来影响。

日热门为了突出新热内容、过滤时间过久的热门内容,需要增大重力因子,尽可能排除 24 小时之外的热门内容;周热门和月热门则需要按时间要求依次逐渐降小 i 值。

关于指数 i 值的选定,采取了估算:绘制出一定范围内时间和文章热度的指数函数的图,然后根据需求挑选满足自己条件的指数值。如下图:

g

多次估值测试,最终分别将日、周、月的 i 值选取为 1.0、0.5、0.3。

参考链接; https://segmentfault.com/a/1190000004253816

码字很辛苦,转载请注明来自标点符《SegmentFault问答排序算法》

评论