热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NLP简单的数据增强方法

NLP简单的数据增强方法当训练数据量不充分,或者分布单一的情况下,数据增强可以快速扩充语料以避免过拟合的问题,同时,数据增强
NLP简单的数据增强方法

  当训练数据量不充分,或者分布单一的情况下,数据增强可以快速扩充语料以避免过拟合的问题,同时,数据增强也可以提升模型的鲁棒性,避免微弱的变化使得模型无法泛化到相似的语境中。
  本文介绍几种比较简单但常用的NLP数据增强方法,包括显式和隐式两个方面,在实验或比赛中可以提升效果。可使用nlpaug工具快速实现这些技术。



一、动机


  • 机器学习和深度学习在包括文本分类等自然语言任务达到不错的效果,但他们需要依赖于大规模的标注数据,除了直接使用小样本学习外,显式数据增强格外有效;
  • 数据增强在计算机视觉中得以应用,其可以在数据量很少的情况下提升模型的鲁棒性;而在NLP中,通用的文本类型的数据增强还没有完全被挖掘出来;

二、显式数据增强

  给定一个输入文本,在尽可能不改变原是文本语义的情况下,微调或修改部分字符或词可以实现快速的增强,主要包括如下几种类型:

  • (1)同义词替换 (SR):随机挑选 nnn非停用词,分别根据其同义词表随机替换一个同义词;


对于分类、回归等任务,可以使用反义词表替换所有原始词性的词,实现负采样,也是一种数据增强方法。但使用同义词或反义词表进行替换时,很难保证文本的语义是否符合预期。


  • (2)随机插入 (RI):在句子中随机找到一个非停用词,并随机选择其对应的一个同义词,将该同义词插入句子中的随机位置。重复执行 nnn 次;
  • (3)随机交换 (RS):在句子中随机挑选两个词,并交换位置,重复执行 nnn 次;
  • (4)随机删除 (RD):对每个词,有一定概率 ppp 进行删除;
  • (5)标点插入 (PI):随机挑选若干位置,并分别随机插入标点符号;

  由于输入的文本长度长短不一,直觉上希望较长的句子 nnn 较大,因此通过一个参数 α\alphaα 控制,即 n=l×αn=l\times\alphan=l×α,对于RD,概率 p=αp=\alphap=α

  本文对标点插入 PI进行了实现,以中文为例,如下所示:

  • 借助Spacy分词工具,需要安装Spacy,使用Spacy进行分词、分析词性,根据分词和词性选择需要插入的标点。
  • 标点符号可以选择 ,。? !;“ ” 等。

import numpy as np
import spacy
import random
from typing import Dict
from tqdm import tqdmclass DataAugmentation:def __init__(self):self.nlp &#61; spacy.load(&#39;zh_core_web_sm&#39;)def fit(self, examples: Dict[str, list]):self.examples &#61; examples # {&#39;text&#39;: [], &#39;label&#39;: [], &#39;id&#39;: []}# 简单的数据增强&#xff1a;增加标点符号text_list &#61; self.examples[&#39;text&#39;]label_list &#61; self.examples[&#39;label&#39;]id_list &#61; self.examples[&#39;id&#39;]aug_text_list, aug_label_list, aug_id_list &#61; [], [], []pun &#61; [&#39;&#xff0c;&#39;, &#39;。&#39;, &#39;&#xff1f;&#39;, &#39;&#xff01;&#39;, &#39;&#xff1b;&#39;, &#39;"&#39;]for ei in tqdm(range(len(text_list))):text &#61; text_list[ei]label &#61; label_list[ei]id &#61; label_list[ei]doc &#61; self.nlp(text) # spacy分词token_list, pos_list &#61; [], []for token in doc:token_list.append(token.text)pos_list.append(token.pos_)if len(token_list) - 1 >&#61; 1:num &#61; 0state &#61; Falsewhile num < 5:num &#43;&#61; 1insert_position &#61; random.randint(1, len(token_list) - 1)if token_list[insert_position] in pun or token_list[insert_position - 1] in pun:continuetoken_list.insert(insert_position, &#39;&#xff0c;&#39;) # 随机插入一个标点符号pos_list.insert(insert_position, &#39;PUN&#39;) # 随机插入一个标点符号state &#61; Truebreakif state is True:augment_text &#61; &#39;&#39;.join(token_list)# print(&#39;origin text: {}&#39;.format(text))# print(&#39;augmen text: {}&#39;.format(augment_text))aug_text_list.append(augment_text)aug_label_list.append(label)aug_id_list.append(len(id_list) &#43; ei &#43; 1)return {&#39;text&#39;: text_list &#43; aug_text_list, &#39;label&#39;: label_list &#43; aug_label_list, &#39;id&#39;: id_list &#43; aug_id_list}if __name__ &#61;&#61; &#39;__main__&#39;:data_augmentation &#61; DataAugmentation()dataset &#61; {&#39;text&#39;: [&#39;今天的天气很好&#xff0c;非常适合去旅游。&#39;], &#39;label&#39;: [1], &#39;id&#39;: [0]}dataset &#61; data_augmentation.fit(dataset)print(dataset)

