NLP 实战 | 热榜算法更新

Posted 幻灰龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP 实战 | 热榜算法更新相关的知识,希望对你有一定的参考价值。

热榜问题分析

CSDN 的榜单有很多个,包含这些:

  • 周排名
  • 历史贡献排名
  • 总排名
  • 新晋博主
  • 企业博客排名
  • 领域排名
  • 热榜排名

其中热榜总是存在一些问题,典型的现象有:

  • 存在博文霸榜时间过长的问题。
  • 收藏/点赞/评论刷量数据对榜单的影响过大的问题。
  • 博文过于追求博文长度的问题。
  • 标题党的风气问题
  • 太多同质化的入门文章。
  • 领域过于集中在少数几个语言上的问题。

我们再分析下这些问题反映的问题是什么:

  • 博文应该能上榜,但是应该有半衰期。
  • 博文的评论区应该有正常的交流和讨论,为了上榜而做的水评实际上降低了文章的内容质量(评论区)和社区整体的评论质量。
  • 收藏说明这个文章对有些用户有用,但收藏不应该是一个「热」的体现,至少权重不应过大。
  • 如果博文的长度是一个KPI,写作者可以通过复制粘贴低水平的入门材料,迅速包装出「重复的低水平的长文章」,那对作者和读者来说,都是一个低质量的内容。太长的博文也并不适合读者阅读。
  • 标题里充斥广告和博眼球的低质量文本,正常的技术博文反而得不到上榜单机会。
  • 内容的同质化和“过热”,那么其他的稀缺内容就总是会没有机会获得上榜机会。

综合来说,让高质量的博客获得更多相关的读者,提高生态质量,打击标题党, 平衡各种领域,适度考虑阅读量和热度。是热榜算法的改进目标。

热榜算法考虑哪些方面?

设计热榜算法,考虑几个不同的维度。

首先,交互数据的平衡

  • 单一交互数据的归一化
  • 不同交互数据映射到可以比较互相比较的数量级
  • 避免单一交互数据对结果的绝对影响

其次,在数据的时间序列上,引入半衰期

  • 同一个内容的数据的得分,随着时间衰减
  • 同一个作者的得分,在时间窗口期内不应该重复上榜

第三,考虑内容的质量

  • 标题的质量(例如标题党降权)
  • 内容的质量(例如内容长度过长降权)

第四,考虑内容的领域

  • 内容不应分布在少数几个过热的领域,例如都是 Python/Java
  • 衡量稀缺度

参考成熟的算法

参考 Hacker News (ycombinator.com) 的热度算法。

S = V ∗ ( P − 1 ) 0.8 ( T + 2 ) G S = V*\\frac{(P-1)^{0.8}}{(T+2)^G} S=V(T+2)G(P1)0.8

其中:

  • V 是领域权重
  • P 是基于用户投票的交互数据点数
  • T 是从创建开始到现在的时间,单位是小时
  • G 是重力(Gravity)因子,用来衰减,默认是1.8

这个基本的公式,重要的地方在于考虑了时间衰减和领域权重,理解这个思想后,可以根据自己的数据做调整。

热榜算法规则

综合上述分析,引入的热榜算法的机制如下:

S = C ∗ V ∗ C H ∗ P ( T + 2 ) 1.1 = 热 榜 得 分 S = C * V * CH*\\frac{P}{(T+2)^{1.1}} = 热榜得分 S=CVCH(T+2)1.1P=

C = w 1 ∗ t i t l e s c o r e + w 2 ∗ c o n t e n t s c o r e w 1 + w 2 = 内 容 得 分 C = \\frac{w1*titlescore + w2*contentscore}{w1+w2} = 内容得分 C=w1+w2w1titlescore+w2contentscore=
V = a r e a s c o r e = 领 域 得 分 V = areascore = 领域得分 V=areascore=
P = ∑ i = 1 n w i ∗ f i ∑ i = 1 n w i = 交 互 数 据 得 分 P=\\frac{\\sum_{i=1}^{n}w_i*f_i}{\\sum_{i=1}^{n}w_i} = 交互数据得分 P=i=1nwii=1nwifi=

其中, C H CH CH 是同一个作者的文章连续上榜的衰减因子。

其中,交互数据 f_i 会做归一化,归一化的基本方式将原始交互数据归一化到区间[0,1]之间,对于某些数据,会使用 l o g ( f ) log(f) log(f)函数做降维,避免数据对结果波动的绝对主导:
f i = t ( f o r i g i n ) / max ⁡ ( t ( f o r i g i n ) ) f_i = t(f_{origin})/\\max(t(f_{origin})) fi=t(forigin)/max(t(forigin))

其中, t i t l e s c o r e titlescore titlescore c o n t e n t s c o r e contentscore contentscore 分别是AI服务计算标题质量分和内容质量分。主要使用 NLP 技术对内容数据做打分。

定期微调

一个软件要持续更新才会流水不腐。热榜也是一种得分计算,是一种指标数据,这些公式本身也是一个「软件」。因此,在保持基本原理不变的情况下,根据线上真实数据的反馈情况,定期采取微调策略,不断改进,推荐出高质量的内容,平衡各领域,打击低质量内容,形成良币驱逐劣币的技术氛围,这是热榜算法的目标。

贡献者

热榜算法欢迎大家共同贡献思路和建议,共同改进社区氛围。在此会逐渐把贡献者名单列上:


@幻灰龙 @佳昊 @刘鑫 @softwareteacher


–end–

以上是关于NLP 实战 | 热榜算法更新的主要内容,如果未能解决你的问题,请参考以下文章

NLP 实战 | 整体设计之代码篇

NLP 实战 | 整体设计之代码篇

NLP 实战 | AI 编程也遵循软件工程的基本原理

Python爬虫实战:定时爬取微博热榜信息并存入SqlServer,不再错过每条热搜

NLP 实战(10): CSDN 领域榜标签分组更新

《Python自然语言处理实战:核心技术与算法》PDF新书推介,附带链接地址