NLP&NLU

NLP中数据增强的综述大全

2020-05-29  本文已影响0人  top_小酱油

与计算机视觉中使用图像进行数据增强不同,NLP中文本数据增强是非常罕见的。这是因为图像的一些简单操作,如将图像旋转或将其转换为灰度,并不会改变其语义。语义不变变换的存在使增强成为计算机视觉研究中的一个重要工具。

我很好奇是否有人尝试开发NLP的增强技术,并研究了现有的文献。在这篇文章中,我将分享我对当前用于增加文本数据的方法的发现。

方法

1. 词汇替换

这种方法试图在不改变句子主旨的情况下替换文本中的单词。

例如,你可以用三个最相似的单词来替换句子中的单词,并得到文本的三个变体。

使用像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)]

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

使用开源库这很容易实现,如Hugging Face的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分数较低的整个词汇表中选择的。你可以参考原文中的实现:https://github.com/googresearch/uda/blob/master/text/augmentation/word_level_augment.py

2. 反向翻译

在这种方法中,我们利用机器翻译来解释文本,同时重新训练含义。Xie et al.使用这种方法来扩充未标注的文本,并在IMDB数据集中学习一个只有20个有标注样本的半监督模型。该方法优于之前的先进模型,该模型训练了25,000个有标注的样本。

反向翻译过程如下:

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

[图片上传失败...(image-530637-1590722473752)]

这项技术也被用在了的Kaggle上的“Toxic Comment Classification Challenge”的第一名解决方案中。获胜者将其用于训练数据增强和测试期间,在测试期间,对英语句子的预测概率以及使用三种语言(法语、德语、西班牙语)的反向翻译进行平均,以得到最终的预测。

对于反向翻译的实现,可以使用TextBlob。或者,你也可以使用Google Sheets,并按照此处给出的说明:https://amitness.com/2020/02/backtransling-ingooglesheets/,免费申请谷歌翻译。

3. 文本表面转换

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

在本文中,他给出了一个将动词形式由简写转化为完整形式或者反过来的例子。我们可以通过这个来生成增强型文本。

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

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

你可以在这里找到英语缩略语的列表:https://en.wikipedia.org/wiki/wiki/wikipedia%3alist_of_english_contractions

4. 随机噪声注入

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

5. 实例交叉增强

这项技术是由Luque在他的关于TASS 2019情绪分析的论文中提出的。这项技术的灵感来自于遗传学中发生的染色体交叉操作。

该方法将tweets分为两部分,两个具有相同极性的随机推文(即正面/负面)进行交换。这个方法的假设是,即使结果是不符合语法和语义的,新文本仍将保留情感的极性。

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

6. 语法树操作

这项技术已经在Coulombe的论文中使用。其思想是解析和生成原始句子的依赖关系树,使用规则对其进行转换,并生成改写后的句子。

例如,一个不改变句子意思的转换是句子从主动语态到被动语态的转换,反之亦然。

实现

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

总结

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

参考原文:https://mp.weixin.qq.com/s/Ey24ZEAgFEl9ZN0jw2y76g

上一篇下一篇

猜你喜欢

热点阅读