演示效果&#xff1a;
在这里插入图片描述

除了前述的几种方法&#xff0c;也可以采用如下几种新的策略&#xff1a;

  • &#xff08;6&#xff09;单词缩写、全写&#xff1a;例如可以建立一个词表&#xff0c;对所有存在简写的词进行替换&#xff0c;例如 It is可以替换为 It’s&#xff0c;England可替换为UK.等&#xff1b;
  • &#xff08;7&#xff09;错误拼写 &#xff08;WS&#xff09;&#xff1a;有时候为了提高鲁棒性&#xff0c;会故意将文本中的单词或字符使用错误拼写的单词或字符进行替换&#xff0c;在不影响语义的条件下引入少量噪声。例如 I like this book可以替换为 I like thes book。对于中文&#xff0c;也可以构建confusion set&#xff0c;替换字形或字音相似的词&#xff0c;例如“上海是经济中心”可以替换为“上海时经济中心”。但注意需要保证原始语义。
  • &#xff08;8&#xff09;统计特征 &#xff08;SF&#xff09; &#xff1a;通常很多词在大规模语料中具有一定的统计特征&#xff0c;例如TF-IDF、互信息量等。在使用TF-IDF和互信息量时&#xff0c;可选择值较小的进行随机替换。

三、隐式数据增强

  因为直接对原是文本进行数据增强&#xff0c;很难避免维持原始的文本语义&#xff0c;因此可以可以通过在语义空间上进行隐式数据增强&#xff0c;简单列出几种方法&#xff1a;

  • 词向量替换&#xff1a;通过word2vec或GloVe预训练的词向量获得相似的词&#xff0c;对于给定某个词&#xff0c;则可以直接随机选择相似的词的词向量进行替换&#xff1b;
  • 词向量的原型向量&#xff1a; 通过word2vec或GloVe预训练的词向量&#xff0c;可以通过对所有相似的词或token的embedding进行平均池化。一般认为语义相似的词在语义空间内会聚集在一起&#xff0c;因此其平均的词向量可以认为是这些相似语义词的原型向量&#xff08;prototype embedding&#xff09;&#xff0c;原型向量可以作为隐式增强表征&#xff1b;
  • Dropout&#xff1a; 在对文本使用RNN、CNN或BERT等进行表征后&#xff0c;得到融合上下文信息的embedding&#xff0c;可以采用随机dropout法。具体地说&#xff0c;假设一个embedding是 [0.1, 0.4, 0.2, -0.5]&#xff0c; 随机dropout旨在随机挑选一个元素替换为0&#xff0c;例如挑选第2个位置的元素替换为0&#xff0c;变为 [0.1, 0.0, 0.2, -0.5]。随机dropout参考了计算机视觉领域内对图像表征后的feature map进行mask的操作&#xff08;在语义特征上添加噪点&#xff09;以实现增强&#xff1b;
  • 语言模型 Masked Language Modeling&#xff08;MLM&#xff09;&#xff1a; MLM是BERT等预训练语言模型在大规模语料上自监督训练目标&#xff0c;其旨在随机挖掉一个文本中的token并让模型预测该词。由于大规模训练&#xff0c;使得模型可以预测出许多相似的结果&#xff0c;例如“I like this book because it is funny.”&#xff0c;我们可以让MLM生成与“funny”具有同等语义的词&#xff1a;


  • 机器翻译&#xff1a; 基于机器翻译的方法&#xff0c;将原始文本翻译为另一种语言&#xff0c;并再次进行回译。该方法比较类似计算机视觉中的自编码器。但该方法需要率先在领域数据上进行训练&#xff0c;且依赖于大量的平行语料&#xff0c;较为繁琐&#xff1b;
  • 文本生成&#xff1a; 基于生成的方法可以在不改变原始语义的前提下生成出上述无法显式构造的新文本。但基于生成的方法依然依赖于所属领域的训练数据。

