NLP中的数据增广方法
author: Heisenberg
date:2020-09-20
CV 主要以图像中心旋转、灰度变换为主,图像本身含义变化不大。NLP则对此非常敏感。
NLP中Data Augmentation Techs:
一、词汇替换
-
基于同义词典的替换
WordNet: For English
ChineseSemanticKB:For Chinese
-
基于Word-Embedding的替换
Word2vec, Glove, FastText
#demo code import gensim.downloader as api model=api.load('glove-twitter-25') model.most_similiar('awesome',tpon=5)
-
基于Masked Language Model的替换
Bert、RoBERTa,ALBERT
基于预训练模型在考虑上下文的信息的基础上进行填充。
from transformers import pipeline nlp = pipeline('fill-mask') nlp('This is <mask> cool')
-
基于TF-IDF的替换
TF-IDF 分数较低的单词不能提供信息,因此可以在不影响句子的基本真值标签的情况下替换它们。(https://arxiv.org/abs/1904.12848)
二、Back Translation(回译)
使用机器翻译的方法生成复述的一段新的文本。
汉语—>英语/韩语/法语—>汉语(TextBlob或者谷歌翻译)
三、Text Surface Transformation
利用正则表达式进行模式匹配。
比如把动词的缩写形式转换为非缩写形式。She’s —> She is/She has 或者反方向。
对于中文来说不太适用
四、Random Noise Injection
为文本注入噪声生成新文本,使结果对扰动具有鲁棒性。
-
spelling error injection
添加一些随机单词的拼写错误
-
QWERTY Keyboard Error Injection
模拟输入文本时typo的产生
-
Unigram Noising
使用从 unigram 频率分布中采样的单词进行替换。这个频率基本上就是每个单词在训练语料库中出现的次数。
-
Blank Noising
用占位符标记替换一些随机单词。例如某论文中使用 “_” 作为占位符标记,他们使用它作为一种避免在特定上下文上过度拟合的方法以及语言模型平滑的机制
-
Sentence Shuffling
打乱训练文本的句子顺序
-
Random Insertion
首先从句子中随机选择一个不是停止词的词;然后找到它对应的同义词,并将其插入到句子中的一个随机位置。(NG20 news就用了 )
-
Random Swap
在句子中随机交换任意两个单词
-
Random Deletion
以概率 p 随机删除句子中的每个单词。
五、Instance Crossover Augmentation
intuition 来源于遗传学中的染色体交叉操作。
将用一个类别的文本各自交换一半的内容cross-over,虽然对语法和语义有所破坏,仍将保留原来的情绪类别。
六、Syntax-tree Manipulation
根据语义分析句法树使用规则对原来的的文本进行转述。e.g.主动语态和被动语态的转变、
七、MixUp for Text
intuition来自于CV中将两个随机图像按比例混合生成训练的额合成数据,可以作为正则化的方式。
-
wordMixup
一个小批中取两个随机的句子,它们被填充成相同的长度;然后,他们的 word embeddings 按一定比例组合,产生新的 word embeddings 然后传递下游的文本分类流程,交叉熵损失是根据原始文本的两个标签按一定比例计算得到的。
-
sentMixup
先把句子encoding和embedding之后再combine起来丢给模型。
八、生成式的方法
尝试在生成额外的训练数据的同时保留原始类别的标签。
-
在训练数据中预先加入类别标签,如下图所示。
-
在这个修改过的训练数据上 finetune 一个大型的预训练语言模型 (BERT/GPT2/BART) 。对于 GPT2,目标是去做生成任务;而对于 BERT,目标是要去预测被 Mask 的词语。
-
使用经过 finetune 的语言模型,可以使用类标签和几个初始单词作为模型的提示词来生成新的数据。本文使用每条训练数据的前 3 个初始词来为训练数据做数据增强。
九、实现
nlpaug、textattach两个库提供了很多data augmentation的方法。
大多数方法都是具有很强的任务属性的,并且针对这些方法的实验也只在某些特定的场景进行了验证。可以见得,系统地比较这些方法并且分析它们在其他任务上的表现在未来将是一项有趣的研究。