对话系统之槽位提取
槽位提取是NER(Named Entity Recognition)技术在对话系统的应用,要想了解槽位提取的细节,本篇文章会先对NER进行系统介绍,然后再对槽位提取在龙小湖对话系统中的一些应用进行汇报。
NER简述
一、什么是NER
Named Entity Recognition(NER),指识别文本中具有特定意义的实体,主要包括人名、地名、机构名等专有名词。在对话机器人中,我们通过NER技术来提取对话中的实体词,即槽位词,以便用于控制对话逻辑跳转和标识对话关键词等。
二、NER主要方法
2.1 基于规则和词典的方法
一般来说,我们在做命名实体的时候,可以首先考虑一下可否使用正则。假如命名实体的名称规律比较简单,我们可以找出模式,然后设计相应的正则表达式或者规则,然后把符合模式的字符串匹配出来,作为命名实体识别的结果。
这种NER系统的特点是高精确率与低召回率;然而难以迁移应用到别的领域中去,基于领域的规则往往不通用,对新的领域而言,需要重新制定规则且不同领域字典不同。
2.2 无监督学习方法
主要是基于聚类的方法,根据文本相似度得到不同的簇,表示不同的实体类别组。常用到的特征或者辅助信息有词汇资源、语料统计信息(TF-IDF)、浅层语义信息(分块NP-chunking)等。
2.3 基于特征的监督学习方法
NER可以被转换为一个分类问题或序列标记问题。分类问题就是判断一个词语是不是命名实体、是哪一种命名实体。常见的做法就是,基于一个词语或者字的上下文构造特征,来判断这个词语或者字是否为命名实体;序列标注问题就是给句子当中的每一个词打上标签,而后提取出我们所需要的关键词;标签的格式通常有IOB2和IOBES两种标准。
所以就会涉及到特征工程和模型选择上。
特征工程:word级别特征(词法特征、词性标注等),词汇特征(维基百科、DBpdia知识),文档及语料级别特征。
模型选择:隐马尔可夫模型、决策树、最大熵模型、最大熵马尔科夫模型、支持向量机、条件随机场。
2.4 深度学习方法
近年来,基于DL的NER模型占据了主导地位并取得了最先进的成果。与基于特征的方法相比,深度学习有利于自动发现隐藏的特征。NN把语言看做是序列数据,然后用自身极强的拟合能力,把这种序列转换为标签序列。BiLSTM+CRF方案结合了神经网络的拟合能力和CRF的全局视野,是非常经典、有效的一种NER模型结构。
1)BiLSTM+CRF
BiLSTM的输出作为CRF的发射概率矩阵,而CRF层可以加入一些约束来保证最终预测结果是有效的。这些约束可以在训练数据时被CRF层自动学习得到。
2)IDCNN+CRF
尽管BILSTM在NER任务中有很好的表现,但是却不能充分利用GPU的并行性,导致该模型的想能较差,因此出现了一种新的NER模型方案IDCNN+CRF。
在IDCNN+CRF模型结构中,待识别query先经过Embedding层获取向量表示;然后经过空洞卷积层(IDCNN),IDCNN通过空洞卷积增大模型的感受野, 相较于传统的CNN,IDCNN能够捕捉更长的上下文信息,更适合序列标注这类需要全局信息的任务;在IDCNN之后经过一层全连接神经网络(FF层)后引入CRF,同样CRF的目的在于防止非法槽位标记(BIO)的出现。
补充:尽管传统的CNN有明显的计算优势,但是传统的CNN在经过卷积之后,末梢神经元只能得到输入文本的一小部分信息,为了获取上下文信息,需要加入更多的卷积层,导致网络越来越深,参数越来越多,容易发生过拟合。
文本空洞卷积的示意图如下:
3)Bert+BiLSTM+CRF
Bert由谷歌大佬与2018年提出来,刚出来的时候横扫了11项NLP任务。BERT通过微调的方法可以灵活的应用到下游业务,所以这里我们也可以考虑使用Bert作为embedding层,将特征输入到Bilstm+CRF中,以谋求更好的效果。
NER模型之CRF的作用
在上述模型中,在NER任务上,我们看到很多深度学习之后都会接上一层CRF,那么CRF在整个过程中到底发挥着什么样的作用呢?通常我们直接使用逐帧softmax时,是将序列标注过程作为n个k分类问题,相当于每个token相互独立的进行分类(假设深度模型内部交互不明显的话),而采用CRF实质上是在进行一个k^n分类,相当于直接从所有的序列空间里找出转移概率最大的那条序列。其实质上是局部最优(token最优)与全局最优(序列最优)的区别,因而采用CRF能够有效避免出现非法的序列标记,从而确保序列有效。下图展示了一个softmax导致序列标注异常的案例。
三、NER模型效果优化
3.1 模型优化之数据增强
针对启动阶段存在的数据不足问题,可以采用数据增强的方式来补充训练数据,NER做数据增强,和别的任务有啥不一样呢?很明显,NER是一个token-level的分类任务,在进行全局结构化预测时,一些增强方式产生的数据噪音可能会让NER模型变得敏感脆弱,导致指标下降、最终奔溃。
参考论文《An Analysis of Simple Data Augmentation for Named Entity Recognition》主要是将传统的数据增强方法应用于NER中、并进行全面分析与对比。效果如何?
作者借鉴sentence-level的传统数据增强方法,将其应用于NER中,共有4种方式(如上图所示):
- Label-wise token replacement (LwTR) :即同标签token替换,采用二项分布概率对句子进行采样,概率替换某位置的token为同标签其它token,如果token长度不一致,则进行延展,句子长度发生变化。
- Synonym replacement (SR) :即同义词替换,利用WordNet查询同义词,然后根据二项分布随机替换。如果替换的同义词大于1个token,那就依次延展BIO标签。
- *Mention replacement (MR) :即实体提及替换,与同义词方法类似,利用训练集中的相同实体类型进行替换,如果替换的mention大于1个token,那就依次延展BIO标签,如上图:「headache」替换为「neuropathic pain syndrome」,依次延展BIO标签。
- Shuffle within segments (SiS) :按照mention来切分句子,然后再对每个切分后的片段进行shuffle。如上图,共分为5个片段: [She did not complain of], [headache], [or], [any other neurological symptoms], [.]. 。也是通过二项分布判断是否被shuffle(mention片段不会被shuffle),如果shuffle,则打乱片段中的token顺序。
- 总结规则模板,直接生成数据。(收益不小)
由上图得出以下结论:
- 各种数据增强方法都超过不使用任何增强时的baseline效果。
- 对于RNN网络,实体提及替换优于其他方法;对于Transformer网络,同义词替换最优。
- 总体上看,所有增强方法一起使用(ALL)会由于单独的增强方法。
- 低资源条件下,数据增强效果增益更加明显;
- 充分数据条件下,数据增强可能会带来噪声,甚至导致指标下降;
3.2 模型优化之词汇增强
有的学者开始另辟蹊径,利用外部词汇信息力求与BERT一战;
- Lattice LSTM:Chinese NER Using Lattice LSTM
引入词汇信息,在原有的输入序列的基础上添加匹配到的词汇作为额外的链路,整体看起来有点像ResNet
的短路链接,两端分别连接原始输入序列的词首尾,称之为Latttice-LSTM
。事实也证明词典带来的提升是明显的,一举超越BERT
,重回武林宝座。缺点: 计算性能低下,不能batch并行化;信息损失:每个字符只能 获取以它为结尾的词汇信息;可迁移性差;
该篇指出Latttice-LSTM
第一:速度太慢,第二:无法进行词汇匹配的选择。为了解决这两个问题,将原始输入序列按照词典匹配的词汇信息进行Bigram,Trigram
合并然后CNN
特征提取,然后将匹配到词汇信息,进行时间维度上attention计算后,利用Rethinking
机制,反馈到原始Bigram,Trigram
层,进行词汇匹配的选择,以解决词汇冲突的问题。
将引入的词汇作为额外的链路,与原始序列一起构建成输入图,字作为节点,链接是关系,然后通过对图进进行建模获得图节点的嵌入式表征,最后使用CRF进行解码。
- FLAT:Chinese NER Using Flat-Lattice Transformer(ACL2020)
FLAT的基本思想来源于Lattice-LSTM,Lattice-LSTM采取的RNN结构无法捕捉长距离依赖,同时引入词汇信息是有损的,同时动态的Lattice结构也不能充分进行GPU并行。为解决计算效率低下、引入词汇信息有损的这两个问题,FLAT基于Transformer结构进行了两大改进:
改进1:Flat-Lattice Transformer,无损引入词汇信息。FLAT不去设计或改变原生编码结构,设计巧妙的位置向量就融合了词汇信息。具体来说,对于每一个字符和词汇都构建两个head position encoding 和tail position encoding,词汇信息直接拼接到原始输入序列的末尾(避免了引入额外的链路,增加模型复杂度),并用位置编码与原始输入序列的对应位置相关联,间接指明了添加词汇所在的位置信息。
改进2:相对位置编码,让Transformer适用NER任务
- Lex-BERT: Enhancing BERT based NER with lexicons(2021)
Lex-BERT相比于FLAT有三点:1. 不需要利用word embedding;2. 可以引入实体类型type信息,作者认为在领域内,可以收集包含类型信息的词汇;3. 相比FLAT,Lex-BERT推断速度更快、内存占用更小;
- Simple-Lexicon
博客:Simplify the Usage of Lexicon in Chinese NER
词汇信息是有用的,但是如何使用,学术界还未形成统一。可以看得出来,上述文章在引入词汇的方式上五花八门,计算复杂度都比较高。Simple-Lexicon该篇论文直击痛点,对于词汇信息的引入更加简单有效,采取静态加权的方法可以提前离线计算。作者首先分析列举了几种引入词汇信息方法;最终论文发现,将词汇的信息融入到特殊token{B,M,E,S}
中,并和原始词向量进行concat,能够带来明显的提升。通过特殊token
表征额外信息的方式,在NER与NRE联合学习任务中也逐渐成为一种趋势。具体细节可参考视频讲解
总结
最后,我们来看一下,上述各种「词汇增强」方法在中文NER任务上的性能:
上图可以发现:总的来看,ACL2020中的FLAT和Simple-Lexicon效果最佳。具体地说:
- 引入词汇信息的方法,都相较于baseline模型biLSTM+CRF有较大提升,可见引入词汇信息可以有效提升中文NER性能。
- 采用相同词表对比时,FLAT和Simple-Lexicon好于其他方法。
- 结合BERT效果会更佳。
四、评估标准
NER任务的目标,通常是“尽量发现所有的命名实体,发现的命名实体要尽量纯净”,也就是要求查全率和查准率比较高。当然,场景也有可能要求其中一项要非常高。
通常通过与人类标注水平进行比较判断NER系统的优劣。评估分两种:精确匹配评估和宽松匹配评估。
4.1 精确匹配评估
NER任务需要同时确定实体边界以及实体类别。在精确匹配评估中,只有当实体边界以及实体类别同时被精确标出时,实体识别任务才能被认定为成功。
基于数据的 true positives(TP),false positives(FP),以及false negatives(FN),可以计算NER任务的精确率,召回率以及 F-score 用于评估任务优劣。
对NER中的 true positives(TP),false positives(FP)与false negatives(FN)有如下解释:
- true positives(TP):NER能正确识别实体
- false positives(FP):NER能识别出实体但类别或边界判定出现错误
- false negatives(FN):应该但没有被NER所识别的实体
P\R\F的计算公式如下:
精确率:
召回率:
F-score:
其中 F1 值又可以分为 macro-averaged 和 micro-averaged,前者是按照不同实体类别计算 F1,然后取平均;后者是把所有识别结果合在一起,再计算 F1。这两者的区别在于实体类别数目不均衡,因为通常语料集中类别数量分布不均衡,模型往往对于大类别的实体学习较好。
4.2 宽松匹配评估
简言之,可视为实体位置区间部分重叠,或位置正确类别错误的,都记为正确或按照匹配的位置区间大小评测。
五、经验总结
1、提升NER性能(performance)的⽅式往往不是直接堆砌⼀个BERT+CRF,这样做不仅效果不一定会好,推断速度也非常堪忧。就算BERT效果还不错,付出的代价也是惨重的。
就算直接使用BERT+CRF进行finetune,BERT和CRF层的学习率也不要设成一样,让CRF层学习率要更大一些(一般是BERT的5~10倍),要让CRF层快速收敛。
2、在NER任务上,也不要试图对BERT进⾏蒸馏压缩,很可能吃⼒不讨好。
哈哈,也许废了半天劲去蒸馏,效果下降到还不如1层lstm+crf,推断速度还是慢~
3、NER任务是⼀个重底层的任务,上层模型再深、性能提升往往也是有限的(甚至是下降的)。
不要盲目搭建很深的网络,也不要痴迷于各种attention了。
4、NER任务不同的解码方式(CRF/指针网络/Biaffine[1])之间的差异其实也是有限的,不要过分拘泥于解码⽅式。
5、通过QA阅读理解的方式进行NER任务,效果也许会提升,但计算复杂度上来了,你需要对同⼀⽂本进行多次编码(对同⼀文本会构造多个question)。
6、设计NER任务时,尽量不要引入嵌套实体,不好做,这往往是一个长尾问题。
7、不要直接拿Transformer做NER,这是不合适的,详细可参考TENER[2]。
8、1层lstm+CRF的基础上,引入更丰富的embedding特征(比如char、bigram、词典特征、词性特征、elmo等),并进行多策略组合,这大概率可以解决垂直领域的NER问题。除此之外,不要忘记一个快速提升的重要手段:规则+领域词典。
9、我们要更加稳妥地解决复杂NER问题(词汇增强、冷启动、低资源、噪声、不平衡、领域迁移、可解释、低耗时),这是一个需要权衡的过程,切记不要盲目追前沿,很多脏活累活还是要干一干的。
10、在垂直领域,如果可以预训练一个领域相关的字向量&语言模型,那是最好不过的了。
补充:TENER: Adapting Transformer Encoder for Named Entity Recognition
论文详细分析了为什么原始BERT模型在NER上表现不佳的原因:位置编码只具有距离感受能力,不具有方向感受能力;并在借鉴XL-Net
的基础上,提出了相对位置编码的方法;使用相对位置编码后,明显提升了BERT在NER上的效果。
对话系统之槽位提取
在对话机器人中,经常需要槽位识别来提取用户回答中的关键信息,以便用于控制对话逻辑跳转和标识对话关键词等,我们通过命名实体识别(Named Entity Recognition,NER)技术来提取对话中的实体词(关键词),即对话机器人中的槽位词。
槽位识别是一种序列标注问题,序列标注就是对给定文本的每一个字符打上标签,然后提取出我们关心的关键词,通常采用实体识别[1,2]方式实现。标签的格式通常使用两种标准:IOB2 和 IOBES。
槽位提取的应用
在公司业务场景下,我们将识别以下类别的槽位:
客服对话中的槽位提取(Slot Filling)
航道、城市、城市类型、单据号、职级序列、婚姻状况、订票类型、请假类型、分公司、*姓名
- 序列标注功能:http→image→单据号→时间→姓氏→二次姓氏→职级→手机号码→姓名→城市(不改变分词的结果)
- 追问判断功能:slot_set=[‘ask]
冠寓录音文本的成分分析
all:联系方式(主要是电话号码)、*看房时间、预算、姓氏
辅助Askdata Query中的特定实体(标签)识别/抽取
ALM产品名和角色名抽取
坐席知识库库名提槽
即产品名(完全匹配+模糊匹配)
未使用
C1客户描摹分析、人事员工评价、龙湖地产项目名
槽位提取的方法
为什么需要实体词典匹配?
答:主要有以下四个原因:
一是搜索中用户查询的头部流量通常较短、表达形式简单,且集中在商户、品类、地址等三类实体搜索,实体词典匹配虽简单但处理这类查询准确率也可达到 90%以上。
二是NER领域相关,通过挖掘业务数据资源获取业务实体词典,经过在线词典匹配后可保证识别结果是领域适配的。
三是新业务接入更加灵活,只需提供业务相关的实体词表就可完成新业务场景下的实体识别。
四是NER下游使用方中有些对响应时间要求极高,词典匹配速度快,基本不存在性能问题。
有了实体词典匹配为什么还要模型预测?
答:有以下两方面的原因:
一是随着搜索体量的不断增大,中长尾搜索流量表述复杂,越来越多OOV(Out Of Vocabulary)问题开始出现,实体词典已经无法满足日益多样化的用户需求,模型预测具备泛化能力,可作为词典匹配的有效补充。
二是实体词典匹配无法解决歧义问题,比如“黄鹤楼美食”,“黄鹤楼”在实体词典中同时是武汉的景点、北京的商家、香烟产品,词典匹配不具备消歧能力,这三种类型都会输出,而模型预测则可结合上下文,不会输出“黄鹤楼”是香烟产品。
实体词典匹配、模型预测两路结果是怎么合并输出的?
答:目前我们采用训练好的CRF权重网络作为打分器,来对实体词典匹配、模型预测两路输出的NER路径进行打分。在词典匹配无结果或是其路径打分值明显低于模型预测时,采用模型识别的结果,其他情况仍然采用词典匹配结果。
槽位词纠错
由于语音识别(Automatic Speech Recognition,ASR)技术采用的是第三方通用的语音识别,而在不同的业务中往往涉及到很多专有的名词,因此经过 ASR 后的文本很容易发生拼音正确但词识别错误的情况,或因用户口音、噪音、通话质量等问题导致 ASR 后的文本容易存在拼音相似但词不正确的问题(谐音词错误)。
为了提升对话流畅度,需要对识别出的槽位词进行纠错。例如在冠寓录音分析场景中,用户回复文本 “我星辰,尔东陈”,NER 未识别出姓氏,但其实用户想表达的是“姓陈”,通过槽位纠错可以将姓氏“星辰”纠正成“姓陈”,可以更好识别用户意图。
基于我们已有的领域知识(车品牌库、车系库及车品牌与车系的映射关系),首先对领域知识中的词进行预处理(去空格、去特殊符号、车系需要去掉车品牌前缀、大小写统一等),并将预处理后的词与原始领域词进行映射(chr 海外—> 丰田 C-HR(海外)),后续所有与领域知识词进行比较,都采用预处理后的领域知识词,最终再映射到原始的领域知识词输出。
例如,如果识别出的槽位词与相应领域知识中预处理过的词完全匹配,则返回映射的原始领域词,如果不匹配,那么认为槽位词错误,需要纠正,如何纠正呢?
上述提到错误主要是由谐音或混淆音导致的,基于我们已有的车品牌、车系库,可以通过拼音相似度算法进行匹配,得到相似度最大的实体词,即认为是正确的实体词(会通过阈值来控制)。
拼音相似度算法采用编辑距离,将待纠错词与车品牌、车系库中的所有词都转成拼音,待纠错词与库中的词计算编辑距离(基于拼音的每个字母计算编辑距离),即待纠错的拼音字符串需要改动多少次才能变成目标拼音字符串,同时考虑到字符串长度的影响,再除以两个字符串拼音的长度,编辑距离越小,匹配程度越高,最终通过阈值来控制是否采纳纠错结果。
具体地,在语音机器人新车相关话术中,对于用户回复买车的文本,首先会提取出本句话所有识别出的车品牌,对错误的车品牌进行纠正,这里车品牌纠错设置的阈值比较大,尽可能使纠正后的车品牌正确,这样才能基于正确的车品牌进行车系的纠错。
车品牌纠错后,再对所有的车系进行纠错,本句话有车品牌的会基于这些车品牌下的车系进行纠错,本句话没有车品牌的会根据待纠错词的拼音去车系库中找到带有该拼音的相关车系,再进行纠错。
以车系为例,图中的车系映射表包括文字的车系映射表(h6—> 哈弗 H6)和拼音的车系映射表(ei,qi,liu—> 哈弗 H6),如果 ASR 后的车系文字是正确的,或车系拼音是正确的,可以直接通过车系映射表得到完整的车系名称。
车系纠错时,如果本句话有车品牌,则可以直接获取该车品牌下的所有车系进行纠错;如果本句话没有车品牌,车系需要与车系库中 3000 多的车系词进行相似度比较,耗时较大,因此这里建立车系的倒排索表,key 是车系库中每个字的拼音,value 是包含这个拼音的所有车系词,对某个词纠错时,去索引表中取每个拼音的所有相关车系词进行比较。
参考
- 2020- Survey on Deep Learning for Named Entity Recognition
- 2019-A survey on recent advances in named entity recognition from deep learning models
- 2018-Recognizing complex entity mentions: A review and future directions
- 2018-Recent named entity recognition and classification techniques: A systematic review
- 2013-Named entity recognition: fallacies, challenges and opportunities
2007-A survey of named entity recognition and classification
NER相关数据集可以参考:SimmerChan/corpus