Data Augmentation

在这篇文章中,我将基于我的发现概述当前用于文本数据扩充的方法。

  1. 词汇替代
  2. 反向翻译
  3. 文字表面转换
  4. 随机噪声注入
  5. 实例交叉扩展
  6. 语法树操作
  7. 文字混合
  8. 生成方法

中文EDA工具

2021.08.13补充《最新综述:用于文本分类的数据增强方法》

论文标题:

A Survey on Data Augmentation for Text Classification

论文链接:

https://arxiv.org/abs/2107.03158

数据增强方法分类

图片

用于文本分类的的数据增强方法集合

图片

NLP数据扩充技术

1.词汇替代

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

  • 基于同义词库的替换

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

    张等。在他们的2015年论文“用于文本分类的字符级卷积网络”中使用了该技术。Mueller等。使用类似的策略为其句子相似性模型生成额外的10K训练示例。Wei等人也使用了这种技术作为“轻松数据扩充”论文中四个随机扩充库中的一项技术。

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

  • 词嵌入替换

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

    单词向量最近的邻居

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

    用词嵌入来增强文本

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

1
2
3
4
5
# pip install gensim
import gensim.downloader as api

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

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

1
2
3
4
5
[('amazing', 0.9687871932983398),
('best', 0.9600659608840942),
('fun', 0.9331520795822144),
('fantastic', 0.9313924312591553),
('perfect', 0.9243415594100952)]
  • 诸如BERT,ROBERTA和ALBERT之类的屏蔽语言模型 Transformer模型已使用称为“屏蔽语言模型”的预置任务在大量文本上进行了训练,其中该模型必须根据上下文预测屏蔽词。

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

    掩蔽词预测

    因此,我们可以使用遮罩预测来生成文本的变体。与以前的方法相比,生成的文本在语法上更加连贯,因为模型在进行预测时会考虑上下文。

    使用BERT的文本增强

    使用诸如转换器之类的开源库很容易实现拥抱脸。您可以设置要替换的令牌<mask>并生成预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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的单词替换
    此扩展方法由Xie等人提出在无监督数据增强论文中。基本思想是,TF-IDF分数较低的单词是无意义的,因此可以替换而不会影响句子的真实标签。

基于TF-IDF的单词替换

通过计算整个文档中单词的TF-IDF得分并取最低得分来选择替换原始单词的单词。您可以在此处的原始文件中参考此代码的实现。

2.反向翻译

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

反向翻译过程如下:

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

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

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

    回译的想法

您还可以一次使用不同的语言进行反向翻译,以产生更多的变化。如下所示,我们将英语句子翻译成目标语言,然后再将英语翻译成三种目标语言:法语,普通话和意大利语。

多步回译

该技术还被用在Kaggle上的“有毒评论分类挑战” 的第一名解决方案中。获胜者将其用于训练数据的扩充以及测试期间,在测试期间,英语句子的预测概率以及使用三种语言(法语,德语,西班牙语)的反向翻译的平均值将得到最终预测。

对于实施反向翻译,可使用 python translate 包和 textblob 包(少量翻译),或者使用百度翻译或谷歌翻译的api通过python实现。

反向翻译一般用于机器翻译和中文文本纠错任务

3.文字表面转换

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

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

文本的收缩和扩展

由于转换不应该改变句子的含义,因此我们可以看到,在展开歧义语言形式的情况下,这样做可能会失败:

语言形式扩展中的歧义

为解决此问题,本文建议我们允许歧义收缩,但跳过歧义扩展。

解决语言形式扩展中的歧义

您可以在此处找到英语的收缩列表。为了扩展,您可以使用Python中的收缩库。

4.随机噪声注入

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

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

    拼写错误注入

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

    QUERTY键盘错误注入

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

    会标噪声

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

    空白噪声

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

    句子改组

  • 随机插入
    该技术由Wei等人提出在他们的论文“轻松数据增强”中。在这种技术中,我们首先从不是停用词的句子中选择一个随机词。然后,找到其同义词,并将其插入句子中的随机位置。

    随机插入

  • 随机交换
    此技术也由Wei等人提出在他们的论文“轻松数据增强”中。想法是随机交换句子中的任何两个单词。

    随机交换

  • 随机删除
    该技术也是由Wei等人提出的在他们的论文“轻松数据增强”中。在这种情况下,我们以一定概率p随机删除句子中的每个单词。

    随机删除

5.实例交叉扩展

这项技术是Luque在他对TASS 2019的情感分析的论文中引入的。它受到遗传学中发生的染色体交叉操作的启发。
在该方法中,一条推文被分为两半,并且两个极性相同(即正/负)的随机推文被互换。假设是,即使结果将是不合语法且语义上不合理的,新文本仍将保留情感。

实例交叉扩展

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

实例交叉扩展对F1的影响

6.语法树操作

此技术已在Coulombe的论文中使用。想法是解析并生成原始句子的依存关系树,使用规则对其进行转换并生成释义的句子。
例如,一种不改变句子含义的转换是从主动语态到被动语态的转换,反之亦然。

语音变化的语法树处理

7.文字混合

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

视觉的原始混合算法

郭等人将此思想带给了自然语言处理修改了Mixup以处理文本。他们提出了两种新颖的方法来将Mixup应用于文本:

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

    单词嵌入混合

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

    句子嵌入的混合

8.生成方法

此工作尝试在保留班级标签的同时生成其他培训数据。

  • 条件预训练语言模型
    这项技术由Anaby-Tavor等人首先提出。在他们的论文“数据不足?深度学习进行救援!Kumar等人的最新论文。在多个基于变压器的预训练模型中评估了这个想法。问题表述如下:

    • 将班级标签附加到训练数据中的每个文本

      添加SEP和EOS令牌

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

      在标签和文本上微调GPT-2

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

      使用GPT-2生成新样本

EDA工具

结论

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

参考资料

EDA工具论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》

聊一聊,预处理和数据增强技术

相对全面的总结:让机器自动生成文本数据—NLP文本数据增强方法简述

思考为什么要做预处理,预处理做到什么程度的文章,非常棒。

NLP中的数据增强总结,包括多个NLP的具体任务

总结的非常全面的NLP中的数据增强方法:A Visual Survey of Data Augmentation in NLP


NLP数据增强方法总结
http://example.com/2020/07/03/2020-07-03-NLP数据增强方法总结/
作者
NSX
发布于
2020年7月3日
许可协议