使用NLPAUG 进行文本数据的扩充增强

news2024/11/25 21:44:04

在机器学习中,训练数据集的质量在很大程度上决定了模型的有效性。我们往往没有足够的多样化数据,这影响了模型的准确性。这时数据增强技术就派上了用场。

数据增强可以通过添加对现有数据进行略微修改的副本或从现有数据中新创建的合成数据来增加数据量。这种数据扩充的方式在CV中十分常见,因为对于图像来说可以使用很多现成的技术,在保证图像信息的情况下进行图像的扩充。

但是对于文本数据,这种技术现在应用的还很少,所以在本文中我们将介绍如何使用Python的nlpag库进行文本扩充。比如说在自然语言处理(NLP)中最常见的任务之一的文本分类中,需要大量的数据来训练模型。我们也可以通过文本增强技术提高NLP模型的性能。

NLPAUG

nlpag是一个由Edward Ma开发的开源Python库,该库提供了一系列字符、单词和句子的文本增强器,一般情况下只需3-5行代码即可应用。

安装也非常简单:

 pip install nlpaug
 conda install -c makecedward nlpaug

如果要是用同义词或反义词扩展,则需要安装NLTK库。

 pip install nltk

如果要进行词嵌入的增强,则需要下载一个预训练的模型。比如说下载word2vec、glove或fasttext:

 from nlpaug.util.file.download import DownloadUtil
 DownloadUtil.download_word2vec(dest_dir='.') # Download word2vec model
 DownloadUtil.download_glove(model_name='glove.6B', dest_dir='.') # Download GloVe model
 DownloadUtil.download_fasttext(model_name='wiki-news-300d-1M', dest_dir='.') # Download fasttext model
 
 pip install gensim

如果要对句子执行反向翻译增强,则要安装SacreMoses库:

 pip install sacremoses

以上就是使用NLPAUG 的一些基本的环境设置了,下面我们看看这个库的功能:

字符级的增强

character augmenter 通过在字符级别应用指定的更改来生成文本数据的变体。它通过引入诸如字符替换、删除、插入或其他调整之类的更改。

nlpag的nlpaug.augmenter.charmodule提供了三种字符增强技术:Keyboard augmenter, Optical character recognition augmenter, Random augmenter.

1、Keyboard augmenter

Keyboard augmenter是一种文本增强技术,它通过插入输入错误来增强文本数据。在字符级别,它用键盘上近距离的字符替换单词中的字符,模拟打字时出现键盘错误的可能性。该方法生成的增强文本数据类似于现实环境中通常遇到的排版错误,可以提高了训练数据的泛化性。

nlpag的char.KeywordAug()函数对文本输入应用打字错误模拟:

 import nlpaug.augmenter.char as nac
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Keyboard 
 aug = nac.KeyboardAug()
 augmented_text = aug.augment(text)
 print(augmented_text)

2、Optical Character Recognition Augmenter(OCR)

字符识别(OCR)是一种将图像或文档转换为可由机器读取的文本的技术。它通过分析图像的视觉模式,识别单个字符或单词,并将其转换为文本来实现这一点。

OCR模型通常会犯错误,例如将“0”与“0”或“I”与“1”混淆。nlpaaug的char. ocaug()增数器通过替换字符在文本中引入字符级OCR错误:

 import nlpaug.augmenter.char as nac
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # OCR
 aug = nac.OcrAug()
 augmented_text = aug.augment(text)
 print(augmented_text)

3、Random Augmenter

随机增强器为文本数据引入随机变量。它模拟了语言中自然发生的不同类型的错误。nlpag的RandomCharAug()函数可以用相似的字符替换字符,随机交换相邻字符,或者在文本中删除或插入随机字符。这些变化有助于更多样化的训练数据集,并在处理实际数据时提高模型的鲁棒性。

可以使用操作参数选择单一类型的操作:插入、替换、交换、删除。

 import nlpaug.augmenter.char as nac
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Random - Character level - insert
 aug = nac.RandomCharAug(action="insert")
 augmented_text = aug.augment(text)
 print(augmented_text)

单词级的增强

单词的扩充技术包括用同义词替换单词,插入或删除单词,甚至改变句子中单词的顺序。

单词级增强可以用于训练NLP任务的模型,例如文本分类和情感分析,其中多样化的训练数据集可以增强模型在真实文本上的性能。

nlpag的nlpag .augment .word模块提供了十种单词增强技术:同义词增强、反义词增强、拆分增强、拼写增强、保留词增强、词嵌入增强、上下文词嵌入增强、反翻译增强、TF-IDF增强、随机词增强。这些方法的调用基本都类似,所以我们只使用1-2个来进行举例。

