淘先锋技术网

首页 1 2 3 4 5 6 7

本文翻译自:A Visual Survey of Data Augmentation in NLP,原作者Amit Chaudhary,已获得转载翻译授权。

在计算机视觉中,使用图像数据增强是比较常规的做法,而在NLP中对文本数据进行增强则非常罕见。 这是因为对图像做一些微不足道的操作(例如将图像旋转几度或将其转换为灰度图像)并不会改变其原来的内容。 这种特性使数据增强成为CV研究中必不可少的步骤。

我很好奇是否有尝试在NLP的研究中使用数据增强的方法,并且查阅了现有文献。 在这篇文章中,我将分享我发现的当前用于扩充文本数据的方法。

NLP数据增强方法

词汇替换

这种方法是在不改变句子意思的情况下替换文本中的单词。

基于同义词词典的替换

在这种方法中,我们从句子中随机取出一个单词,并使用同义词词典将其替换为同义词。例如,我们可以使用英语词汇数据库WordNet来查找同义词,然后进行替换。WordNet是一个手动管理的数据库,其中包含单词之间的关系。

Zhang et al.在他们2015年的工作《Character-level Convolutional Networks for Text Classification》中使用了这种方法。Mueller et al.使用了同样类似的方法生成了额外10K的数据用于他们句子相似度的模型训练。
NLTK提供了WordNet的编程接口,同样你也可以使用TextBlob API。另外,还有一个叫PPDB的数据库,包含了数百万改述词条可以下载使用。

基于词向量的替换

在这种方法中,我们使用例如Word2Vec,GloVe,FastText,Sent2Vec等预训练好的词向量,并挑选向量空间中最近邻的词作为句子中某一个词的替换。Jiao et al.在他们的工作“TinyBert”中就是将使用了GloVe word embeddings来提升他们语言模型的下游任务的泛化能力。Wang et al.使用了这种方法去增强推特文本,来学习主题模型。

比如说,你可以使用3个最相似来替换句子中的一个词,然后获得3个该句子的变体。

使用像Gensim这样的包来访问预先训练好的字向量和获取最近邻词向量是很容易的。例如,这里我们通过训练推特上的词向量找到了单词“awesome”的同义词。

# pip install gensim
import gensim.downloader as api

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

你可以得到前五个最相似的词向量:

[('amazing', 0.9687871932983398),
 ('best', 0.9600659608840942),
 ('fun', 0.9331520795822144),
 ('fantastic', 0.9313924312591553),
 ('perfect', 0.9243415594100952)]

Masked Language Model

像BERT、ROBERTA和ALBERT这样的Transformer模型已经使用了大量的文本进行训练,并且是使用一种“Masked Language Model”的任务进行训练的,即模型必须根据上下文来预测被掩盖的词汇。
这就可以被用来做数据增强。比如,我们将句子中的某个部分掩盖,并使用预训练好的BERT模型来预测被掩盖的token。

因此,我们可以使用BERT模型来生成句子的不同变体。相比于之前的方法,生成的文本在语法上更加连贯,因为模型在做出预测时考虑了上下文。

使用Hugging Face的开源库transformers就可以很容易的实现,可以设置需要掩盖的token为<mask>,然后生成预测:

from transformers import pipeline
nlp = 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}]

值得注意的是,决定需要掩盖的token并不是一件小事,你可以使用启发式的方法来决定掩码,否则生成的文本将不保留原句的含义。

基于TF-IDF的替换

这种方法是由Xie et al.在无监督数据增强方法中提出来的。其基本思想是,TF-IDF分数较低的单词不能提供有效信息,因此可以在不影响句子的ground-truth标签的情况下替换它们。

要替换的单词是从整个文档中TF-IDF分数较低的整个词汇表中选择的。你可以参考原文的实现方法

反向翻译

