自然语言处理中数据增强(Data Augmentation)技术最全盘点

与“计算机视觉”中使用图像数据增强的标准做法不同,在NLP中,文本数据的增强非常少见。这是因为对图像的琐碎操作(例如将图像旋转几度或将其转换为灰度)不会改变其语义。语义上不变的转换的存在是使增强成为Computer Vision研究中必不可少的工具的原因。

是否有尝试为NLP开发增强技术的方法,并探讨了现有文献。在这篇文章中,将基于我的发现概述当前用于文本数据扩充的方法。

本文内容翻译整理自网络。

NLP数据扩充技术

1.词汇替代

此工作尝试在不更改句子含义的情况下替换文本中出现的单词。

基于同义词库的替换

在此技术中,从句子中抽取一个随机单词,然后使用同义词库将其替换为其同义词。例如,可以使用WordNet数据库中的英语查找同义词,然后执行替换。它是一个人工编辑的数据库,描述单词之间的关系。

Zhang在他们的2015年论文“Character-level Convolutional Networks for Text Classification”中使用了该技术。Mueller等人使用相似的策略为其句子相似性模型生成额外的10K训练数据。Wei等人也使用了这种技术作为“轻松数据增强”论文中四个随机增强集合中的一种技术。

为了实现,NLTK提供了对WordNet 的编程访问。读者也可以使用TextBlob API。此外,还有一个名为PPDB的数据库,其中包含数百万个可以通过编程方式下载和使用的短语。

词嵌入替换

在这种方法中,采用了经过预训练的词嵌入,例如Word2Vec,GloVe,FastText,Sent2Vec,并使用嵌入空间中最近的相邻词作为句子中某些词的替换。Jiao已在他们的论文“ TinyBert ” 中将这种技术与GloVe嵌入一起使用,以改进其语言模型在下游任务上的通用性。Wang等人用它来增强学习主题模型所需的推文。

例如,读者可以将单词替换为最接近的3个单词,并获得文本的三种变体。

使用诸如Gensim之类的包来访问预先训练的单词向量并获取最近的邻居是很容易的。例如,在这里使用在推特上训练的单词向量找到单词“ awesome”的同义词。

相关好书推荐,京东1万+评论,99%好评:

# pip install gensim

import gensim.downloader as api

model = api.load('glove-twitter-25') model.most_similar('awesome', topn=5)

读者将获得5个最相似的词以及余弦相似度。

[('amazing', 0.9687871932983398),

('best', 0.9600659608840942),

('fun', 0.9331520795822144),

('fantastic', 0.9313924312591553),

('perfect', 0.9243415594100952)]

Masked语言模型

诸如BERT,ROBERTA和ALBERT之类的Transformer模型已使用称为“屏蔽语言模型”的预置任务在大量文本上进行了训练,其中该模型必须根据上下文预测屏蔽词。

这可以用来扩充一些文本。例如,可以使用预训练的BERT模型,对文本的某些部分进行遮罩,然后要求BERT模型预测被遮罩token。