1、同义词

nlpaaug的SynonymAug()根据WordNet/PPDB同义词替换相似的单词。可以使用aug_src参数来选择使用哪个模型:

 import nlpaug.augmenter.word as naw
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Synonym
 aug = naw.SynonymAug(aug_src='wordnet')
 augmented_text = aug.augment(text)
 print(augmented_text)

2、保留词

保留词扩充技术对文本进行目标词替换操作。这种技术允许可以选择在增强过程中必须保持不变的单词。当希望在保留文本的其他部分的同时对文本的特定部分应用增强时,此技术非常有用。

nlpag的ReservedAug()函数替换列表中未定义的单词,该列表作为参数传递给reserved_token参数:

 import nlpaug.augmenter.word as naw
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Reserved words
 reserved_tokens = ['lion', 'windows']  # Specify the reserved tokens here
 aug = naw.ReservedAug(reserved_tokens=reserved_tokens)
 augmented_text = aug.augment(text)
 print(augmented_text)

3、上下文词嵌入

上下文词嵌入可以理解句子中单词的含义和上下文,并将其输入周围环境,或者用预训练语言模型(如BERT、DistilBERT、RoBERTa或XLNet)中的前n个相似单词替换它们。

nlpag的context_word_embs()函数利用上下文词嵌入来查找前n个相似的词进行增强。可以使用action 参数指定要应用的一种操作类型:插入或替换。

 import nlpaug.augmenter.word as naw
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Contextual Word Embeddings - Word level
 aug = naw.ContextualWordEmbsAug()
 augmented_text = aug.augment(text)
 print(augmented_text)

4、反向翻译

反向翻译使用预训练的机器学习模型将文本从一种语言翻译成另一种语言,然后再翻译回原始语言。通过这种往返翻译为文本增加了多样性。当需要增强训练数据的大小时,这种文本增强技术非常有用。

nlpaaug的Back_TranslationAug()函数利用两种翻译模型进行增强:

 import nlpaug.augmenter.word as naw
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Back translation
 aug = naw.BackTranslationAug()
 augmented_text = aug.augment(text)
 print(augmented_text)

5、TF-IDF

TF-IDF通过将Term Frequency (TF)乘以Inverse Document Frequency (IDF)来计算文本中单词的TF-IDF分数。这些分数表明了一个词在一篇文章中的重要性。

TF-IDF得分低的单词被认为与文本的意思不太相关,更有可能被其他得分低的单词所取代。这种技术创造了不改变原始文本含义的变体。

需要说明的是L:TF-IDF模型必须在数据集上进行训练,之后可以使用nlpag的TfIdfAug()函数根据分数插入或替换单词。

 import sklearn.datasets
 import re
 import nlpaug.augmenter.word as naw
 import nlpaug.model.word_stats as nmw
 
 # Defining a tokenizer function to extract word tokens
 def _tokenizer(text, token_pattern=r"(?u)\b\w\w+\b"):
     token_pattern = re.compile(token_pattern)
     return token_pattern.findall(text)
 
 # Load sample data (Scikit Learn 20 News Groups)
 train_data = sklearn.datasets.fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))
 train_x = train_data.data
 
 # Tokenize input
 train_x_tokens = [_tokenizer(x) for x in train_x]
 
 # Train TF-IDF model
 tfidf_model = nmw.TfIdf()
 tfidf_model.train(train_x_tokens)
 tfidf_model.save('.')
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Augment the text with TFIDF augmenter
 aug = naw.TfIdfAug(model_path='.', tokenizer=_tokenizer)
 augmented_text = aug.augment(text)
 print(augmented_text)

段句级增强

文本扩充也可以在句子层面进行,这包括在保持文本的一般上下文和含义的同时,对句子进行变化或调整。增句技巧的例子包括根据上下文插入单词或在保持语法准确性的情况下重新排列句子中的单词顺序。

nlpag的nlpag . augmester .sentence模块提供了四个句子增强器:

1、抽象摘要

抽象摘要是对给定文本进行简洁总结的任务,该摘要捕获了原始内容的关键概念和含义。可以包括源文本中没有出现的新短语和句子。

采用抽象摘要的文本增强可以带来短语结构和内容的多样性和差异性,这可能对训练NLP模型有用的。

 import nlpaug.augmenter.sentence as nas
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Abstractive Summarization
 aug = nas.AbstSummAug()
 augmented_text = aug.augment(text)
 print(augmented_text)

