更新日志

2022/09/15

热榜 v3.7.3.8 上线:

  • 增加文章因为分享带来的站外访客因子;
  • 加入新增的前沿技术相关标签,并设置权重。

贡献者:@卢昕

2022/09/08

热榜 v3.7.3.7 上线:

  • 点赞、评论、收藏、关注、分享,投票,24h_uv 支持全站交互数据(之前只支持 app 端交互数据)。

贡献者:@卢昕

2022/08/25

  • 增加博文阅读量数据的因子

    • 考虑不在博主粉丝列表里的阅读量,增加权重;
    • 用户阅读的权重,离博客发布时间点越远,权重越大
  • 增加博文投票的权重(请看:CSDN博客投票 )
    • 用户投票的权重,离博客发布时间点越远,权重越大
  • 调整评论权重
    • 用户评论的权重,离博客发布时间点越远,权重越大

贡献者:@卢昕

2022/06/15

  • 增加对含有违规图片的过滤

2022/05/27

  • 热榜总榜更新

    • 热榜时间衰减因子 ttl 调整,放慢衰减速度;
    • 修改前:TTL = 1.52/(log(发布距现在秒数/21600+4))^1.3
    • 修改后:TTL = 1.52/(log(发布距现在秒数/129600+4))^1.3
    • 修改前72小时后 ttl=0.406,修改后72小时后 ttl=0.712(>0.7)

贡献者:@Alexxinlu

2022/05/20 更新:

  • 热榜总榜更新

    • 标签权重体系整体优化,重点提升 “关键技术/前沿技术” 的权重,以及标签权重进一步细化与区分;
    • 修复 bug:行为数据中会员身份未去重,导致重复计算;

2022/05/13 更新:

  • 热榜总榜更新

    • 修复bug:文章上榜后又掉榜的问题;
    • 修复bug:原力值过滤逻辑、B榜逻辑未生效问题;
    • 属于原力计划的文章提升权重,在原有得分的基础上乘以1.2,非原力计划文章权重不变。可增加原力计划文章的曝光;
    • 考虑 “评论/点赞/收藏/分享/关注” 用户的原力等级和会员身份,在原始值(例如:点赞数)的基础上乘以用户的原力等级,会员用户再乘以3。可在一定程度上降低低等级用户刷榜的问题。
    • 制定标签权重体系,给每个统一标签赋予 0-1 的权重,并根据文章最相关的标签以及标签权重,对文章得分进行调整(在原有得分的基础上乘以标签权重)。可通过标签体系来降低老技术文章的权重。(注:使用的是机器识别的标签)
  • 热榜领域榜更新
    • 基于文章标签以及标签权重得分体系,计算一篇文章的标签得分,并对文章得分进行调整(在原有得分的基础上乘以标签得分)。可在一定程度上过滤掉一个领域中不相关的文章。

贡献者:@Alexxinlu @行走的人偶 @幻灰龙 @softwareteacher

2022/04/24 更新:

综合热榜使用上了质量分(100分制),参考 【博文质量分计算】

  1. 质量分低于80分的不入围
  2. new_score = old_score * ( 质量分/100)
2022/03/30 更新:

改进领域榜,增加榜单说明:

  1. 增加“云原生”,“软件工程”,“后端” 三个领域榜,本周App/PC都会完成上线
  2. 对于用户反馈的“点赞,收藏”数据和榜单排名的关系,有些用户提到数据很多,但是名次不靠前,这里给一个更透明的说明:
    1. 目前只用App的交互数据
    2. 交互数据只算24小时内
2022/02/24 更新:

改进领域榜,调整规则

  1. 增加最低阅读数要求:50
  2. 增加最低原力值要求:30
  3. 增加最低博文长度要求:700-1500
  4. 增加标题党过滤
  5. 增加软文过滤
  6. 扩充领域标签池

贡献者:@幻灰龙 @佳昊 @PeasantWorker @行走的人偶

2021/12/27 更新:

综合热榜增加对用户投诉多的广告软文的识别和过滤。

2021/12/02 更新:

