文本分类或者说文本打标是一个非常非常非常常见的任务,尤其是做内容的公司,当然做商品的公司也是需要的,如何能够快速准确的实现一个文本多分类任务,今天就把这个项目分享一下。
今天我给大家推荐一个多层多标签文本分类工具包--NeuralClassifier。它是腾讯开源的文本分类项目,是可以快速实现分层多标签分类任务的神经模型。
NeuralClassifier 当前提供了多种文本编码器,例如:FastText,TextCNN,TextRNN,RCNN,VDCNN,DPCNN,DRNN,AttentiveConvNet 和 Transformer 等。
我们可以使用 NeuralClassifier 执行以下分类任务。
项目的整体框架
项目的整体架构如下图所示:
先看最底层的输入层,这里可以是词、词的组合、字符以及字符的组合。另外,关键词和主题特征也可以加入输入特征。
然后是嵌入层,可以使用不同的 Embedding 方式,包括预训练、位置、随机编码等。
接着是编码层,这层可以用不同的算法来实现。
最后是输出层,根据不同的任务类型输出不同的结果。我们重点针对第四个任务来讲解下。
多层多标签的任务
在实际场景中,我们经常遇到的不是单纯的多分类问题,而是一个比较复杂的分类体系。对应本项目的分类体系文件位于 data/rcv1.taxonomy,以树的形式展示。我们来看下这个文件吧。
第一行表示存在四个一级分类,分别为 CCAT、ECAT、GCAT、MCAT。第二行代表 CCAT 下拥有的二级分类。第三行表示 C15 拥有的三级分类,以此类推。
我们把这些数据整理成表格会更清楚,以 CCAT 分类为例:
一级分类 | 二级分类 | 三级分类 | 四级分类 |
---|---|---|---|
CCAT | C11 | ||
C12 | |||
C13 | |||
C14 | |||
C15 | C151 | C1511 | |
C152 | |||
C16 | |||
C17 | C171 | ||
C172 | |||
C173 | |||
… | |||
… |
我们再来看下本项目的训练集:
{"doc_label": ["C15", "C152", "CCAT"], "doc_token": ["Year", "June", "in", "billions", "yen", "unless", "specified", "LATEST", "ACTUAL", "Parent", "FORECAST", "YEARAGO", "Sales", "Current", "mln", "Net", "mln", "mln", "EPS", "yen", "yen", "Ord", "div", "yen", "yen", "NOTE", "Snow", "Brand", "Seed", "producer", "seller", "pasture", "feed", "crop", "seeds", "seedlings"], "doc_keyword": [], "doc_topic": []}
可以看到,多层多标签的任务会将每条数据都给到这条数据的标签以及标签的父级标签。
接下来,我们就来看看该项目是如何真正运行使用的。
开发环境
模型训练
python train.py conf/train.json
conf/train.json 里包含任务配置信息,如果是多层多标签任务,配置多标签任务:("label_type": "multi_label"),具有层级结构 ("hierarchical": true)。配置里可以选择你要使用的算法模型,FastText、TextCNN、TextRNN、TextRCNN、DRNN、VDCNN、DPCNN、AttentiveConvNet、Transformer 都可以。比如要使用 FastText:("model_name": "TextCNN")。
模型验证和预测
python eval.py conf/train.json
python predict.py conf/train.json data/predict.json
最后我们展示下本项目的效果表现如何,如下表:
Text Encoders | Hierarchical | Flat | ||
---|---|---|---|---|
Micro-F1 | Macro-F1 | Micro-F1 | Macro-F1 | |
TextCNN | 0.7717 | 0.5246 | 0.7367 | 0.4224 |
TextRNN | 0.8152 | 0.5458 | 0.7546 | 0.4505 |
RCNN | 0.8313 | 0.6047 | 0.7955 | 0.5123 |
FastText | 0.6887 | 0.2701 | 0.6865 | 0.2816 |
DRNN | 0.7846 | 0.5147 | 0.7506 | 0.445 |
DPCNN | 0.822 | 0.5609 | 0.7423 | 0.4261 |
VDCNN | 0.7263 | 0.386 | 0.711 | 0.3593 |
AttentiveConvNet | 0.7533 | 0.4373 | 0.7511 | 0.4286 |
RegionEmbedding | 0.778 | 0.4888 | 0.764 | 0.4617 |
Transformer | 0.7603 | 0.4274 | 0.7602 | 0.4339 |
Star-Transformer | 0.7668 | 0.484 | 0.7618 | 0.4745 |
最最后,给大家附加上项目的 GitHub 地址:https://github.com/Tencent/NeuralNLP-NeuralClassifier,感兴趣的小伙伴快去学习吧。