在这种方法中,我们利用机器翻译来解释文本,同时重新训练含义。Xie et al等人使用这种方法来扩充未标记的文本,并学习IMDB数据集上只有20个标记示例的半监督模型。该方法优于之前的state-of-the-art模型,该模型训练了25000个标记的例子。
反向翻译过程如下:

  • 找一些句子(如英语),翻译成另一种语言,如法语;
  • 将法语句子翻译成英语句子;
  • 检查新句子是否与原来的句子不同。如果是,那么我们使用这个新句子作为原始文本的数据增强版本。

    你还可以同时使用不同的语言进行反向翻译以生成更多的变体。如下图所示,我们将一个英语句子翻译成目标语言,然后再将其翻译成三种目标语言:法语、汉语和意大利语。

    这项技术也在Kaggle上的“Toxic Comment Classification Challenge”的第一名解决方案中被使用。获胜者将其用于训练数据扩充和测试期间,在测试期间,对英语句子的预测概率以及使用三种语言(法语、德语、西班牙语)的反向翻译进行平均,以得到最终的预测。
    对于反向翻译的实现,可以使用TextBlob。或者,也可以使用Google Sheets,并按照给出的说明免费地应用谷歌翻译。

文本表达转换

这种方法是使用正则表达式,并应用的简单模式匹配进行变换,Claude Coulombe在他的论文中介绍了这些变换。在这篇文章中,他给出了一个将动词形式由收缩转化为扩张,反之亦然的例子。我们可以通过应用这个来生成增强文本。

既然转换不应该改变句子的意思,我们可以看到,在扩展模棱两可的动词形式时,这可能会失败,比如:

为了解决这一问题,文章提出允许模糊收缩,但跳过模糊展开。

你可以在这里找到英语缩写的列表

随机噪声注入

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

拼写错误注入

在这种方法中,我们在句子中的一些随机单词上添加拼写错误。这些拼写错误可以通过编程方式添加,也可以使用常见拼写错误的映射,如英语的这个拼写错误列表

QWERTY键盘错误注入

该方法试图模拟在QWERTY布局键盘上输入时发生的常见错误,这些错误是由于按键之间的距离非常近造成的。错误是根据键盘距离注入的。

Unigram噪声

Xie et al.UDA的工作中使用了这种方法。其思想是用从单字符频率分布中采样的单词进行替换。这个频率基本上就是每个单词在训练语料库中出现的次数。

空白噪声

该方法由Xie et al在他们的论文中提出。其思想是用占位符标记替换一些随机单词。文章使用“_”作为占位符标记。在论文中,他们将其作为一种避免特定上下文过度拟合的方法,以及语言模型的平滑机制。该技术有助于提高困惑度和BLEU评分。

句子洗牌

这是一种很简单的技术,我们将训练文本中的句子打乱,以创建一个扩充版本。

实例交叉扩增

Luque在他的TASS2019上的情感分析论文上提出了这种方法。这项技术的灵感来自于遗传学中的染色体交叉操作。
该方法将推特分为两半和两个具有相同极性的随机推文(即正面/负面)交换他们的另一半。假设是,即使结果是不符合语法和语义的,新文本仍将保留情感极性。

这一技术对准确性没有影响,但有助于论文中的F1分数显示其对少数类的影响,如推文较少的中性类。

语法树操作

Coulombe在他的论文中提出这个方法。其思想是解析和生成原始句子的依赖关系树,使用规则对其进行转换,并生成改写后的句子。
例如,一个不改变句子意思的转换是句子从主动语态到被动语态的转换,反之亦然。

实现

要应用上述所有方法,可以使用名为nlpaug的python库。它提供了一个简单且一致的API来应用这些技术。

总结

我从文献综述中得出的结论是,这些增强方法中有许多是非常依赖于特定任务的,它们对性能的影响仅针对某些特定用例进行了研究。系统地比较这些方法并分析它们对许多任务的性能的影响将是一项有趣的研究。


欢迎关注我的公众号“「野风同学」”,一个程序员的自我成长之路,持续分享技术干货文章与软件、工具和书籍等优质内容推荐。