用 BERT 做中文新闻分类:THUCNews 十类跑到 88.43% 的几点记录

举报
yd_218054167 发表于 2026/10/21 14:28:45 2026/10/21
【摘要】 THUCNews 十类中文新闻分类实践:从传统基线到 BERT,测试集准确率 88.43%。记录了分词、截断长度、易混类别分析与 Flask 部署中的几个关键判断。

背景

课程项目要做中文新闻自动分类,数据用清华 THUCNews,十个类别:体育、财经、房产、家居、教育、科技、时尚、时政、游戏、娱乐。

先跑了一条传统基线(jieba + TF-IDF + 线性分类器),再换成 BERT 做对比,最终测试集准确率 88.43%。这篇记录几个关键判断和踩过的坑。

一、先有基线,再谈模型

顺序很重要:先跑通一条最朴素的链路,确认数据没有标签错位、类别分布没有严重倾斜,再换大模型。否则模型不涨点时,你分不清是模型不行还是数据有问题。

基线的作用是把「数据本身能到多少分」标定出来。中文新闻标题的类别信号其实很强,基线已经能到八成上下,留给模型的空间主要在长尾样本和易混类别上。

二、不要自己分词

这是最容易踩的坑。BERT 用的是字级 WordPiece,中文直接输入原句就好。先用 jieba 分词再喂给 BERT,等于人为切断了预训练阶段学到的字与字的组合关系,实测反而掉点。

同理,标点、空格、数字的清洗也要克制——预训练语料里本来就带着这些东西,清得太干净反而是分布偏移。

三、长度与截断

中文新闻的标题加首段通常只有几十个字。max_length 设太大,只是白白消耗显存和训练时长,指标不会有提升。

做法是先把训练集的长度分布拉出来,看分位数,取能覆盖绝大多数样本的值,剩下的长尾直接截断。新闻的类别信息一般集中在开头,截尾的损失是可控的。

四、最容易混的两组类别

从混淆矩阵看,错得最多的是「科技 / 教育」和「时尚 / 娱乐」这两组。

原因很直观:科技类新闻里经常出现高校、招生、人才培养这类表述;娱乐和时尚的用词高度重叠,明星、穿搭、活动经常同时出现。

处理思路有两个方向:

  • 加类别特征或关键词先验,在预测层做约束;
  • 或者承认边界本身就模糊,把评估重点从准确率换到更关注排序能力的指标上。

五、部署:让指标变成能演示的东西

训练完成后用 Flask 包了一层:前端一个输入框,后端加载模型做实时推理,返回类别和置信度。

这一步的价值经常被低估。它把「离线指标」变成了「可以当场给别人看的东西」——课程答辩或者工作汇报里,能点一下就看到结果,比贴一张 loss 曲线有说服力得多。

六、一点反思

88.43% 不是终点。真正值得追问的是:剩下那 11% 错在哪里、错得有没有规律、业务上能不能接受这类错误。

分类任务做到后面,模型结构带来的边际收益越来越小,数据处理和错误分析的边际收益反而更大。这也是这次项目里感受最深的一点。

小结

  • 先基线,后模型;
  • 中文不要自己分词;
  • 截断长度按分位数定,不要拍脑袋;
  • 混淆矩阵比准确率更有信息量;
  • 套一层 Web demo,让结果可被验证。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。