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

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

后续计划

  1. 分别详细介绍每种任务,包括常用模型,评测指标,常用数据集等。并且会挑选一种数据集,使用NLP-Tools工具评测该数据集在多种模型上的效果对比。
  2. 完善每种任务的模型类别,跟进业界最新的模型。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 本文上两篇系列 NLP的巨人肩膀(上) NLP的巨人肩膀(中) 4.6 Bidirectional Encoder...
    weizier阅读 6,212评论 1 22
  • 他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-O...
    重新出发_砥砺前行阅读 526评论 0 0
  • 微软亚洲研究院:NLP将迎来黄金十年 比尔·盖茨曾说过,「语言理解是人工智能皇冠上的明珠」。自然语言处理(NLP,...
    Quincy_baf0阅读 1,112评论 0 11
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 13,649评论 2 64
  • 真正对美有追求的人,对美的追求是没有下限的。 所以丑就被从美的背后揪出来了——别以为你改个名字就没人认识了,你其实...
    wahow阅读 340评论 0 0