文本分类是自然语言处理中最常见的任务之一。从邮箱应用中的垃圾邮件识别到搜索引擎中的query意图判别,
再到商品评论中的情感分析, 这些其实都是我们身边对文本分类的常见需求。
为了帮助大家更好的应对经常遇到的文本分类场景,我最近开发了一个工具箱TextClf
,使用TextClf
,
你可以通过生成和修改配置文件,快速尝试多种分类算法模型、调整参数、搭建baseline,
有了这个工具箱,你可以从模型搭建、模型训练、模型测试等一系列复杂的实现中脱离出来, 让你能有更多精力关注于数据本身的特点,做针对性的改进优化。
如果你是一个文本分类任务的初学者,那么TextClf
的简单易用会让你很快上手。如果你是更高级的用户,
想尝试更多新奇的想法,比如搭建一个分类模型或者是使用你自己设计的训练方式),那么你也可以借助TextClf
,
在TextClf
基础上进行开发,它会帮你省下很多麻烦的工作。
TextClf的github主页在
https://github.com/luopeixiang/textclf
想直接看代码的同学可以移步GitHub。
下面我将主要通过以下几点来介绍TextClf
TextClf简介
概览
如前言所述,TextClf 是一个面向文本分类场景的工具箱,它的目标是可以通过配置文件快速尝试多种分类算法模型、调整参数、搭建baseline,从而让使用者能有更多精力关注于数据本身的特点,做针对性改进优化。
TextClf有以下这些特性:
- 同时支持机器学习模型如逻辑回归、线性向量机与深度学习模型如TextCNN、TextRNN、TextRCNN、DRNN、DPCNN、Bert等等。
- 支持多种优化方法,如
Adam
、AdamW
、Adamax
、RMSprop
等等 - 支持多种学习率调整的方式,如
ReduceLROnPlateau
、StepLR
、MultiStepLR
- 支持多种损失函数,如
CrossEntropyLoss
、CrossEntropyLoss with label smoothing
、FocalLoss
- 可以通过和程序交互生成配置,再通过修改配置文件快速调整参数。
- 在训练深度学习模型时,支持使用对
embedding
层和classifier
层分别使用不同的学习率进行训练 - 支持从断点(checkpoint)重新训练
- 具有清晰的代码结构,可以让你很方便的加入自己的模型,使用
textclf
,你可以不用去关注优化方法、数据加载等方面,可以把更多精力放在模型实现上。
与其他文本分类框架 NeuralClassifier 的比较:
-
NeuralClassifier
不支持机器学习模型,也不支持Bert/Xlnet等深度的预训练模型。 -
TextClf
会比NeuralClassifier
对新手更加友好,清晰的代码结构也会使得你能方便地对它进行拓展。 -
特别地,对于深度学习模型,
TextClf
将其看成两个部分,Embedding
层和Classifier
层。Embedding
层可以是随机初始化的词向量,也可以是预训练好的静态词向量(word2vec、glove、fasttext
),也可以是动态词向量如Bert
、Xlnet
等等。Classifier
层可以是MLP,CNN,将来也会支持RCNN,RNN with attention等各种模型。通过将
embedding
层和classifier
层分开,在配置深度学习模型时,我们可以选择对embedding
层和classifier
层进行排列组合,比如Bert embedding + CNN
,word2vec + RCNN
等等。这样,通过比较少的代码实现,
textclf
就可以涵盖更多的模型组合的可能。
系统设计思路
TextClf将文本分类的流程看成预处理、模型训练、模型测试三个阶段。
预处理阶段做的事情主要是:
- 读入原始数据,进行分词,构建词典
- 分析标签分布等数据特点
- 保存成二进制的形式方便快速读入
数据经过预处理之后,我们就可以在上面训练各种模型、比较模型的效果。
模型训练阶段负责的是:
- 读入预处理过的数据
- 根据配置初始化模型、优化器等训练模型必需的因素
- 训练模型,根据需要最优模型
测试阶段的功能主要是:
- 加载训练阶段保存的模型进行测试
- 支持使用文件输入或者终端输入两种方式进行测试
为了方便地对预处理、模型训练、模型测试阶段进行控制,TextClf
使用了json
文件来对相关的参数(如预处理中指定原始文件的路径、模型训练阶段指定模型参数、优化器参数等等)进行配置。运行的时候,只要指定配置文件,TextClf
就会根据文件中的参数完成预处理、训练或者测试等工作,详情可参见 快速开始 部分。
目录结构
textclf
源代码目录下有六个子目录和两个文件,每项的作用如下所示:
├── config # 包括预处理、模型训练、模型测试的各种参数及其默认设置
├── data # 数据预处理、数据加载的代码
├── models # 主要包括深度学习模型的实现
├── tester # 负责加载模型进行测试
├── __init__.py # 模块的初始化文件
├── main.py # textclf的接口文件,运行textclf会调用该文件中的main函数
├── trainer # 负责模型的训练
└── utils # 包含各种工具函数
安装
依赖环境:python >=3.6
使用pip安装:
pip install textclf
上述命令首先将代码clone
到本地, 然后切换到项目目录,使用pip
安装textclf
及其依赖。
之后就可以使用textclf
了!
快速开始
下面我们看一下如何使用textclf
训练模型进行文本分类。
在目录examples/toutiao
下有以下文件:
3900行 train.csv
600行 valid.csv
600行 test.csv
5100行 total
这些数据来自
今日头条新闻分类数据集,
在这里用作演示。
文件的格式如下:
下周一(5.7日)手上持有这些股的要小心 news_