NLP-Tools

摘要

本文提供并介绍一个NLP模型工具箱,能够完成“分类”,“序列标注”,“文本匹配”和“文本生成”这四种常见的NLP任务,每类任务都提供多种模型供用户进行使用,用户只需要按照规范准备训练数据,使用本工具箱就可以训练得到模型,并且可以直接使用本框架提供的java客户端调用wpai平台获取预测结果(离线训练和在线预测需要用户手工执行,本框架会提供“在线预测”中预测文件的解析代码),用户无需任何编码工作。

前言

NLP有四类常见的任务,分别是分类,序列标注,文本匹配和文本生成,在实际应用中,这四类任务能够解决大多数场景的问题。
目前为止深度学习模型的构建还是基于一些基础的模块,比如rnn,cnn,transformer等。上述四类常见的任务,底层都需要对输入进行编码,并且这些任务的底层编码器基本都可以共用。因此,我们提供了一套工具,对这四类任务常用到的模型进行拆解,把相同的模块进行了封装,抽象成了一个统一的框架,对外提供统一的接口。
NLP-Tools具有如下的特点:

  1. 用户无需编码。对每种任务,我们定义了标准的输入文件格式,并提供标准的输出格式,用户只需要按照规范准备训练数据,就可以直接使用本框架提供的java客户端调用wpai平台获取预测结果,用户不需要任何编码工作。
  2. 模型训练简单。使用者只需要改变配置即可改变模型结构和训练方式,不需要改变代码。
  3. 多种模型可选。每个任务,我们都提供了多种业界最常见的模型,对于同一个任务,同一份数据集,用户可以跑多个模型比较效果,然后选择最好的模型。
  4. 简单使用wpai平台。 NLP-Tools提供导出saved_model的功能,“离线训练”后可以直接在wpai平台进行部署(提供“在线预测”中预测文件的解析代码,用户不用自己编写),并且提供java客户端调用wpai平台获取预测结果。
  5. 可以进行单条数据测试。提供单条数据测试的功能,让使用者更直观地感受模型的训练效果。

下面会分别介绍每种基本任务,最后介绍NLP-Tools工具的架构和使用方式。

文本分类任务

文本分类任务是NLP中最常见也最实用的任务:对于给出的文本,我们来判断这条文本所属的类别。

文本分类任务架构如下:


classification.png

其中encoder是对输入text进行编码,生成表示text的vec,然后接一层全连接层,最后跟一层softmax,计算出每个label的概率。本工具集成的模型有cnn,rnn,transformer,bert和albert(后续会集成进更多的分类模型)。bert在各种NLP任务中都表现得非常出色,但是由于模型结构复杂,线上推理耗时较长。albert使用了参数共享的方法,但是在bert的基础上减少了隐藏层维度,并减少了层数,使得推理速度加快。

序列标注任务

常用的序列标注任务包括:分词,命名实体识别和词性标注。其中命名实体识别最为常用,指的是识别出文本中具有特定意义的实体,比如人名,地名或者专有名词。

序列标注任务架构如下:


labeling.png

其中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表示相似)。
序列标注任务架构如下:


matching.png

语义匹配任务目前有三种常用的模型架构:

  1. representation-based 类模型,思路是基于 Siamese 网络,提取文本整体语义再进行匹配。上图中表示为encoder->matching,不需要interaction。
  2. interaction-based 类模型,思路是捕捉直接的匹配信号(模式),将词间的匹配信号作为灰度图,再进行后续建模抽象。上图中表示为encoder->interaction->matching。
  3. bert类模型,思路是对text1和text2直接建模,进行分类。上图中表示为Bert-2->matching,其中Bert-2表示Bert的第二种训练任务。
    本框架目前只集成了representation-based类和bert类模型,后续会集成进来interaction-based 类模型。

文本生成

序列生成是自然语言处理里面很重要的一个任务:对于特定的输入,生成自然语言。比如,输入可以是图片时,输出是对图片的描述;输入是一句话时,输出是这句话的回应。本项目中的文本生成,输入和输出都是文本。目前常见的序列生成任务模型基本都是encoder-decoder结构的网络,比如rnn,transformer和GPT。

序列标注任务架构如下:


seq2seq.png

目前本工具只集成了rnn模型做文本生成,后续会集成进来transformer和GPT。

NLP-Tools介绍

1. 整体架构介绍

通过上述对四种任务的介绍,我们可以看出四种任务的encoder层可以共用,只是每种任务的decoder层各有不同,结构如下:


NLP.png

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调用的输入输出定义如下:

java-client.png

client目录下的文件是客户端调用文件,每个文件提供main函数提供直接调用,只需要java文件中的TASK_ID即可。
impl目录下的文件是预测解析文件,用户只需要把PredictiOnline后面的任务改为自己的taskid,并打成jar包即可使用。

3. demo页面

对于每个任务本文都训练了一个模型,然后提供web页面来调用。

3.1 classification任务

classification-web.png
  • 测试地址:http://10.126.86.69:9966/ailab/classification?text=刚买来就坏了,再也不想要了
  • 数据集:京东商品评论情感分类
  • 模型:transformer
  • result中的NEG表示负情感的概率,POS表示正情感的概率

3.2 labeling任务

labeling-web.png
  • 测试地址:http://10.126.86.69:9966/ailab/labeling?text=我在去年七月份曾经去过中国的北京
  • 数据集:98年人民日的命名实体数据集,标注了时间(TIM),地点(LOC),人物(PER)和机构(ORG)
  • 模型:transformer+crf
  • result表示输入text的字对应的BIO序列,从中我们看到识别出来了时间去年七月份,地点中国北京

3.3 matching任务

matching-web.png
  • 测试地址:http://10.126.86.69:9966/ailab/matching?text1=找工作网站哪个好?&text2=用哪个网站找工作比较好啊
  • 数据集:LCQMC(大规模中文问题匹配)数据集
  • 模型:双transformer(representation-based结构)
  • result中的NEG表示text1和text2不相似的概率,POS表示相似的概率

3.4 seq2seq任务

seq2seq-web.png
  • 测试地址:http://10.126.86.69:9966/ailab/seq2seq?text=半夜空庭明月色
  • 10w对对联
  • rnn结构的seq2seq
  • result中是seq2seq给出的下联

后续计划

  1. 分别详细介绍每种任务,包括常用模型,评测指标,常用数据集等。并且会挑选一种数据集,使用NLP-Tools工具评测该数据集在多种模型上的效果对比。
  2. 完善每种任务的模型类别,跟进业界最新的模型。

你可能感兴趣的:(NLP-Tools)