作者:amitness编译:ronghuaiyang

导读

深度学习视觉领域的增强方法可以很大程度上提高模型的表现,并减少数据的依赖,而NLP上做数据增强不像在图像上那么方便,但还是有一些方法的。

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

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

方法

1. 词汇替换

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

  • 基于词典的替换

    在这种技术中,我们从句子中随机取出一个单词,并使用同义词词典将其替换为同义词。例如,我们可以使用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”中使用了这种技术,以提高他们的语言模型在下游任务上的泛化能力。Wang et al.使用它来增加学习主题模型所需的tweet。

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

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

# pip install gensim
import gensim.downloader as apimodel = 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 Model

    像BERT、ROBERTA和ALBERT这样的Transformer模型已经接受了大量的文本训练,使用一种称为“Masked Language Modeling”的预训练,即模型必须根据上下文来预测遮盖的词汇。这可以用来扩充一些文本。例如,我们可以使用一个预训练的BERT模型并屏蔽文本的某些部分。然后,我们使用BERT模型来预测遮蔽掉的token。

因此,我们可以使用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的词替换

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

要替换的单词是从整个文档中TF-IDF分数较低的整个词汇表中选择的。你可以参考原文中的实现:https://github.com/googresearch/uda/blob/master/text/augmentation/word_level_augment.py。

2. 反向翻译

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

反向翻译过程如下:

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

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

  • 检查新句子是否与原来的句子不同。如果是,那么我们使用这个新句子作为原始文本的数据增强。

    ![img](A Visual Survey of Data Augmentation in NLP.assets/nlp-aug-back-translation.png)

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

![img](A Visual Survey of Data Augmentation in NLP.assets/nlp-aug-backtranslation-multi.png)

这项技术也被用在了的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. 随机噪声注入

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

  • 拼写错误注入

    在这种方法中,我们在句子中的一些随机单词上添加拼写错误。这些拼写错误可以通过编程方式添加,也可以使用常见拼写错误的映射,如:https://github.com/makcedward/nlpaug/blob/master/model/spelling_en.txt。

  • QWERTY键盘错误注入

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

  • Unigram噪声

    该方法已被Xie et al.和UDA论文所采用。其思想是用从单字符频率分布中采样的单词进行替换。这个频率基本上就是每个单词在训练语料库中出现的次数。

  • Blank Noising

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

  • 句子打乱

    这是一种朴素的技术,我们将训练文本中的句子打乱,以创建一个增强版本。

5. 实例交叉增强

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

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

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

6. 语法树操作

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

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

实现

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

总结

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

—END—

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑AI基础下载(pdf更新到25集)机器学习的数学基础专辑本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am喜欢文章,点个在看

NLP中数据增强的综述,快速的生成大量的训练数据相关推荐

  1. AI基础:数据增强方法综述

    导语 在深度学习时代,数据的规模越大.质量越高,模型就能够拥有更好的泛化能力,数据直接决定了模型学习的上限.然而在实际工程中,采集的数据很难覆盖全部的场景,比如图像的光照条件,同一场景拍摄的图片可能由 ...

  2. NLP中的数据增强技术综述

    NLP数据增强技术 1. 词汇替换 Lexical Substitution 基于词典的替换 Thesaurus-based substitution 基于词向量的替换 Word-Embeddings ...

  3. NLP中的数据增强方法综述

    论文链接:A Survey of Data Augmentation Approaches for NLP 摘要 由于越来越多的研究在低资源领域.新任务和需要大量训练数据的大规模神经网络中,NLP中的 ...

  4. 一篇就够!数据增强方法综述

    作者 | 太子长琴 整理 | NewBeeNLP 数据增强(Data Augmentation, DA)缓解了深度学习中数据不足的场景,在图像领域首先得到广泛使用,进而延伸到 NLP 领域,并在许多任 ...

  5. 序列数据的数据增强方法综述

    为了追求精度,深度学习模型框架的结构越来越复杂,网络越来越深.参数量的增加意味着训练模型需要更多的数据.然而人工标注数据的成本是高昂的,且受客观原因所限,实际应用时可能难以获得特定领域的数据,数据不足 ...

  6. unet图片数据增强_numpy实现深度学习遥感图像语义分割数据增强(支持多波段)

    前言 数据增强是指对训练样本数据进行某种变换操作,从而生成新数据的过程.数据增强的根本目的是得到充足的样本数据量,避免模型训练过程中产生过拟合现象. 正文 对于遥感影像来说,由于成像过程传感器对同一地 ...

  7. 【JavaScript】硬件通讯数据校验 BCC异或校验生成 按位取反 十六进制数据格式化

    十六进制(简写为hex或下标16)是一种基数为16的计数系统,是一种逢16进1的[进位制].通常用数字0.1.2.3.4.5.6.7.8.9和字母A.B.C.D.E.F(a.b.c.d.e.f)表示, ...

  8. 手动搭建的VGG16网络结构训练数据和使用ResNet50微调(迁移学习)训练数据对比(图像预测+前端页面显示)

    文章目录 1.VGG16训练结果: 2.微调ResNet50之后的训练结果: 3.结果分析: 4.实验效果: (1)VGG16模型预测的结果: (2)在ResNet50微调之后预测的效果: 5.相关代 ...

  9. 最新综述:用于文本分类的数据增强方法

    ©PaperWeekly 原创 · 作者 | 王馨月 学校 | 四川大学本科生 研究方向 | 自然语言处理 概要 数据增强,即通过转换为机器学习人工创建训练数据,是跨机器学习学科广泛研究的研究领域.它 ...

最新文章

  1. KS003基于JSP和Servlet实现的商城系统
  2. java编写龟兔赛跑_java--龟兔赛跑模拟
  3. dubbo中源码之缓存设计
  4. 写科研论文的高级方法学
  5. 网管必须掌握的八个DOS命令
  6. C++如何测试dll_Windows x86 Shellcode开发:寻找Kernel32.dll地址
  7. 7种不同的数据标准化(归一化)方法总结
  8. Citrix虚拟桌面高拍仪上传图片调优方法
  9. Android Webview下载Blob文件
  10. qlv视频怎么转换成mp4格式工厂?如何用格式工厂将qlv格式转换成mp4格式?
  11. ctf 实验吧 围在栅栏中的爱 (最近一直在好奇一个问题,QWE到底等不等于ABC? )
  12. PHP 中openssl_pkey_get_private函数获取私钥返回 FALSE 的问题
  13. 劝学篇翻译软件测试,汪洙《神童诗劝学篇》原文与译文
  14. 3D模型欣赏:《皇冠女孩》次时代 玄幻 美女
  15. fiddler进行弱网测试
  16. 用iPhone前摄3D人像建模,Meta:我看行
  17. TensorFlow学习日记之tflearn
  18. 零基础新手小白学编程必会的100个代码
  19. PC网站接入微信登陆流程四:后端处理登陆后的code,和获取微信登陆用户的信息
  20. 第二十二讲:自尊与自我实现 第二十三讲:总结(完)

热门文章

  1. 惠普前总裁孙振耀指点职业规划
  2. 和身份证有关的5个Excel函数公式
  3. Linux 工程向 Windows 平台迁移的一些小小 tips
  4. Java VisualVM插件地址
  5. hdu (欧拉函数+容斥原理) GCD
  6. centos6.2系统使用扩展源epel报错问题解决方法
  7. .net中从GridView中导出数据到excel(详细)
  8. HDU-4059 The Boss on Mars 容斥定理
  9. Android按钮持续按下执行,Android 按钮长按下去重复执行某个动作,放开后停止执行动作...
  10. 基于php的问答,thinkask