因此,可以使用遮罩预测来生成文本的变体。与以前的方法相比,生成的文本在语法上更加连贯,因为模型在进行预测时会考虑上下文。使用诸如Hugging Face开源的tranformer(https://huggingface.co/transformers/)之类的开源库很容易实现。读者可以设置要替换的令牌<mask>并生成预测。

from transformers import pipelinenlp = pipeline('fill-mask')nlp('This is <mask> cool')

[{'score': 0.515411913394928,

'sequence': '<s> This is pretty cool</s>',

'token': 1256},

{'score': 0.1166248694062233,

'sequence': '<s> This is really cool</s>',

'token': 269},

{'score': 0.07387523353099823,

'sequence': '<s> This is super cool</s>',

'token': 2422},

{'score': 0.04272908344864845,

'sequence': '<s> This is kinda cool</s>',

'token': 24282},

{'score': 0.034715913236141205,

'sequence': '<s> This is very cool</s>',

'token': 182}]

但是,此方法的一个需要注意的点是,决定要掩盖文本的哪一部分并非易事。读者将必须使用启发式方法来确定掩码,否则生成的文本可能不会保留原始句子的含义。

基于TF-IDF的单词替换

这种扩展方法是由Xie等人提出的。在无监督数据增强论文中。基本思想是,TF-IDF分数较低的单词是无意义的,因此可以替换而不会影响句子的真实标签。

通过计算整个文档中单词的TF-IDF得分并取最低得分来选择替换原始单词的单词。读者可以在此处的原始文件中参考此代码的实现(https://github.com/google-research/uda/blob/master/text/augmentation/word_level_augment.py)。

2. 回译(Back Translation)

在这种方法中,利用机器翻译来释义文本,同时重新训练其含义。Xie使用此方法来扩充未标记的文本,并仅使用20个标记的示例在IMDB数据集上学习半监督模型。他们的模型优于以前在25,000个带标签的示例上训练的最新模型。

反向翻译过程如下:

· 用一些句子(例如英语)并翻译成另一种语言,例如法语

· 将法语句子翻译回英语句子

· 检查新句子是否与的原始句子不同。如果是这样,那么将这个新句子用作原始文本的增强版本。

读者还可以一次使用不同的语言进行反向翻译,以产生更多的变化。如下所示,将英语句子翻译成目标语言,然后再将英语翻译成三种目标语言的英语:法语,普通话和意大利语。该技术还被用于Kaggle上的“有毒评论分类挑战” 的第一名解决方案。获胜者将其用于训练数据的增加以及测试期间,将英语句子的预测概率以及使用三种语言(法语,德语,西班牙语)的反向翻译的平均值进行平均,以得出最终预测。

对于实施反向翻译,可以使用TextBlob。另外,读者也可以使用Google表格并按照此处提供的说明免费应用Google翻译(https://amitness.com/2020/02/back-translation-in-google-sheets/)。

3.文字表面转换(Text Surface Transformation)

这些是使用正则表达式应用的简单模式匹配转换,由Claude Coulombe在他的论文中介绍。

在本文中,他提供了一个将言语形式从收缩转变为扩张,反之亦然的例子。可以通过应用此生成增强文本。

由于转换不应该改变句子的含义,因此可以看到,在展开歧义语言形式的情况下,这样做可能会失败:为解决此问题,本文建议允许歧义收缩,但跳过歧义扩展。

读者可以在此处找到英语的收缩列表。为了扩展,读者可以使用Python中的收缩库(https://en.wikipedia.org/wiki/Wikipedia%3aList_of_English_contractions)。

4.随机噪声注入(Random Noise Injection)

这些方法的思想是在文本中注入噪声,以便训练的模型对扰动具有鲁棒性。

拼写错误注入

在这种方法中,向句子中的某些随机单词添加了拼写错误。这些拼写错误可以通过编程方式添加,也可以使用常见拼写错误的映射(例如英语列表)来添加。

QWERTY键盘错误注入

此方法尝试模拟在QWERTY布局键盘上键入时由于相互之间非常靠近的键而发生的常见错误。根据键盘距离插入错误。

Unigram噪声

Xie等人已使用此方法。这个想法是用从字法频率分布中采样的单词进行替换。该频率基本上是每个单词在训练语料库中出现的次数。

空白噪声

该方法由Xie等人(https://arxiv.org/abs/1703.02573)提出。在他们的论文中。这个想法是用一个占位符标记代替一些随机词。本文使用“ _”作为占位符标记。在本文中,他们将其用作避免在特定上下文上过度拟合的方法以及语言模型的平滑机制。该技术有助于提高困惑度和BLEU分数。

句子改组

这是一种幼稚的技术,可以对训练文本中存在的句子进行改组以创建增强版本。

随机插入

该技术由Wei等人(https://arxiv.org/abs/1901.11196)提出。在他们的论文“Easy Data Augmentation”中。在这种技术中,首先从不是停用词的句子中选择一个随机词。然后,找到其同义词并将其插入句子中的随机位置。

随机交换

此技术也由Wei等人提出。在他们的论文“Easy Data Augmentation”中。想法是随机交换句子中的任何两个单词。

相关好书推荐,京东1万+评论,99%好评:

随机删除

该技术也是由Wei等人提出的。在他们的论文“Easy Data Augmentation”中。在这种情况下,以一定概率p随机删除句子中的每个单词。

5.实例交叉扩展(Instance Crossover Augmentation)

这项技术是Luque(https://arxiv.org/abs/1909.11241)在他对TASS 2019的情感分析的论文中引入的。它受到遗传学中染色体交叉操作的启发。

在该方法中,一条推文被分为两半,并且两个极性相同(即正/负)的随机推文被互换。假设是,即使结果是不合语法且语义上不合理的,新文本仍将保留情感。

该技术对准确性没有影响,但有助于提高F1分数,表明该技术可帮助减少诸如Tweet的中性类别等少数群体。

6.语法树(Syntax-tree)操作

此技术已在Coulombe(https://arxiv.org/abs/1812.04718)的论文中使用。想法是解析并生成原始句子的依存关系树,使用规则对其进行转换并生成释义的句子。

例如,一种不改变句子含义的转换就是从主动语态到被动语态的转换,反之亦然。

7.文字混合(Mixup for Text)

混合是张等人(https://arxiv.org/abs/1710.09412)介绍的一种简单而有效的图像增强技术。这是在2017年提出的。想法是将两个随机图像按一定比例组合在一个小批量中,以生成用于训练的合成示例。对于图像,这意味着将两个不同类别的图像像素组合在一起。它是训练过程中的一种正规化形式。

郭等人(https://arxiv.org/abs/1905.08941)将这个想法带给了自然语言处理。修改了Mixup以处理文本。他们提出了两种新颖的方法将Mixup应用于文本:

· wordMixup:

在此方法中,在一个小批量中获取两个随机句子,并将它们零填充为相同的长度。然后,将它们的词嵌入按一定比例组合。生成的单词嵌入将传递到常规流程以进行文本分类。对于给定比例的原始文本的两个标签,计算交叉熵损失。

sentMixup:

在此方法中,采用两个句子并将它们零填充为相同的长度。然后,它们的词嵌入通过LSTM / CNN编码器传递,将最后的隐藏状态作为句子嵌入。这些嵌入按一定比例组合,然后传递到最终分类层。基于给定比例的原始句子的两个标签计算交叉熵损失。

8.生成方法(Generative Methods)

此工作尝试在保留标签类别的同时生成其他训练数据。

条件预训练语言模型

这项技术由Anaby-Tavor等人首先提出。在他们的论文Not Enough Data? Deep Learning to the Rescue!。Kumar等人的(https://arxiv.org/abs/2003.02245)最新论文。在多个基于Transformer的预训练模型中评估了这个想法。问题表述如下:

将类别标签附加到训练数据中的每个文本

在修改后的训练数据上微调一个大型的预训练语言模型(BERT / GPT2 / BART)。对于GPT2,微调任务是生成,而对于BERT,目标将是屏蔽token预测。

使用微调的语言模型,可以通过使用类标签和少量的初始单词作为模型提示来生成新样本。本文使用每个训练文本的3个初始单词,并为训练数据中的每个点生成一个综合示例。

实现

诸如nlpaug(https://github.com/makcedward/nlpaug)和textattack(https://github.com/QData/TextAttack)之类的库提供了简单而一致的API,以在Python中应用上述NLP数据增强方法。它们与框架无关,可以轻松集成到读者的管道中。

结论

我从文献回顾中得出的结论是,许多这些NLP增强方法都是非常特定于任务的,并且仅在某些特定用例中研究了它们对性能的影响。系统地比较这些方法并分析它们对许多任务的性能的影响将是一个有趣的研究。

猜你喜欢

转载自blog.csdn.net/lqfarmer/article/details/129469260