用 BERT 做中文新闻分类:THUCNews 十类跑到 88.43% 的几点记录
背景
课程项目要做中文新闻自动分类,数据用清华 THUCNews,十个类别:体育、财经、房产、家居、教育、科技、时尚、时政、游戏、娱乐。
先跑了一条传统基线(jieba + TF-IDF + 线性分类器),再换成 BERT 做对比,最终测试集准确率 88.43%。这篇记录几个关键判断和踩过的坑。
一、先有基线,再谈模型
顺序很重要:先跑通一条最朴素的链路,确认数据没有标签错位、类别分布没有严重倾斜,再换大模型。否则模型不涨点时,你分不清是模型不行还是数据有问题。
基线的作用是把「数据本身能到多少分」标定出来。中文新闻标题的类别信号其实很强,基线已经能到八成上下,留给模型的空间主要在长尾样本和易混类别上。
二、不要自己分词
这是最容易踩的坑。BERT 用的是字级 WordPiece,中文直接输入原句就好。先用 jieba 分词再喂给 BERT,等于人为切断了预训练阶段学到的字与字的组合关系,实测反而掉点。
同理,标点、空格、数字的清洗也要克制——预训练语料里本来就带着这些东西,清得太干净反而是分布偏移。
三、长度与截断
中文新闻的标题加首段通常只有几十个字。max_length 设太大,只是白白消耗显存和训练时长,指标不会有提升。
做法是先把训练集的长度分布拉出来,看分位数,取能覆盖绝大多数样本的值,剩下的长尾直接截断。新闻的类别信息一般集中在开头,截尾的损失是可控的。
四、最容易混的两组类别
从混淆矩阵看,错得最多的是「科技 / 教育」和「时尚 / 娱乐」这两组。
原因很直观:科技类新闻里经常出现高校、招生、人才培养这类表述;娱乐和时尚的用词高度重叠,明星、穿搭、活动经常同时出现。
处理思路有两个方向:
- 加类别特征或关键词先验,在预测层做约束;
- 或者承认边界本身就模糊,把评估重点从准确率换到更关注排序能力的指标上。
五、部署:让指标变成能演示的东西
训练完成后用 Flask 包了一层:前端一个输入框,后端加载模型做实时推理,返回类别和置信度。
这一步的价值经常被低估。它把「离线指标」变成了「可以当场给别人看的东西」——课程答辩或者工作汇报里,能点一下就看到结果,比贴一张 loss 曲线有说服力得多。
六、一点反思
88.43% 不是终点。真正值得追问的是:剩下那 11% 错在哪里、错得有没有规律、业务上能不能接受这类错误。
分类任务做到后面,模型结构带来的边际收益越来越小,数据处理和错误分析的边际收益反而更大。这也是这次项目里感受最深的一点。
小结
- 先基线,后模型;
- 中文不要自己分词;
- 截断长度按分位数定,不要拍脑袋;
- 混淆矩阵比准确率更有信息量;
- 套一层 Web demo,让结果可被验证。
- 点赞
- 收藏
- 关注作者
评论(0)