2、上下文词嵌入

在句子级增强的上下文中,上下文词嵌入从预训练模型(如XLNet、GPT2或蒸馏GPT2)中添加具有前n个相似词的新句子。

nlpag的ContextualWordEmbsForSentenceAug()函数利用上下文词嵌入来插入新句子:

 import nlpaug.augmenter.sentence as nas
 
 text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."
 
 # Contextual Word Embeddings - Sentence level
 aug = nas.ContextualWordEmbsForSentenceAug()
 augmented_text = aug.augment(text)
 print(augmented_text)

3、LAMBADA

基于语言模型的数据增强(LAMBADA)使用预训练的语言模型来预测句子中缺失的单词并生成替代句子变体。

LAMBADA技术的灵感来自LAMBADA数据集,该数据集由书籍中的段落组成,其中最后一个单词被删除。目标是预测缺失的单词,这需要对上下文有深刻的理解。LAMBADA文本增强利用语言模型,如GPT或BERT,通过预测给定上下文的缺失单词来生成新句子。

使用LAMBADA增强器是在句子结构中引入多样性和提高NLP模型训练数据质量的极好方法。

LAMBADA模型必须在数据集上进行训练,之后可以使用nlpag的LambadaAug()函数应用句子级增强。

4、随机

对输入文本应用随机的句子级增强行为。nlpag的RandomSentAug()函数可以随机交换、裁剪或删除句子。这些变化有助于更多样化的训练数据集。

总结

nlpag库提供了一组不同的文本增强技术,可以显著提高NLP任务的文本数据的质量和多样性。从同义词替换等简单操作到上下文词嵌入等高级技术,nlpag为该学科的学者和从业者提供了广泛的工具包。

这里是它的Github地址,更详细的信息可以在这里找到:

https://avoid.overfit.cn/post/038630f67e144beca6cd1c8776e1e088

作者:Marc Bolle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录训练营Day53|1143.最长公共子序列;1035.不相交的栈;53.最大子序和

