对命名实体识别任务(NER)进行数据增强,不像对分类任务容易,其主要原因它是序列标注任务,识别是token级别。一些常见的方法,如随机删除或替换词,词序替换等,都会很容易改变一个实体上下文语义关系,带来更大的噪声影响。除了上述传统的方法,也有提出像来回翻译、句法分析、或者语言模型生成等方法,这类方法虽然在降低上下文负影响,尽可能提高样本空间上更进一步,但也没带来绝对的优势。例如2020年EMNLP会议一篇论文<DAGA: Data Augmentation with a Generation Approach for Low-resource Tagging Tasks>提出的一种新的语言生成模型来增强数据,但实验结果并没预期的那么高,甚至觉得一些传统增强方法也能达到这个结果。而利用传统的增强方法的一个优势就是:简单,易落地实践。
依据上面的介绍,本次分享个人在NER任务上数据增强几种比较传统的想法,并实验进行了验证。实验中主要对比了四种增强方式:
- 训练集中同类实体替换;
- 按近义替换实体上下文,替换比例为15%;
- 随机删除实体上下文,删除比例为15%;
- 方法1与方法2结合,对实体与上下文都进行替换;
实验是在CLUEbenchmark上进行的,数据集有10类标签,分训练集与验证集。该项目也开源了代码,分别有LSTM版和BERT版。更多详情可去该项目查看。
关于数据增强的细节说下:在第一种方法中,因考虑到同类实体还是存在很大语义差距的,例如同是“organization”类的两个实体:"河南省文物考古研究所"与"汉诺威96队",前者是一个研究机构,而后者是一个球队。所以希望,球队类实体替换球队实体,研究机构类替换研究机构类。为了达到这个效果,我利用了苏神的开源的roberta_zh_l12预训练模型获取每个实体的表征向量,然后做相似度计算,具体是取token级别向量,然后拼接。此外,考虑到两两计算的复杂度,采用事先把训练集中每个实体对应的向量获取并保存下来,在生成新样本的时候,只在一个实体同类集合中抽取100个实体做相似计算,然后把相似度最高的词作为替换词。该方法中,句中原有的实体全部替换。
在第二种方法中,由于上文词的近义词范围事先不知道,不能采用第一种方法。为了解决这个问题,采用的方法是先按实体词对句子进行切分,形成上下文片段,然后利用jieba对上下文片段进行切分,形成上下文词。然后利用word2vec中topk函数来找寻相似词,词向量用的是开源的搜狗新闻词向量。考虑到不能改变原语句语义太大,这里替换的比例为15%。
方法2与方法3就比较好理解,这里就不多讲。下面是四种方式数据增强实例:
- org: 浙商银行企业信贷部叶老桂博士则从另一个角度对五道门槛进行了解读。叶老桂认为,对目前国内商业银行而言,
- aug1: 招商银行企业信贷部金叶博士则从另一个角度对五道门槛进行了解读。金叶认为,对目前国内商业银行而言,
- aug2: 浙商银行企业信贷部叶老桂博士则从另外一个角度对五道门槛进行了解释。叶老桂认为,对目前国内外商业银行而言,
- aug3: 浙商银行企业叶老桂博士则从另一个角度对五道了解读。叶老桂认为,对目前国内商业银行而言,
- aug4: 招商银行企业信贷部周春芽博士则从另一个角度看对于五道门槛进行了解读。周春芽认为,对于当前国内商业银行而言,
用上四种增强方法分别生成4个新的训练集,我用CLUEbenchmark中bilstm_crf_pytorch代码进行了实验,实验结果如下:
method | precision | recall | f1 |
---|---|---|---|
org | 72.31 | 67.15 | 69.64 |
aug1 | 73.54 | 68.49 | 70.93 |
aug2 | 74.75 | 67.15 | 70.75 |
aug3 | 72.98 | 68.33 | 70.58 |
aug4 | 73.55 | 69.14 | 71.28 |
可以看出:四种增强方式都是有提升的,前三种方法都大约有1个点的提升,第四种方法(实体同类替换、实体上下文近义替换)效果最好,有1.6个点的提升。同时,方法3提升效果最次,说明随机删除上下文词是会扩大语义空间,进而提升学习效果,但也会带来负面噪声影响,因为本方法只是按15%的比例删除,这个比例影响并不大。
再看下方法4(aug4)与原始(org)在各个实体类型的对比效果:
entity | org_f1 | aug4_f1 |
---|---|---|
company | 71.08 | 73.10 |
position | 75.70 | 75.39 |
movie | 67.13 | 72.14 |
organization | 75.66 | 77.73 |
name | 75.22 | 77.12 |
government | 68.95 | 72.26 |
address | 50.72 | 51.57 |
scene | 51.72 | 51.37 |
game | 78.16 | 81.86 |
book | 68.97 | 68.67 |
从各个实体类型增强效果来看,有些指标并没有提升,有些指标提升还是非常明显,如“government”、“gam”;而原先识别不好的类实体,增强方式都没有带来积极影响,如“address”,“scene”。且有个有趣的现象:有增强效果的,基本都有2个点左右的提升,没有增强效果的,带来的负影响都不大。这也说明传统的增强方式还是非常有效的,就看如何提升增强的质量,后续也可以有针对性在具体实体类型进行增强尝试。
另外之前有人讨论,说增强方法在BERT之类的预训练模型下效果不明显,甚至会下降。我也对比下该数据集BERT实验效果,如下:
method | f1 |
---|---|
RoBERTa-wwm-large-ext(tf) | 80.42 |
RoBERTa-wwm-large-ext(pytorch) | 79.42 |
RoBERTa_zh_L12_PyTorch(aug4) | 80.19 |
前两个结果是CLUEbenchmark项目开源的结果,后一个我们方法4增强跑出的结果,预训练模型稍微变动了,且我只是跑10个epochs。可以看出:数据增强在预训练模型也是有效果的。
以上就是关于数据增强在NER上实践结果,通过实验效果来看,可以总结以下几点看法:
1.像传统实体替换等方法还是有效的,且实体替换及实体上下文替换都是有效方式,二者结合会更好;
2.若利用替换方式来增强,需要在词的替换质量上下功夫;
3.本实验中实体类替换只限定了训练集现有的,可通过word2vec进一步扩充实体类集再替换,可能带来的效益更好;
4.若通过tf-idf权重来控制上下文词替换质量,或者采用回翻译来改变上下文词,再结合实体词替换,应该能进一步提升增强效果;
更多文章可关注笔者公众号:自然语言处理算法与实践
网友评论