众所周知,命名实体识别(Named Entity Recognition,NER)是一项基础而又重要的NLP词法分析任务,也每每做为信息抽取、问答系统、机器翻译等方向的或显式或隐式的基础任务。在不少人眼里,NER彷佛只是一个书本概念,跟句法分析同样存在感不强。一方面是由于深度学习在NLP领域遍地开花,使得智能问答等曾经复杂的NLP任务,变得能够端到端学习,因而分词、词性分析、NER、句法分析等曾经的显式任务都隐式地编码到了大型神经网络的参数中;另外一方面,深度学习流行以后,NER问题相比以前有了比较长足的进步,LSTM+CRF的模式基本成为业内标配,不少人认为“这个事情应该差很少了”。算法
但!是!网络
真正在工业界解决NLP业务问题的NLPer,每每发现事情远无法这样轻描淡写。在真实的工业界场景中,一般面临标注成本昂贵、泛化迁移能力不足、可解释性不强、计算资源受限等问题,想要将NER完美落(bian)地(xian)可不简单,那些在经典benchmark上自称作到SOTA的方法放在现实场景中每每“也就那样”。以医疗领域为例:框架
那些口口声声遇事不决上BERT的人们,应该像我同样,看着大家在NER问题上翻车机器学习
几天前,卖萌屋的天然语言处理讨论群内就命名实体识别问题进行了一番激烈的讨论,因为讨论持续了接近2小时,这里就不贴详细过程了(省略8k字)。ide
通过一番激烈的辩论,最后卖萌屋的做者杰神(JayLou娄杰)就讨论中出现的若干问题给出了工业界视角下的实战建议(每一条都是实打实的实战经验哇)。工具
杰神首先分享了他在医疗业务上作NER的七条经验教训:性能
很是直接的1层lstm+crf!
注:本文所说的lstm都是双向的。学习
如何快速有效地提高NER性能? 若是这么直接的打开方式致使NER性能达不到业务目标,这一点也不意外,这时候除了badcase分析,不要忘记一个快速提高的重要手段:规则+领域词典。在垂直领域,一个不断积累、不断完善的实体词典对NER性能的提高是稳健的,基于规则+词典也能够快速应急处理一些badcase;对于通⽤领域,能够多种分词工具和多种句法短语⼯具进行融合来提取候选实体,并结合词典进行NER。此外,怎么更好地将实体词典融入到NER模型中,也是一个值得探索的问题(如嵌入到图神经网络中提取特征[3])。优化
如何在模型层面提高NER性能? 若是想在模型层面(仍然是1层lstm+crf)搞点事情,上文讲过NER是一个重底层的任务,咱们应该集中精力在embedding层下功夫,引入丰富的特征:好比char、bigram、词典特征、词性特征、elmo等等,还有更多业务相关的特征;在垂直领域,若是能够预训练一个领域相关的字向量&语言模型,那是最好不过的了~总之,底层的特征越丰富、差别化越大越好(构造不一样视角下的特征)。编码
将词向量引入到模型中,一种简单粗暴的作法就是将词向量对齐到相应的字符,而后将字词向量进行混合,但这须要对原始文本进行分词(存在偏差),性能提高一般是有限的。
如何解决NER实体span过长的问题? 若是NER任务中某一类实体span比较长(⽐如医疗NER中的⼿术名称是很长的),直接采起CRF解码可能会致使不少连续的实体span断裂。除了加入规则进行修正外,这时候也可尝试引入指针网络+CRF构建多任务学习(指针网络会更容易捕捉较长的span,不过指针网络的收敛是较慢的,能够试着调节学习率)。
如何客观看待BERT在NER中的做用? 对于工业场景中的绝大部分NLP问题(特别是垂直领域),都没有必要堆资源。但这毫不表明BERT是“一无可取”的,在不受计算资源限制、通用领域、小样本的场景下,BERT表现会更好。咱们要更好地去利用BERT的优点:
a. 在低耗时场景中,BERT能够做为一个“对标竞品”,咱们能够采起轻量化的多种策略组合去逼近甚至超越BERT的性能;
b. 在垂直领域应用BERT时,咱们首先确认领域内的语料与BERT原始的预训练语料之间是否存在gap,若是这个gap越大,那么咱们就不要中止预训练:继续进行领域预训练、任务预训练。
c. 在小样本条件下,利用BERT能够更好帮助咱们解决低资源问题:好比基于BERT等预训练模型的文本加强技术[7],又好比与主动学习、半监督学习、领域自适应结合(后续详细介绍)。
d. 在竞赛任务中,能够选取不一样的预训练语⾔模型在底层进行特征拼接。具体地,咱们能够将char、bigram和BERT、XLNet等一块儿拼接喂入1层lstm+crf中。语⾔模型的差别越⼤,效果越好。若是须要对语言模型finetune,须要设置不一样的学习率。
7.如何有效解决低资源NER问题? 若是拿到的NER标注数据仍是不够,又不想标注人员介入,这确实是一个比较困难的问题。低资源NLP问题的解决方法一般都针对分类任务,这相对容易一些,如能够采起文本加强、半监督学习等方式,详情可参考 《如何解决NLP中的少样本困境》 。而这些解决低资源NLP问题的方法,每每在NER中提高并不明显。NER本质是基于token的分类任务,其对噪声极其敏感的。若是盲目应用弱监督方法去解决低资源NER问题,可能会致使全局性的性能降低,甚至还不如直接基于词典的NER。这里给出一些能够尝试的解决思路(也许还会翻车):
a. 上文已介绍BERT在低资源条件下能更好地发挥做用:咱们可使用BERT进行数据蒸馏(半监督学习+置信度选择),同时利用实体词典辅助标注。
b. 还能够利用实体词典+BERT相结合,进行半监督自训练,具体可参考文献[8]。
c. 工业界毕竟不是搞学术,要想更好地解决低资源NER问题,RD在必要时仍是要介入核查的。
9.如何克服NER中的类别不平衡问题? NER任务中,经常会出现某个类别下的实体个数稀少的问题,而常规的解决方法无外乎是重采样、loss惩罚、Dice loss[10]等等。而在医疗NER中,咱们经常会发现这类实体自己就是一个长尾实体(填充率低),若是能挖掘相关规则模板、构建词典库也许会比模型更加鲁棒。
10.如何对NER任务进行领域迁移? 在医疗领域,咱们但愿NER模型可以在不一样医院、不一样疾病间进行更好地泛化迁移(领域自适应:源域标注数据多,目标域标注数据较少),如能够尝试将特征对抗迁移[11]。在具体实践中,对抗&特征迁移一般还不如直接采起finetune方式(对源域进行预训练,在目标域finetune),特别是在后BERT时代。在医疗领域,泛化迁移问题并非一个容易解决的问题,试图去将NER作成一个泛化工具每每是困难的。或许咱们更应该从业务角度出发去将NER定制化,而不是拘泥于技术致使没法落地。
11.如何让NER系统变得“透明”且健壮? 一个好的NER系统并非“一竿子插到底”的黑箱算法。在医疗领域,实体类型众多,咱们每每须要构建一套多层级、多粒度、多策略的NER系统。
a. 多层级的NER系统更加“透明”,能够回溯实体的来源(利于医学实体消歧),方便“可插拔”地迭代优化;同时也不须要构建数目众多的实体类型,让模型“吃不消”。
b. 多粒度的NER系统能够提升准召。第⼀步抽取⽐较粗粒度的实体,经过模型+规则+词典等多策略保证⾼召回;第⼆步进⾏细粒度的实体分类,经过模型+规则保证⾼准确。
综上,若是能在1层lstm+CRF的基础上引入更丰富的embedding特征、并进行多策略组合,足以解决垂直领域的NER问题;此外,咱们要更好地利用BERT、使其价值最大化;要更加稳妥地解决复杂NER问题(词汇加强、冷启动、低资源、噪声、不平衡、领域迁移、可解释、低耗时)。
除了上面的12条工业界实战经验,群内的一个小伙伴@一一 还提出了一个实际场景常常遇到的问题:
lstm+crf作实体提取时,保证精度的状况下,在提高模型速度上有没有什么好的办法或者建议?
杰神一样给予了一个饱含实战经验的回答:
个⼈经验来讲,1层lstm+CRF够快了。