新增根据原力值计算N条命,插入到top11-top100的规则,具体计算方式如下:

  • 综合热榜A榜

    • A榜=直接根据热榜计算公式计算出来的热榜
  • 综合热榜隐藏B榜
    1. 所有用户都有原力, 专家我们会给他较高的原力;
    2. 每天更新一次,针对原力值Top300用户,计算N条命:N = 2 + math.ceil(原力值 / 最低原力值)
    3. 每小时计算这些用户的剩余生命值: R = N -(最近7天,上热榜top100里面的B榜文章个数)
    4. 每小时,上述用户R>0 并且文章在A榜top100-top500区间内的文章构成了B榜
  • 混合热榜
    • B榜的top50的文章,在A榜里的原始排名/5+10,插入到A榜11-100
2021/11/09更新:
  1. 上线了10/28号提到的时间衰减因子TTL归一化的调整。TTL从1开始随着时间平滑下降。
  2. 上线了同作者连续上榜次数衰减因子CH的调整:同一个作者过去72小时内上过top10的文章才会对后续文章的得分造成影响。

经过这两个调整,热榜博文的时间衰减粒度不再以小时迅速衰减。这里有一个和HackNews的不同需求是,博文上榜后需要在热榜上停留足够的时间,因此衰减不能过于剧烈。

衰减的问题解决后,下一步会再回归来改进上榜博文内容稀缺度问题。

2021/10/28更新:

前后对比,有效抑制了正文里提到的标题党和过于低质长博文的问题。

2021/10/27更新:

时间衰减因子(TTL) 归一化下,从1开始随着博文创建时间衰减,可以从 TTL 的曲线变化看到0-72个小时内因子的衰减,新公式需要跑下数据验证后再上线:

https://www.wolframalpha.com/input/?i=1.52%2F%28log%28x%2B4%29%29%5E1.3%2Cx%3E%3D0%2Cx%3C%3D12

  • 公式是:1.52/(log(x+4))^1.3,x>=0,x<=12
  • 其中x表示博文创建后经过了多少个6小时,72小时一共有12个衰减点,这个衰减频次可以根据同样的原理调整,通过这个方式也可以同时解决夜晚大家睡觉时博文热度被衰减的问题
  • 其中1.52是因子归一化到1-0的调整常量,1.52 = 1/(1/(log(0+4))^1.3),如果公式的其他系数做了调整,重算一下这个常量即可。
2021/10/27 更新:

新热榜每周NPS曲线,定期跟踪:

2021/10/27 更新:

增加了最低阅读量过滤,阅读量太低的直接不参与计算,刚创建的文章应该在其他渠道有一些冷启动的过程。但是阅读量是一个容易被刷的数据,该数据并不参与后续计算。

热榜问题分析

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

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

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

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

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

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

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

热榜算法考虑哪些方面?

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

首先,交互数据的平衡

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

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

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

第三,考虑内容的质量

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

第四,考虑内容的领域

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

参考成熟的算法

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

S=V∗(P−1)0.8(T+2)GS = 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∗CH∗P(T+2)1.1=热榜得分S = C * V * CH*\frac{P}{(T+2)^{1.1}} = 热榜得分 S=C∗V∗CH∗(T+2)1.1P​=热榜得分

C=w1∗titlescore+w2∗contentscorew1+w2=内容得分C = \frac{w1*titlescore + w2*contentscore}{w1+w2} = 内容得分 C=w1+w2w1∗titlescore+w2∗contentscore​=内容得分
V=areascore=领域得分V = areascore = 领域得分 V=areascore=领域得分
P=∑i=1nwi∗fi∑i=1nwi=交互数据得分P=\frac{\sum_{i=1}^{n}w_i*f_i}{\sum_{i=1}^{n}w_i} = 交互数据得分 P=∑i=1n​wi​∑i=1n​wi​∗fi​​=交互数据得分

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

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

其中,titlescoretitlescoretitlescore 和 contentscorecontentscorecontentscore 分别是AI服务计算标题质量分和内容质量分。主要使用 NLP 技术对内容数据做打分。

定期微调

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

贡献者

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


@幻灰龙 @卢昕 @佳昊 @刘鑫 @softwareteacher @雾晴
@FrigidWinter @youcans @曲鸟 @小小明-代码实体 @PeasantWorker
行走的人偶


–end–

