NLP数据增强技术
原文:A visual Survey of Data Augmentation for NLP
导读:
深度学习视觉领域的增强方法可以很大程度上提高模型的表现,并减少数据的依赖,而NLP上做数据增强不像在图像上那么方便,但还是有一些方法的。
与计算机视觉中使用图像进行数据增强不同,NLP中文本数据增强是非常罕见的。这是因为图像的一些简单操作,如将图像旋转或将其转换为灰度,并不会改变其语义。语义不变变换的存在使增强成为计算机视觉研究中的一个重要工具。
我很好奇是否有人尝试开发NLP的增强技术,并研究了现有的文献。在这篇文章中,我将分享我对当前用于增加文本数据的方法的发现。
NLP 中数据增强技术:词汇替换,反向翻译,文本表面转换,
1. 词汇替换 Lexical Substitution
这种方法试图在不改变句子主旨的情况下替换文本中的单词。
方法有:基于词典的替换,基于词向量的替换,基于masked language model预测结果的替换,基于TFIDF的替换。
基于词典的替换 Thesaurus-based substitution
该方法是 从句子中随机抽取一个单词,并使用同义词词典将其替换成同义词。 比如:我们可以使用WordNet的英文词汇数据库来查找同义词,然后执行替换。它是一个手动管理的数据库,其中包含单词之间的关系。
论文方面:
- zhang et al.在2015年论文“Character-level Convolutional Networks for Text Classification” 里面用了这个技术。
- Mueller et a 使用了相似的策略生成额外10K训练样本用于句子相似模型。
- 该技术也被EDA 使用,作为他们4个随机数据增强技术之一。
应用方面:
- NLTK提供了WordNet的接口
- 还可以使用TextBlob Api
- PPDB的数据库包含了数百万条词的解释,我们可以通过编程的方式下载和访问他们。
问题:中文的有没有类似的同义词语料库? 根据中文词语 成语来分? 可以查一下 如果没有 可以看 中文词典 是否有电子版的 是否可以爬虫做出一个这个数据库?
基于词向量的替换 Word-Embeddings Substitution
在该方法中,我们采用预先训练好的单词嵌入,如 word2vec, Glove, FastText, Sent2Vec,并使用嵌入空间中最近的相邻单词替换句子中的某些单词。
TinyBert中使用该技术结合GloVe词向量 用来提高他们的语言模型在下游任务中的泛化能力。
wang et al.使用它来增加学习主题模型所需的tweet。
例如,我们可以使用3个最相似的单词 替换一个单词 得到3个变体。
使用像Gensim这样的包开访问预先训练好的词向量 和获取最近的邻居是很容易的。例如,我们可以通过训练推特上的单词向量找到“awesome”的同义词。
# 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 Language Modle
像BERT,ROBERT,ALBERT这些Transformer模型 使用“Masked Language Moodeling”任务在大量语料上进行预训练,即模型必须根据上下文来预测遮盖的词汇。 这可以用来扩充一些文本,例如,我们可以使用一个预训练的BERT 模型并且屏蔽文本的某些部分,然后使用BERT模型来预测遮蔽掉的token.
因此我们可以使用mask的预测结果 生成各种各样的文本。与之前的方法相比,生成的文本在语法上更加连贯,因为模型在进行预测时考虑了上下文。
这个中文也可以用。
这个开源库很容易实现,如 HuggingFace的 transformers。我们可以将想要替换的token设置为,然后生成预测结果。
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}]
然而,这种方法的一个问题是,决定要屏蔽文本的哪一部分并不是容易,我们必须使用启发式的方法来决定掩码,否则生成的文本有可能无法保留原句的含义。
基于TF-IDF 的词替换
这个增强技术是在Unsupervised Data Augmentation for Cosnsistency Training文中提出的。基本思想是 TF-IDF分数较低的单词不能提供信息,因此可以在不影响句子的ground truth的情况下替换它们。
要替换的单词是从整个文档中TF-IDF分数较低的整个词汇表中选择的。可以参考原文中的实现:uda
2. 反向翻译 Back Translation
该方法使用 机器翻译来解释文本,同时重新训练含义。 使用这个方法来扩充没有标注的文本,并且在IMDB数据集种学习了一个只有20标注样本的半监督模型。他们模型的结果优于之前 在25000个标注样本训练的最佳的模型。
反向翻译的步骤:
- 把一些句子翻译成其他语言(如英文->法文)
- 再把法文翻译回英文
- 检查新产生的句子是否与原始句子不一样。如果不一样,就使用这个新产生的句子作为原始文本的数据增强版本
你还可以同时使用不同的语言运行反向翻译以生成更多的变体。如下图所示,我们将一个英语句子翻译成三种目标语言:法语、汉语、意大利语,然后再将其翻译回英语。
这项技术也被用在了的Kaggle上的“Toxic Comment Classification Challenge”的第一名解决方案中。获胜者将其用于训练数据增强,在测试期间,对英语句子的预测概率以及使用三种语言(法语、德语、西班牙语)的反向翻译进行平均,以得到最终的预测。
对于反向翻译的实现,可以使用TextBlob。或者,你也可以使用Google Sheets,并按照此处给出的说明:https://amitness.com/2020/02/backtransling-ingooglesheets/,免费申请谷歌翻译。
3. 文本表面转换 Text Surface Transformation
这个是基于正则表达式的简单的文本匹配转换,由Text Data Augmentation Made Simple By Leveraging NLP Cloud APIs 提出。
文中他给出了一个将动词形式由简写转化为完整形式或者反过来的例子。我们可以通过这个来生成增强型文本
既然转换就不应该改变句子的意思,我们可以看到,在扩展模棱两可的动词形式时,这可能会失败,比如:
为了解决这一问题,本文提出允许模糊收缩,但跳过模糊展开。
可以在这里找到英语缩略语的列表:https://en.wikipedia.org/wiki/wiki/wikipedia%3alist_of_english_contractions。
4. 随机噪声注入
该方法的思想是在文本中加入噪声,使所训练的模型对扰动具有鲁棒性。
拼写错误注入
在这种方法中,我们在句子中的一些随机单词上添加拼写错误。这些拼写错误可以通过编程方式添加,也可以使用常见拼写错误的映射,如:https://github.com/makcedward/nlpaug/blob/master/model/spelling_en.txt
QWERTY键盘错误注入
该方法试图模拟在QWERTY布局键盘上输入时发生的常见错误,这些错误是由于按键之间的距离非常近造成的。错误是根据键盘距离注入的。
Unigram 噪声
其思想是用从单字符频率分布中采样的单词进行替换。这个频率基本上就是每个单词在训练语料库中出现的次数。 这个方法在Unsupervised Data Augmentation for Consistency Training 和 Data Noising as Smoothing in Neural Network Language Models中都有使用。
Blank Noising
这个方法是由 Data Noising as Smoothing in Neural Network Language Models 论文中提出的。其思想是用占位符标记替换一些随机单词。本文使用“_”作为占位符标记。在论文中,他们将其作为一种避免特定上下文过拟合的方法,以及语言模型的平滑机制。该技术有助于提高perplexity和BLEU评分。
句子打乱
这是一种简单的技术,将训练文本中的句子打乱,以创建一个增强版本
随机插入
这个是EDA: easy data augmentation论文提出的4种方法之一,另外三种分别是 同义词替换,随机交换,随机删除。
在句子中 随机选择一个非停止词,然后找到他的同义词,然后随机插入句子中(位置不固定)。
随机交换
交换两个单词的顺序
随机删除
以概率p随机删除句子中的每个单词。
5. 实例交叉增强
这项技术是由Luque在他的关于TASS 2019情绪分析的论文中提出的。这项技术的灵感来自于遗传学中发生的染色体交叉操作。
该方法将tweets分为两部分,两个具有相同极性的随机推文(即正面/负面)进行交换。这个方法的假设是,即使结果是不符合语法和语义的,新文本仍将保留情感的极性。
这一技术对准确性没有影响,但有助于论文中极少数类的F1分数,如tweets较少的中性类。
6. 语法树操作
这项技术已经在Coulombe的论文中使用。其思想是解析和生成原始句子的依赖关系树,使用规则对其进行转换,并生成改写后的句子。
例如,一个不改变句子意思的转换是句子从主动语态到被动语态的转换,反之亦然
7. 文本混合
混合是一个简单有效的图像增强技术 是 Zhang et al. in 2017论文中提出的。主要思想是在一个mini-batch中以一定的比例结合两个随机的图像产生同义的样本用于训练。对于图像,这意味着结合两个图像的像素点,扮演训练中的正则化的角色。
Guo et al:Augmenting Data with Mixup for Sentence Classification: An Empirical Study将这个思想带到NLP上 在文本上应用混合. 他们提出了2个基本的方法:
-
词混合
词混合方法中,在一个mini-batch中随机取两个zero-padding 为相同长度的句子,然后将他们的词向量以一定的比例结合。产生的结果传到网络中用于文本分类。交叉熵损失按混合比例同时计算两个label的损失.
-
句子混合
在句子混合方法中,取两个句子,把他们zero-padded到同一长度,然后词向量通过LSTM/CNN 编码器,我们取最后一个隐层的状态作为句子向量。 然后把句子向量以一定的比例结合到一起谁让到最终的分类层。交叉熵损失按混合比例同时计算两个label的损失.
8. 生成模型
生成模型是在保持原有标签的情况下 生成额外的训练样本。
- 条件预训练语言模型:
这个技术最初是由 Anaby-Tavor et al.在他们的论文 “Not Enough Data? Deep Learning to the Rescue! 中提出,最近 Kumar et al.的一篇通过多个transformer-based 预训练模型 验证了这个方法,步骤如下:
- 在训练集中添加标签
- 在训练数据集上微调大的预训练模型(BERT/GPT2/BART),对于GPT2,微调任务是生成,对于BERT微调任务是遮蔽单词预测。
- 使用微调的语言模型,就可以通过标签和少数的初始单词作为模型的启发 从而 产生新样本。文中在用了3种初始训练单词,同时对每个训练样本都生成一种同义的样本
实现
要使用上述所有方法,可以使用名为nlpaug的python库:https://github.com/makcedward/nlpaug。它提供了一个简单且一致的API来应用这些技术。
总结
我从文献综述中得出的结论是,这些增强方法中有许多是非常特定于任务的,它们对性能的影响仅针对某些特定用例进行了研究。系统地比较这些方法并分析它们对许多任务的性能的影响将是一项有趣的研究。
参考:NLP数据增强综述