如果需要增强的文本所属一个新的领域&#xff08;例如医疗、生物&#xff09;&#xff0c;基于翻译和生成的方法则需要先在该领域的相关语料上进行训练&#xff0c;得到较为鲁棒的翻译或生成模型。但数据增强又是为了增强数据量&#xff0c;没有充分又无法训练翻译或生成模型&#xff0c;产生矛盾。因此通常对新的领域或任务上不会首选这两种方法。


  • 对抗训练&#xff1a; 引入对抗样本实现数据增强&#xff0c;例如下图&#xff08;左&#xff09;是少量样本时学习的决策边界&#xff0c;对每个样本在一定范围内进行扰动攻击&#xff0c;使得在直观上无法辨别&#xff0c;但在语义空间内则会影响样本的决策&#xff0c;例如下图&#xff08;中&#xff09;&#xff0c;五角星则代表对抗样本。因此图&#xff08;右&#xff09;引入对抗训练目标以修改决策边界。通常对抗训练目标可以是对增强的样本伪造其标签以增强鲁棒性。


  • 对比学习&#xff1a; 如果样本少&#xff0c;那就尽可能学习这些样本之间的差异。对比学习旨在构建样本对来解决训练困难问题&#xff0c;因为构建了样本对&#xff0c;所以间接地增加了数据量。虽然对比学习最初目标不是为了数据增强&#xff0c;但可以通过添加对比学习loss来隐式地提升鲁棒性&#xff1b;
  • 自监督辅助任务&#xff1a; 如果目标NLP数据量少&#xff0c;那么可以直接引入大规模无监督语料&#xff08;例如Wikipedia&#xff09;&#xff0c;并在具体任务训练时添加辅助学习目标&#xff0c;通过语义层面上实现增强&#xff1b;

例如在进行文本分类任务上时&#xff0c;除了文本分类损失函数外&#xff0c;还可以添加类似MLM的辅助任务&#xff0c;或者添加额外的多任务信息


  • 知识图谱增强&#xff08;远程监督法&#xff09;&#xff1a; 远程监督可以快速地启发式构建大规模标注数据&#xff0c;目前在信息抽取任务上使用广泛&#xff0c;其旨在通过一个已有的知识图谱或规则来直接对无监督的语料进行标注&#xff0c;但远程监督方法容易引入大量噪声。

在关系抽取任务中&#xff0c;通过知识库中已有的三元组&#xff08;例如<乔布斯&#xff0c;创始人&#xff0c;苹果>&#xff09;&#xff0c;来标注一批新的实体对语料。但对于文本“乔布斯吃了一个苹果”而言&#xff0c;远程监督法依然会标注为“创始人”&#xff0c;但显然这是噪声。对于噪声&#xff0c;则可以通过一些规则&#xff0c;或Attention的方法解决。


  • 半监督方法&#xff1a; 半监督法旨在对少量有标签数据上进行训练&#xff0c;然后在无标签数据上进行推理&#xff0c;并获得高置信度的伪标签数据后&#xff0c;再进行训练。因此伪标签数据可以作为数据增强部分语料&#xff0c;但依然容易引入噪声。

对于噪声部分&#xff0c;则可以采用几种策略&#xff1a;&#xff08;1&#xff09;提高置信度阈值&#xff0c;&#xff08;2&#xff09;多个不同的模型共同预测伪标签&#xff0c;取全部预测正确的作为可信样本&#xff1b;&#xff08;3&#xff09;伪标签数据回测评估&#xff1a;如果加入伪标签的数据后效果变差&#xff0c;则需要剔除或更改标签。



参考文献&#xff1a;
【1】EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks. (EMNLP2019)
【2】AEDA: An Easier Data Augmentation Technique for Text Classification. (EMNLP2021 Findings)
【3】开源NLP数据增强工具&#xff1a;https://github.com/makcedward/nlpaug&#xff0c;附加博客&#xff1a;https://towardsdatascience.com/data-augmentation-in-nlp-2801a34dfc28
【4】Data Augmentation Approaches in Natural Language Processing: A Survey
【5】哈工大总结的15个数据增强方法


推荐阅读
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • Keras 实战:自编码器入门指南
    本文介绍了使用 Keras 框架实现自编码器的基本方法。自编码器是一种用于无监督学习的神经网络模型,主要功能包括数据降维、特征提取等。通过实际案例,我们将展示如何使用全连接层和卷积层来构建自编码器,并讨论不同维度对重建效果的影响。 ... [详细]
  • Chapter11&12:DefocusBlur&FinalScene在Camera.h中修改如下:#pragmaonce#define_USE ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 在Python编程学习过程中,许多初学者常遇到各种功能实现难题。虽然这些问题往往并不复杂,但找到高效解决方案却能显著提升编程效率。本文将介绍一个名为‘30-seconds-of-python’的优质资源,帮助大家快速掌握实用的Python技巧。 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
author-avatar
谁的板砖在飞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有