共计 6728 个字符,预计需要花费 17 分钟才能阅读完成。
在机器学习中,训练数据集的品质在很大水平上决定了模型的有效性。咱们往往没有足够的多样化数据,这影响了模型的准确性。这时数据加强技术就派上了用场。
数据加强能够通过增加对现有数据进行稍微批改的正本或从现有数据中新创建的合成数据来减少数据量。这种数据裁减的形式在 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