1143.最长公共子序列 class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp new int[text1.length()1][text2.length()1];for(int i1;i<text1.length();i){for(int j1;j<text2.length();j){if(text1.charAt(i-1)text2.charAt(…

12性能提升:如何提升gRPC系统性能

这篇文章我们来一起学习下如何提升gRPC系统服务的性能。 gRPC 是一个高性能、开源的 RPC 框架,设计目标是支持多种编程语言和多种平台。它基于 Google 发布的 Protobuf(Protocol Buffers)序列化协议,可以在不同的应用程序之间传输数据。gRPC 具有高效率和可扩展性的特点,…

python3 爬虫相关学习7:使用 BeautifulSoup下载网页图片到本地文件夹

目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2 直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因&#xff1a; 没有提前安装这个bs4 模块 2.3 如何提前知道我的python环境…

【微信小程序】wxml、wxss、js、json文件介绍

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;微信小程序的入门介绍 【前言】书接上回&#xff0c;我们知道了一个小程序的构成结构&#xff0c;接下来我们来进一步学习小程序的目录结构中的.wxml、.wxss、.js、.json。 目录 ⭐ 一…

一学就会-----链表中倒数第K个节点

文章目录 题目描述思路一代码示例思路二代码示例 题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 图片示例&#xff1a; 思路一 由于这道题目并没有要求时间复杂度&#xff0c;我们完全可以先遍历一遍链表&#xff0c;得到链表的结点总数&#xff08;count&am…

利用Zookeeper实现集群选举

什么是Zookeeper 分布式开源协调系统&#xff0c;数据模型简单&#xff0c;可以实现同步&#xff0c;配置管理&#xff0c;分组管理&#xff0c;分命名空间管理等。 技术本质 一个原子消息传递系统&#xff0c;它使所有服务器保持同步 FLP(3个科学家名字命名) 理论角度&…

【Spring Security】的RememberMe功能流程与源码详解,基础-进阶-升级-扩展,你学会了吗?

文章目录 前言原理 基础版搭建初始化sql依赖引入配置类验证 源码分析 进阶版集成源码分析疑问1疑问2 鉴权 升级版集成初始化sql配置类验证 源码分析鉴权流程 扩展版 前言 之前我已经写过好几篇权限认证相关的文章了&#xff0c;有想复习的同学可以查看【身份权限认证合集】。今…

OpenAI官方提示词课(三)如何总结文章

现在是信息爆炸时代&#xff0c;打开手机&#xff0c;各种文章扑面而来。我们的精力是有限的。如果有人帮忙把文章总结好给我们&#xff0c;这不就节省了很多时间嘛&#xff01;我们也就可以阅读更多的文章了。 恰好大语言模型在总结文章方面非常有天赋。 下面来看看示例。 …

数学基础第二天

介绍 对于Hissian矩阵是正定的&#xff0c;在这一点是整个范围内的最小值&#xff0c;y在各个方向的二阶导数都是>0的 对于Hissian矩阵是负定的&#xff0c;在这一点是整个范围内的最大值&#xff0c;y在各个方向的二阶导数都是<0的, 对于Hissian矩阵是不定的&#xff…

有了这个工具,支付宝商家多个账号下的账单管理更方便了

大家好&#xff0c;我是小悟 为方便拥有多个支付宝账号的商家获取自身业务、资金数据及下载对账单的能力&#xff0c;为商家提供了商家账单产品&#xff0c;商家可以通过该产品系统化接入账单数据&#xff0c;实现支付宝商家多个账号账单管理的功能。 为拥有多个支付宝账号的…

华为OD机试真题 JavaScript 实现【求符合要求的结对方式】【2023Q1 100分】,附详细解题思路

一、题目描述 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入描述 6 2 3 3 4 5 1 6 第一行为员工的总人数&#xff…

centos 7 安装git并配置ssh

一、安装 1、查看是否安装git <span style"color:#333333"><span style"background-color:#ffffff"><code class"language-perl">rpm -qa|<span style"color:#0000ff">grep</span> git </code>…

【白嫖系列】永久免费域名申请教程 eu.org

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 eu.org注册激活注册域名解析 eu.org eu.org 一个从1996开始提供免费域名的组织, 其官网地址是 https://nic.eu.org/ 他帮助学生、爱好者或者非营利组织不用花费购买域名就可能拥有自己的免费域名&#x…

2023.6.9小记——ARM的工作模式与状态

今天打算学一点就写一点&#xff0c;不然全部堆积到晚上压力太大了&#xff0c;有些东西写不完就要睡觉了&#x1f4a4; 1. 什么是numpy&#xff1f; 1.1 numpy简介 是Python中的用于科学计算的库&#xff0c;提供高性能的多维数组对象和对应的操作函数&#xff0c;用于处理大…

微信小程序——实现蓝牙设备搜索及连接功能

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

NewBing神器,让你在Chrome轻松使用ChatGPT4智能AI

ChatGPT4 相对于 3.5 优势 相较于 ChatGPT3.5&#xff0c;ChatGPT4 有以下优势&#xff1a; 更大的模型规模&#xff1a;ChatGPT4 有超过 16 亿个参数&#xff0c;是 ChatGPT3.5 的 4 倍之多&#xff0c;这意味着它可以处理更复杂的对话场景和更长的对话历史。更好的对话质量…

通过xfsdump和xfsrestore命令实现RHEL7 xfs文件系统误删除文件的恢复

在linux系统中&#xff0c;我们有时会“不小心”误删除一些文件&#xff0c;如果是自己是测试环境服务器可能“无所谓”。但是一旦发生在客户的生产环境&#xff0c;那就是“重大安全事故”。 我们能不能提前对一些重要的文件系统进行备份&#xff0c;以便当我们真的误删除一些…

2023最新最全面Java复习路线(含P5-P8),已收录 GitHub

小编整理出一篇 Java 进阶架构师之路的核心知识&#xff0c;同时也是面试时面试官必问的知识点&#xff0c;篇章也是包括了很多知识点&#xff0c;其中包括了有基础知识、Java 集合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC 、Kafka、日记、设计模式、Java 算法、…

SQLServer2022安装(Windows),已验证

一、SQLServer2022下载 1、官网下载地址 SQL Server 下载 | Microsoft 2、下载安装包 2.1、选择Developer版本&#xff0c;立即下载。 2.2、打开下载文件夹&#xff0c;双击运行SQL2022-SSEI-Dev.exe 尝试运行SQL2022-SSEI-Dev.exe&#xff0c;会收到以下信息&#xff1a;“…

3.Hive系列之docker-compose部署升级总结

1. 版本号修改 对于升级而言&#xff0c;我们最先考虑的是docker hub中有的较新的版本&#xff0c;然后我们需要简单了解下hadoop2与hadoop3的区别&#xff0c;首先明确的是端口号有所改变&#xff0c;如下图所示 2. Hive镜像构建 刚刚我们修改了Hive为bde2020/hive:3.1.2-po…