ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

THUCNews数据集实战:从文本分类预处理到TextCNN基线构建

THUCNews数据集实战:从文本分类预处理到TextCNN基线构建 简介在中文自然语言处理NLP任务中文本分类是最经典的基础应用无论是新闻资讯内容打标、舆情系统领域识别还是推荐系统冷启动都依赖可靠的分类模型。THUCNews作为清华大学发布的中文新闻分类基准数据集以84万篇真实新浪新闻、14个类别成为入门与对比实验的标配。其数据源自2005至2011年历史存档经清洗整理后类别覆盖体育、娱乐、科技等常见频道样本分布贴近真实业务场景。使用该数据集时需掌握从文件读取、标签映射、分词、词表构建到词向量训练的全流程。以TextCNN为基线模型配合word2vec预训练向量可在几十万样本上快速验证分类效果。该数据集兼具学术规范性与工业实用性适合作为中文文本分类技术原理学习与工程落地的桥梁。 做中文NLP这几年但凡要跑文本分类的基线实验THUCNews几乎是我默认的第一个数据集。84万篇新闻、14个分类由清华大学自然语言处理实验室整理发布这几个数字对中文自然语言处理入门的开发者来说应该非常熟悉。它最大的特点是真实数据全部来自新浪新闻的历史存档不是人工合成的样本每一行都是一条完整的新闻标题加正文拿来练手、跑基线、对比模型都相当顺手。这个数据集到底能做什么文本分类是NLP里最经典的任务无论是做新闻资讯App的内容打标还是做舆情系统的领域识别本质上都需要一套分类模型来兜底。THUCNews正是为这个任务量身定制的中文基准数据集适合做算法研究的初学者上手跑通全流程也适合需要快速验证模型效果的老手做对比实验。我会从数据下载、预处理到TextCNN基线训练再到调试优化踩过的坑把整个流程完整梳理一遍。1. 数据集整体设计与价值拆解1.1 数据集是怎么来的为什么要14类THUCNews由清华大学自然语言处理与社会人文计算实验室发布数据从新浪新闻2005年至2011年的历史数据中筛选而来。原始语料规模比现在公布的版本大得多团队经过去除低质量新闻、过滤重复内容、按新闻频道归类等一系列清洗工作最后整理出84万篇文档的版本。官方标注为14个类别但实验室内部还维护过更细粒度的版本比如把体育再拆成足球、篮球、综合等子类用于不同的评测任务。我们平时下载使用的大多是14个大类的版本官方也提供过一份74万篇的常用教学版本两者在样本分布上略有差异但任务定义完全一致。为什么是14类而不是10类或者20类我个人理解是它直接对应新浪新闻当时的频道体系涵盖体育、娱乐、家居、房产、教育、时尚、时政、游戏、科技、社会、财经、星座、彩票、健康这14个常见板块。类别之间边界相对清晰不会出现“一篇新闻既算科技又算教育”这种大面积重叠作为分类任务的标准答案非常合适。如果类别太粗比如只有二分类区分难度不够模型效果的差异体现不出来如果类别太细又容易引入标注噪声增加评估成本。14类的粒度在综合内容平台上刚好能对应到真实的频道运营场景这也是它后来成为中文文本分类默认基准的重要原因。1.2 它在中文NLP数据集里处在什么位置做文本分类英文圈子里最常用的数据集是AG News4类新闻分类和IMDb情感二分类规模都在几万到几十万。中文这边情感分类有ChnSentiCorp短文本匹配有LCQMC但要找一个覆盖面广、条目多、多类别均衡度还可以的新闻分类数据集THUCNews几乎是绕不开的选择。84万篇的体量比AG News大不少14个分类也更有挑战性同时因为是中文真实新闻还需要解决分词、中文标点、编码等特有的问题。换句话说训练一个THUCNews分类模型的过程基本等同于实战演练一遍中文文本分类的完整链路。和现在很多动辄上亿参数的预训练模型评测基准相比THUCNews可能显得“老派”但它始终是中文NLP文本分类的入门标配。我见过不少刚入门的同学先拿它跑通TextCNN再替换成BERT逐步理解从词向量、卷积到注意力机制、预训练模型的演进过程。它不追求极限难度胜在稳定、规范、容易复现这在学术场景里是判断一个数据集是否合格的重要标准。对工业场景来说THUCNews也不只是拿来练手的玩具很多新闻推荐、内容理解系统的早期原型都是用它的分类模型做冷启动验证的。1.3 影响范围从论文到工业界都在用从学术角度看THUCNews被广泛用作中文文本分类论文的基准数据集。一些做短文本分类、不均衡分类、小样本增强、数据增强的工作都会在THUCNews上报告结果用来证明提出的方法在通用新闻语料上的有效性。从开源项目角度看很多中文NLP教程和框架都内置了THUCNews的示例比如fastnlp、pytorch-nlp-tutorial、一些BERT实战项目入门同学几乎都能在某个仓库里见到它的身影。从教学角度看它和IMDb、MNIST在各自领域的地位类似是文本分类教学里最经典的案例之一。需要说明的是目前网络上下载THUCNews通常来自GitHub上各大开源项目整理好的副本常见的是cnews.14等命名方式。不同渠道拿到的文件在细微样本上可能有差异但整体不影响使用。我自己的习惯是固定从同一个来源下载把训练集、测试集划分固定下来这样论文对比和后续复现都更可靠。如果团队内部多人合作最好在项目文档里写清楚数据的来源链接和文件校验信息避免不同成员用的副本不一致导致实验结果对不上。2. 数据结构、格式与使用前准备2.1 拿到手先看清文件结构下载并解压后目录下一般会有train.txt、test.txt、dev.txt三个文件有的版本会多一个class.txt用来记录类别名单。常见划分是训练集约49万条验证集约0.7万条测试集约0.7万条不同整理版本会有些差异但都能满足日常实验需求。文件本身没有表头每一行是一条样本字段之间用Tab制表符分隔第一列是类别标签第二列是新闻内容。新闻内容通常由标题和正文直接拼接而成原始新闻里的换行、空行在清洗时已经处理掉读进来是干净的一行文本。这里有个容易忽略的点Windows环境下用Excel直接打开这种txt文件容易把UTF-8编码识别成ANSI看到一堆乱码就以为数据坏了。实际上用代码读取完全没问题关键是指定正确的编码参数。新闻文本里偶尔会出现特别长的段落、全角半角混合标点、英文逗号、数字百分比等这些在后续预处理环节都需要统一处理否则分词和词表构建会受到影响。2.2 标签体系与样本分布速览14个类别分别是体育、娱乐、家居、房产、教育、时尚、时政、游戏、科技、社会、财经、星座、彩票、健康。从样本数量看体育、娱乐、科技这类大频道因为新闻生产量大训练集中各约有6万余条星座、彩票属于垂直内容样本相对少一些约4万到5万条。总体不算完全均衡但也没有特别离谱的偏斜这种分布反而很接近真实业务场景——热门领域天然内容更多垂直领域内容天然更少。类别标签在原始文件里直接用中文存储模型训练前需要映射成整数ID。这里建议写一个固定顺序的类别映射字典保存成json文件训练和预测阶段都从同一个文件读入。我见过有人图省事在代码里用set去重生成映射结果每次运行顺序不同训练和推理阶段标签错位最后整个模型形同虚设。这种低级错误一旦发生排查起来反而最浪费时间所以数据准备阶段多花两分钟后面能省两小时。2.3 用pandas快速读取并检查数据读取THUCNews最直接的方式是用pandasimport pandas as pd train_df pd.read_csv(train.txt, sep\t, headerNone, names[label, text]) dev_df pd.read_csv(dev.txt, sep\t, headerNone, names[label, text]) test_df pd.read_csv(test.txt, sep\t, headerNone, names[label, text]) print(train_df.shape, dev_df.shape, test_df.shape) print(train_df[label].value_counts()) print(train_df[text].str.len().describe())跑完之后检查两个维度一是是否有缺失值、是否有空行二是每个类别的样本量是否符合预期。我遇到过的几个版本数据质量都不错基本没有缺失。如果发现某一行只有一个字段多半是文本内部残留了Tab符号可以用split(\t, 1)的方式只拆第一个分隔符保留后续内容作为文本这样更稳妥。另外建议顺手看一下text的长度分布这对后面设定文本截断长度很有参考价值。3. 从数据到模型构建一个文本分类基线3.1 分词与序列化中文NLP的必经之路中文不像英文有天然的空格分词所以构建模型前的第一步通常是分词。我最早用的是jieba后来也试过pkuseg和清华的thulac综合来看jieba速度快、稳定、社区资料多非常适合用来搭建基线。分词之后一般会去除停用词这里推荐用一份通用中文停用词表把“的”“了”“和”“是”这类高频虚词过滤掉。但注意不要过度去停用词新闻分类里某些看似虚词的字眼可能承载着语气和程度信息去掉太多反而会掉分具体阈值需要拿验证集测一轮。分词完成后要构建词表按词频统计排序后截断到指定大小。常见做法是保留词频前20000到50000个词未登录词统一映射到UNK同时加入PAD填充符号。THUCNews的正文往往很长全量塞进模型既不划算也没必要我习惯把输入长度限制在300个token左右。处理时还要统一做小写转换、数字归一化等操作虽然这些操作听起来简单但在新闻文本里各种英文缩写、百分比、日期格式非常常见提前处理好可以避免词表膨胀。3.2 词嵌入用word2vec还是随机初始化词嵌入是TextCNN这类模型的关键输入。一种做法是直接用随机初始化的Embedding层让模型在训练中自己学习简单省事另一种是先用训练数据训练一个word2vec模型把词向量作为Embedding初始值训练过程中选择微调或冻结。我的经验是在THUCNews这种几十万条规模的数据集上用数据自带语料训练一个128维的word2vec当作初始化比随机初始化稳定提升1到2个百分点而且训练word2vec本身只需要几分钟。这里有一个很容易踩的坑word2vec训练时的分词逻辑必须和后续预处理保持一致否则词表对不上Embedding矩阵里会出现大量未登录词。我曾经先用jieba分词训练word2vec后来在预处理时又决定去除停用词本文还有配套的精品资源点击获取
返回列表