博客质量分计算——发布 version 5.0

目录

  • - - ## 1. 背景 博客质量分顾名思义是用于衡量一篇博客的质量,其在 CSDN 的热榜、推荐、搜索等多个模块中发挥着关键性的作用。下图是质量分的工作机制: 在这里插入图片描述 先回顾一下,在第 4 版本 (后续称为 V4) 的质量分中,主要对得分进行了平滑,使得质量分结果分布更均匀,不会过度集中在头部 [80, 100] 和尾部 [0, 20),详见。但是,在 V4 的质量分体系中无明显层次结构 (也可称为可解释性),即博主在博文中加入新的元素 (例如:图片、链接、代码等),质量分没有按阶梯式增高,在博文中加入一些影响阅读的元素之后 (例如:死链、虚假链接、代码混乱等) ,质量分也没有按阶梯式降低。此外,虽然 V4 的质量分分布更加均匀,但还是不够,详见图 5,该图随机统计了 1 万篇博客质量分的分布情况,其中蓝色部分的柱状图是 V4 的质量分分布情况,可以看出得分主要分布在 [0, 20] 和 [50, 94] 两个区间段。针对上述问题,第 5.0 版本 (后续称为 V5.0) 的质量进行了一系列的改进,在保证 V4 高质量博客数据保留约 90% 的情况下 (即 V4 中 80 分以上的博客在 V5.0 中有约 90% 仍在 80 分以上) ,得分分布更均匀,质量分体系层次结构也更清晰。接下来,将对第 5.0 版本质量分的改进进行详细阐述。 ## 2. 质量分 version 5.0 ### 2.1 version 4 存在问题分析 下图是 V4 版本质量分计算流程: 在这里插入图片描述 从图 2 可以看出,V4 版本质量分计算流程存在以下问题: - 正向积累得分中,**目录** 和 **标准目录** 作为两个不同的项,存在冗余; - sigmoid 归一化中,sigmoid 函数将得分强制映射到了 (0.5, 0.938), 使得 0.5 和 0.938 以下的得分极少出现,此外 (此处得分为缩放前的得分,取值为[0, 1]); - sigmoid 归一化应该放在最后阶段,而不是中间阶段; - **文章是否有投票** 可以直接放到正向累加得分中; - 计算逻辑中只有正向积累得分 (亦称加分项) 和惩罚项,而没有减分项。从得分系统设计逻辑的完备性来看,应该分为以下三个部分: - 加分项:从0到1,逐步加分; - 减分项:从1到0,逐步减分; - 强惩罚因子:严重违规的情况,直接乘以一个较低的惩罚因子,例如:0.1, 0.2。 此外,除了上述计算流程上的问题,V4 版本的质量分在多个得分项上面还存在以下问题: - 代码得分:可理解为代码量得分,英文为 `lines of code`,即代码的行数,而 V4 版本中的计算方式是代码中 token 的数量; - 各子得分项不够平滑:以 **内容长度得分** 为例,使用的是 Min–max normalization (代码如下所示),该归一化方法存在截断的情况,如果输入值大于最大值,则得分就不会发生变化了,并且也不够平滑,例如: - 内容长度得分,如果文章长度的最大值是 2000,文章 1 的长度为 2000,文章 2 的长度是 3000,则文章 1 和文章 2 的得分是一样的。 - 目录得分,目录得分是基于正文中的多级子标题的数量进行计算的,标题数越多,则得分越高。V4 版本直接使用的是 Min–max normalization,其中 min = 0,max = 10。该归一化方法不够平滑,如果博文中只有 2 个子标题,则得分只有 0.2,但质量分的初衷是鼓励用户正确使用多级标题,有的文章确实不需要过多的多级标题,可能 2 个子标题就可以将文章结构划分得很清楚,即 2 个子标题应该得到 0.5 以上的得分。 ```python def min_max_normalization(value, max_value, min_value): if value > max_value: value = max_value if value < min_value: value = min_value if min_value > max_value: tmp_value = max_value max_value = min_value min_value = tmp_value norm_value = (value - min_value) / (max_value - min_value) return norm_value ``` ### 2.2 version 5.0 改进 针对 V4 版本中存在的问题,V5.0 版本进行了相应的改进,改进后的计算流程如下图所示: 在这里插入图片描述 从图 3 可以看出,V5.0 版本针对 V4 版本在计算流程方面进行了如下改进: - 将 **目录** 和 **标准目录** 进行合并,统一为目录得分; - sigmoid 在进行平滑时候,放到了最后一个阶段,并且新的 sigmoid 函数映射的得分区间为 (0.017, 0.983),相比之前的 (0.5, 0.938),得分分布更加均匀,函数图像如下所示: 在这里插入图片描述 - **文章是否有投票** 直接放到了加分项中; - 计算逻辑直接拆分成了三个部分:加分项、减分项和强惩罚项; - 新增 **非 IT 技术文章** 减分项 - **文章结构太简单** 从强惩罚因子变为减分项,因为文章结构简单已经在 **文章内容长度得分** 以及 **标签多样性得分** 等多个地方有所体现,故无需进行强惩罚; - 新增 **图片得分**; - 优化各个子加分项权重,使得分呈阶梯式增高或降低; - 计算流程最后一步的得分取整 `int(score * 100)` 改为 `round(score * 100)` ,因为 python 中的 int() 默认是向下取整,round 是四舍五入。 此外,除了计算流程上的优化,V5.0 版本还对每个字得分项上的计算逻辑进行了优化,具体如下: - **代码得分** 直接使用代码行数以及代码块个数进行衡量; - 针对多个子得分项不够平滑的问题,V5.0 中减少了 Min–max normalization 函数的使用,改为使用分段函数,或者其他更为平滑的曲线。V5.0 版本针对 **内容长度得分**、**目录得分**、**代码得分**、**链接得分**、**图片得分** 等多个子得分项进行了平滑以及计算逻辑微调,例如: ```python def __cal_content_length_score(self, content): """ 计算内容长度得分 v5.0 """ content_len_base = self.content_len_range["max"] / 2 content_len_cut_off_point = sigmoid(self.content_len_range["max"] / content_len_base) content_len = len(content) # 分段函数,平滑内容长度较大时的得分 if content_len <= self.content_len_range["max"]: score = min_max_normalization( content_len, self.content_len_range["max"], self.content_len_range["min"]) score *= content_len_cut_off_point else: score = sigmoid(content_len / content_len_base) return score ``` ```python def __cal_heads_toc_score(self, sample): """ 计算目录得分 v5.0 """ # 1. 正文中的多级标题 (即 h1, h2, h3, h4) 得分 heads_list = sample["catalog"] heads_num = len(heads_list) # 平滑,当 heads_num 较小时,得分变化不至于过小 heads_score = min(math.pow(heads_num / self.heads_num_para["max"], 0.25), 1) # 2. toc 得分 if "toc" in sample: toc_score = 1.0 else: toc_score = 0.0 # 3. 加权 score = heads_score * self.heads_toc_weight["heads"] \ + toc_score * self.heads_toc_weight["toc"] return score ``` ### 2.3 消融分析 本文进行了部分消融实验,测试各个 V5.0 版本中各个因素的影响: #### 2.3.1 正向积极得分消融实验 通过逐步去掉影响质量分的某个要素,观察质量分的变化。下表中,**质量分-V5.0-sigmoid** 表示 V5.0 版本最终的质量分,**质量分-V5.0-base** 表示 V5.0 版本 sigmoid 平滑前的质量分。由于 sigmoid 函数的特性 (函数图像见图 4),会平滑掉高分段和低分段分数的差异性,中分段的差异性会更加明显,这也符合一个常识性假设:“分数越高,就越难提升分数”。因此,为了观察每个要素对质量分的影响,对比 **质量分-V4** 和 **质量分-V5.0-base** 即可。从下表中标红的得分可知,V5.0 版本要优于 V4 版本,V5.0 版本更能体现随着要素的减少,质量分呈现阶梯式的降低。 |博客|质量分-V4|质量分-V5.0-base|质量分-V5.0-sigmoid|长度|标题|图片|链接|目录|标准目录|代码|投票|元素多样性| |------||91|97|98|1|1|1|1|1|1|1|1|8| |91|92|97|1|1|1|1|1|1|1|0|8| |89|86|95|1|1|1|1|1|1|0|0|7| |83|84|95|1|1|1|1|1|0|0|0|6| |82|81|93|1|1|1|1|0|0|0|0|6| |79|75|90|1|1|1|0|0|0|0|0|4| |78|70|84|1|1|0|0|0|0|0|0|4| |76|65|78|1|0|0|0|0|0|0|0|4| |76|64|77|0.75|0|0|0|0|0|0|0|4| |76|62|76|0.5|0|0|0|0|0|0|0|4| |68|46|55|0.25|0|0|0|0|0|0|0|4| |10|23|2|0|0|0|0|0|0|0|0|2| #### 2.3.2 正向累积得分单变量实验 通过每次只去掉一个影响质量分的某个因素,观察质量分的变化。理由同上,直接对比 **质量分-V4** 和 **质量分-V5.0-base**,从下表中标红的得分可知,V5.0 版本要优于 V4 版本,每去掉一个要素,V5.0 版本的得分降低更加明显。 |博客链接|质量分-V4|质量分-V5.0-base|质量分-V5.0-sigmoid|长度|标题|图片|链接|目录|标准目录|代码| |------||91|92|97|1|1|1|1|1|1| |89|86|95|1|1|1|1|1|1|0|0| |86|90|97|1|1|1|1|1|0|1|0| |91|88|96|1|1|1|1|0|1|1|0| |91|88|96|1|1|1|0|1|1|1|0| |91|87|96|1|1|0|1|1|1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值