2021/10/27 更新:
增加了最低阅读量过滤,阅读量太低的直接不参与计算,刚创建的文章应该在其他渠道有一些冷启动的过程。但是阅读量是一个容易被刷的数据,该数据并不参与后续计算。
热榜问题分析
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(P−1)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=C∗V∗CH∗(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+w2w1∗titlescore+w2∗contentscore=内容得分
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=1nwi∑i=1nwi∗fi=交互数据得分
其中,
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
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新