NLP 实战 (7) | 热榜算法更新相关推荐

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

    更新2022 04/12 暂时保留PHP 云原生/软件工程/后端 排序在前 CSDN 全站数据在2021年完成了标签体系的统一.在这个基础上: 用户可以在UC中心选择感兴趣的标签 博客/问答使用统一标 ...

  2. 清华大一Python作业太难上热榜!只上3节课,手撸AI算法,网友:离本科毕设只差一篇万字论文...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 太难了! ...

  3. 谷歌ALBERT模型V2+中文版来了:之前刷新NLP各大基准,现在GitHub热榜第二

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者:十三.发自.凹非寺 转自:量子位(QbitAI),未经允许不得二次转载 比BER ...

  4. 【python实战】不玩微博,一封邮件就能知道实时热榜,天秀吃瓜

    ❤️欢迎订阅<从实战学python>专栏,用python实现办公自动化.数据可视化.人工智能等各个方向的实战案例,有趣又有用!❤️ 更多精品专栏简介点这里 有的人金玉其表败絮其中,有的人却 ...

  5. Redis实战之百度首页新闻热榜

    目录 目标 功能 分析 代码实现 控制层 业务层 工具类 相关博文 目标 利用Redis实现类似百度首页新闻热榜功能. 功能 新闻排行榜以热度为指标降序排序,这里假设热度就是评论数量且统计的热度时间范 ...

  6. python自然语言处理实战 | NLP中用到的机器学习算法学习笔记

    这是对涂铭等老师撰写的<Python自然语言处理实战:核心技术与算法>中第9章NLP中用到的机器学习算法 的学习笔记. 这里写目录标题 文本分类:中文垃圾邮件分类 文本聚类实战:用K-me ...

  7. 【爬虫实战】Python 爬取起点热榜,再也不怕没有小说看了!

    最近看完一部小说<大奉打更人>,看得我热血沸腾.但是看完后,有选择困难症的我又不知道可以看什么了. 于是,我打算开发一个爬虫,爬取起点热榜. 一.导入所需库 我们使用 requests 来 ...

  8. html定位 知乎,从零开始:python实现爬取知乎热榜(随缘更新完善)

    获取URL 获取HTML 解析HTML 获取URL 首先要知道URL是什么: URL: Uniform Resource Identifier,即统一资源标识符. URL: Uniform Resou ...

  9. python爬虫实战(2)——爬取知乎热榜内容

    文章目录 一.前期准备 1.获取headers 2.查看网页源代码 二.python代码实现 1.解析网页 2.获取标签 3.完整代码 三.最终结果 一.前期准备 1.获取headers 登录知乎官网 ...

最新文章

  1. 垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
  2. go/git设置及取消代理方法
  3. ios如何判断键盘是否已经显示
  4. 关于JPQL UPDATE 语句的 一点体会
  5. (18)Vue DevTools插件
  6. et z201 php扩展,ET z201 时间型(Time)
  7. mui 批量上传图片 php,MUI+Hbuilder之多图片,单图片上传(五)
  8. 设计表的时候,对变长字段长度选择的一点思考
  9. 【鲁棒控制】平面2R型机器人的鲁棒逆推跟踪控制(matlab实现)
  10. python分布式定时任务_Python 定时任务框架 APScheduler 详解
  11. [HAOI2009]毛毛虫(树形dp)
  12. 跟上Java8 - 日期和时间实用技巧,转自知乎王爵nice
  13. mac远程控制pc电脑的方法 pc控制mac
  14. 【01背包】【DP】精卫填海(黄题)
  15. java实现空格替换
  16. 【报告分享】2021直播电商年度数据报告-抖音快手-果集数据(附下载)
  17. 人啊,除了健康,什么都是浮云
  18. 多线程:线程同步与死锁(卖票案例)、线程通信、生产者与消费者
  19. 计算机无法验证此文件,oxcoooo428无法验证此文件的数字签名的解决方法
  20. 解决TreeView的节点更改NodeFont后无法完全显示节点名的问题

热门文章

  1. oracle CONTAINS用法
  2. python glove训练模型_gensim加载Glove预训练模型
  3. 物理光学2 麦克斯韦方程组与电磁波
  4. P2P 之 UDP穿透NAT的原理与实现(附源代码)
  5. 【Java】递归法求n个元素的全排列
  6. outlook 邮箱过期问题处理
  7. PTA7-2 建国的数学难题(C语言)(递归方法)
  8. datagrid全选
  9. mysql括号被过滤_mysql必知必会--数 据 过 滤
  10. mysql 双机热备 原理,MySQL双机热备份的配置及原理