摘要
本文提供并介绍一个NLP模型工具箱,能够完成“分类”,“序列标注”,“文本匹配”和“文本生成”这四种常见的NLP任务,每类任务都提供多种模型供用户进行使用,用户只需要按照规范准备训练数据,使用本工具箱就可以训练得到模型,并且可以直接使用本框架提供的java客户端调用wpai平台获取预测结果(离线训练和在线预测需要用户手工执行,本框架会提供“在线预测”中预测文件的解析代码),用户无需任何编码工作。
前言
NLP有四类常见的任务,分别是分类,序列标注,文本匹配和文本生成,在实际应用中,这四类任务能够解决大多数场景的问题。
目前为止深度学习模型的构建还是基于一些基础的模块,比如rnn,cnn,transformer等。上述四类常见的任务,底层都需要对输入进行编码,并且这些任务的底层编码器基本都可以共用。因此,我们提供了一套工具,对这四类任务常用到的模型进行拆解,把相同的模块进行了封装,抽象成了一个统一的框架,对外提供统一的接口。
NLP-Tools具有如下的特点:
- 用户无需编码。对每种任务,我们定义了标准的输入文件格式,并提供标准的输出格式,用户只需要按照规范准备训练数据,就可以直接使用本框架提供的java客户端调用wpai平台获取预测结果,用户不需要任何编码工作。
- 模型训练简单。使用者只需要改变配置即可改变模型结构和训练方式,不需要改变代码。
- 多种模型可选。每个任务,我们都提供了多种业界最常见的模型,对于同一个任务,同一份数据集,用户可以跑多个模型比较效果,然后选择最好的模型。
- 简单使用wpai平台。 NLP-Tools提供导出saved_model的功能,“离线训练”后可以直接在wpai平台进行部署(提供“在线预测”中预测文件的解析代码,用户不用自己编写),并且提供java客户端调用wpai平台获取预测结果。
- 可以进行单条数据测试。提供单条数据测试的功能,让使用者更直观地感受模型的训练效果。
下面会分别介绍每种基本任务,最后介绍NLP-Tools工具的架构和使用方式。
文本分类任务
文本分类任务是NLP中最常见也最实用的任务:对于给出的文本,我们来判断这条文本所属的类别。
文本分类任务架构如下:
其中encoder是对输入text进行编码,生成表示text的vec,然后接一层全连接层,最后跟一层softmax,计算出每个label的概率。本工具集成的模型有cnn,rnn,transformer,bert和albert(后续会集成进更多的分类模型)。bert在各种NLP任务中都表现得非常出色,但是由于模型结构复杂,线上推理耗时较长。albert使用了参数共享的方法,但是在bert的基础上减少了隐藏层维度,并减少了层数,使得推理速度加快。
序列标注任务
常用的序列标注任务包括:分词,命名实体识别和词性标注。其中命名实体识别最为常用,指的是识别出文本中具有特定意义的实体,比如人名,地名或者专有名词。
序列标注任务架构如下:
其中encoder是对输入text进行编码,生成表示text的vec,然后对vec使用crf进行解码,生成解码序列。对于序列标注任务来说,深度学习里常用的模型有bilstm+crf,idcnn+crf,transformer+crf,bert+crf,本框架均有集成。
语义匹配任务
文本匹配任务,即对于用户输入的query,找到与query语义上最匹配的doc。比如对于网页搜索,query是用户输入,doc是所有的网页;对于智能客服来说,query是用户输入的问题,doc是所有的标准问题。对于文本匹配任务,通常会抽象为:判断两个输入text1和text2是否相似(0表示不相似,1表示相似)。
序列标注任务架构如下:
语义匹配任务目前有三种常用的模型架构:
- representation-based 类模型,思路是基于 Siamese 网络,提取文本整体语义再进行匹配。上图中表示为encoder->matching,不需要interaction。
- interaction-based 类模型,思路是捕捉直接的匹配信号(模式),将词间的匹配信号作为灰度图,再进行后续建模抽象。上图中表示为encoder->interaction->matching。
- bert类模型,思路是对text1和text2直接建模,进行分类。上图中表示为Bert-2->matching,其中Bert-2表示Bert的第二种训练任务。
本框架目前只集成了representation-based类和bert类模型,后续会集成进来interaction-based 类模型。
文本生成
序列生成是自然语言处理里面很重要的一个任务:对于特定的输入,生成自然语言。比如,输入可以是图片时,输出是对图片的描述;输入是一句话时,输出是这句话的回应。本项目中的文本生成,输入和输出都是文本。目前常见的序列生成任务模型基本都是encoder-decoder结构的网络,比如rnn,transformer和GPT。
序列标注任务架构如下:
目前本工具只集成了rnn模型做文本生成,后续会集成进来transformer和GPT。
NLP-Tools介绍
1. 整体架构介绍
通过上述对四种任务的介绍,我们可以看出四种任务的encoder层可以共用,只是每种任务的decoder层各有不同,结构如下:
2. 使用方式
在深度学习中,训练一个模型一般需要两类参数,一类是模型参数,用来设置模型的结构,比如lstm有多少层,cnn卷积核的大小等;另一类是训练参数,比如学习率,训练集路径,训练的epoch数量等。在本工具中,模型参数我们使用配置文件,训练参数我们使用命令行。用户只需要对两类参数进行配置就可以直接训练,不需要修改任何代码。
下面定义了四种任务训练数据的输入格式,用户只需要按照要求提供训练数据,借助NLP-TOOLS工具,就可以在wpai平台直接进行离线训练,训练完之后在wpai平台进行“在线预测”部署,NLP-TOOLS工具提供了java版的scf客户端,可以让用户直接调用“在线预测”部署的模型,获取输出。
下面会分别介绍输入文件格式定义,模型输出定义,然后介绍下wpai平台详细操作流程。
2.1 输入输出
classification任务:
输入文件格式定义:
sentence[SEP]label
labeling任务输入文件格式定义:
其中char1-char3是sentence1的字,label1-label3是char1-char3对应的BIO标注,char和label之间用空格分隔;其中char4-char7是sentence2的字,label4-label7是char4-char7对应的BIO标注。sentence1和sentence2之间用\n 分隔。
# sentence1
char1 label1
char2 label2
char3 label3
# sentence2
char4 label4
char5 label5
char6 label6
char7 label7
matching任务输入文件格式定义:
sentence1[SEP]sentence2[SEP]label
seq2seq任务输入文件格式定义:
sentence1[SEP]sentence2
2.2 详细操作
(1) 离线训练
按照如下方式配置wpai就可以直接进行训练。
mkdir -p /workspace/model && hadoop fs -get /home/hdp_teu_dia/guesslike/user/chenlu17/wpai/nlp-tools/python-core . && cd python-core &&
python run.py --task_name=classification
--model_name=transformer
--config_file=grocery/config/transformer_config.json
--do_train=true
--do_eval=true
--do_export=true
--do_predict_single=false
--data_dir=grocery/jd_comments_emotions.out
--middle_dir=grocery/data
--vocab_file=grocery/vocab.txt
--max_seq_length=40
--train_batch_size=32
--learning_rate=5e-4
--num_train_epochs=5.0
--output_dir=/workspace/model
--config_labels=grocery/labels.yml
--init_checkpoint_path=
--re_convert_tfrecord=true
- task_name:从classification,labeling,matching和seq2seq四种模型中选一个
- config_file:模型配置文件路径
- do_export:是否导出pb文件
- init_checkpoint_path:预训练文件的路径
(2) 在线预测
本项目提供了wpai在线预测解析的jar包,并提供客户端scf的调用代码。
客户端scf调用的输入输出定义如下:
client目录下的文件是客户端调用文件,每个文件提供main函数提供直接调用,只需要java文件中的
TASK_ID
即可。
impl目录下的文件是预测解析文件,用户只需要把PredictiOnline后面的任务改为自己的taskid,并打成jar包即可使用。
3. demo页面
对于每个任务本文都训练了一个模型,然后提供web页面来调用。
3.1 classification任务
- 测试地址:http://10.126.86.69:9966/ailab/classification?text=刚买来就坏了,再也不想要了
- 数据集:京东商品评论情感分类
- 模型:transformer
- result中的
NEG
表示负情感的概率,POS
表示正情感的概率
3.2 labeling任务
- 测试地址:http://10.126.86.69:9966/ailab/labeling?text=我在去年七月份曾经去过中国的北京
- 数据集:98年人民日的命名实体数据集,标注了时间(TIM),地点(LOC),人物(PER)和机构(ORG)
- 模型:transformer+crf
- result表示输入text的字对应的BIO序列,从中我们看到识别出来了时间
去年七月份
,地点中国
和北京
3.3 matching任务
- 测试地址:http://10.126.86.69:9966/ailab/matching?text1=找工作网站哪个好?&text2=用哪个网站找工作比较好啊
- 数据集:LCQMC(大规模中文问题匹配)数据集
- 模型:双transformer(representation-based结构)
- result中的
NEG
表示text1和text2不相似的概率,POS
表示相似的概率
3.4 seq2seq任务
- 测试地址:http://10.126.86.69:9966/ailab/seq2seq?text=半夜空庭明月色
- 10w对对联
- rnn结构的seq2seq
- result中是seq2seq给出的下联
后续计划
- 分别详细介绍每种任务,包括常用模型,评测指标,常用数据集等。并且会挑选一种数据集,使用NLP-Tools工具评测该数据集在多种模型上的效果对比。
- 完善每种任务的模型类别,跟进业界最新的模型。