使用 NLPAUG 進(jìn)行文本數(shù)據(jù)的擴(kuò)充增強(qiáng)
在機(jī)器學(xué)習(xí)中,訓(xùn)練數(shù)據(jù)集的質(zhì)量在很大程度上決定了模型的有效性。我們往往沒有足夠的多樣化數(shù)據(jù),這影響了模型的準(zhǔn)確性。這時數(shù)據(jù)增強(qiáng)技術(shù)就派上了用場。
數(shù)據(jù)增強(qiáng)可以通過添加對現(xiàn)有數(shù)據(jù)進(jìn)行略微修改的副本或從現(xiàn)有數(shù)據(jù)中新創(chuàng)建的合成數(shù)據(jù)來增加數(shù)據(jù)量。這種數(shù)據(jù)擴(kuò)充的方式在CV中十分常見,因為對于圖像來說可以使用很多現(xiàn)成的技術(shù),在保證圖像信息的情況下進(jìn)行圖像的擴(kuò)充。
但是對于文本數(shù)據(jù),這種技術(shù)現(xiàn)在應(yīng)用的還很少,所以在本文中我們將介紹如何使用Python的nlpag庫進(jìn)行文本擴(kuò)充。比如說在自然語言處理(NLP)中最常見的任務(wù)之一的文本分類中,需要大量的數(shù)據(jù)來訓(xùn)練模型。我們也可以通過文本增強(qiáng)技術(shù)提高NLP模型的性能。
NLPAUG
nlpag是一個由Edward Ma開發(fā)的開源Python庫,該庫提供了一系列字符、單詞和句子的文本增強(qiáng)器,一般情況下只需3-5行代碼即可應(yīng)用。
安裝也非常簡單:
pip install nlpaug
conda install -c makecedward nlpaug
如果要是用同義詞或反義詞擴(kuò)展,則需要安裝NLTK庫。
pip install nltk
如果要進(jìn)行詞嵌入的增強(qiáng),則需要下載一個預(yù)訓(xùn)練的模型。比如說下載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
如果要對句子執(zhí)行反向翻譯增強(qiáng),則要安裝SacreMoses庫:
pip install sacremoses
以上就是使用NLPAUG 的一些基本的環(huán)境設(shè)置了,下面我們看看這個庫的功能:
字符級的增強(qiáng)
character augmenter 通過在字符級別應(yīng)用指定的更改來生成文本數(shù)據(jù)的變體。它通過引入諸如字符替換、刪除、插入或其他調(diào)整之類的更改。
nlpag的nlpaug.augmenter.charmodule提供了三種字符增強(qiáng)技術(shù):Keyboard augmenter, Optical character recognition augmenter, Random augmenter.
1、Keyboard augmenter
Keyboard augmenter是一種文本增強(qiáng)技術(shù),它通過插入輸入錯誤來增強(qiáng)文本數(shù)據(jù)。在字符級別,它用鍵盤上近距離的字符替換單詞中的字符,模擬打字時出現(xiàn)鍵盤錯誤的可能性。該方法生成的增強(qiáng)文本數(shù)據(jù)類似于現(xiàn)實環(huán)境中通常遇到的排版錯誤,可以提高了訓(xùn)練數(shù)據(jù)的泛化性。
nlpag的char.KeywordAug()函數(shù)對文本輸入應(yīng)用打字錯誤模擬:
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)是一種將圖像或文檔轉(zhuǎn)換為可由機(jī)器讀取的文本的技術(shù)。它通過分析圖像的視覺模式,識別單個字符或單詞,并將其轉(zhuǎn)換為文本來實現(xiàn)這一點。
OCR模型通常會犯錯誤,例如將“0”與“0”或“I”與“1”混淆。nlpaaug的char. ocaug()增數(shù)器通過替換字符在文本中引入字符級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
隨機(jī)增強(qiáng)器為文本數(shù)據(jù)引入隨機(jī)變量。它模擬了語言中自然發(fā)生的不同類型的錯誤。nlpag的RandomCharAug()函數(shù)可以用相似的字符替換字符,隨機(jī)交換相鄰字符,或者在文本中刪除或插入隨機(jī)字符。這些變化有助于更多樣化的訓(xùn)練數(shù)據(jù)集,并在處理實際數(shù)據(jù)時提高模型的魯棒性。
可以使用操作參數(shù)選擇單一類型的操作:插入、替換、交換、刪除。
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(actinotallow="insert")
augmented_text = aug.augment(text)
print(augmented_text)
單詞級的增強(qiáng)
單詞的擴(kuò)充技術(shù)包括用同義詞替換單詞,插入或刪除單詞,甚至改變句子中單詞的順序。
單詞級增強(qiáng)可以用于訓(xùn)練NLP任務(wù)的模型,例如文本分類和情感分析,其中多樣化的訓(xùn)練數(shù)據(jù)集可以增強(qiáng)模型在真實文本上的性能。
nlpag的nlpag .augment .word模塊提供了十種單詞增強(qiáng)技術(shù):同義詞增強(qiáng)、反義詞增強(qiáng)、拆分增強(qiáng)、拼寫增強(qiáng)、保留詞增強(qiáng)、詞嵌入增強(qiáng)、上下文詞嵌入增強(qiáng)、反翻譯增強(qiáng)、TF-IDF增強(qiáng)、隨機(jī)詞增強(qiáng)。這些方法的調(diào)用基本都類似,所以我們只使用1-2個來進(jìn)行舉例。
1、同義詞
nlpaaug的SynonymAug()根據(jù)WordNet/PPDB同義詞替換相似的單詞??梢允褂胊ug_src參數(shù)來選擇使用哪個模型:
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、保留詞
保留詞擴(kuò)充技術(shù)對文本進(jìn)行目標(biāo)詞替換操作。這種技術(shù)允許可以選擇在增強(qiáng)過程中必須保持不變的單詞。當(dāng)希望在保留文本的其他部分的同時對文本的特定部分應(yīng)用增強(qiáng)時,此技術(shù)非常有用。
nlpag的ReservedAug()函數(shù)替換列表中未定義的單詞,該列表作為參數(shù)傳遞給reserved_token參數(shù):
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、上下文詞嵌入
上下文詞嵌入可以理解句子中單詞的含義和上下文,并將其輸入周圍環(huán)境,或者用預(yù)訓(xùn)練語言模型(如BERT、DistilBERT、RoBERTa或XLNet)中的前n個相似單詞替換它們。
nlpag的context_word_embs()函數(shù)利用上下文詞嵌入來查找前n個相似的詞進(jìn)行增強(qiáng)??梢允褂胊ction 參數(shù)指定要應(yīng)用的一種操作類型:插入或替換。
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、反向翻譯
反向翻譯使用預(yù)訓(xùn)練的機(jī)器學(xué)習(xí)模型將文本從一種語言翻譯成另一種語言,然后再翻譯回原始語言。通過這種往返翻譯為文本增加了多樣性。當(dāng)需要增強(qiáng)訓(xùn)練數(shù)據(jù)的大小時,這種文本增強(qiáng)技術(shù)非常有用。
nlpaaug的Back_TranslationAug()函數(shù)利用兩種翻譯模型進(jìn)行增強(qiáng):
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分?jǐn)?shù)。這些分?jǐn)?shù)表明了一個詞在一篇文章中的重要性。
TF-IDF得分低的單詞被認(rèn)為與文本的意思不太相關(guān),更有可能被其他得分低的單詞所取代。這種技術(shù)創(chuàng)造了不改變原始文本含義的變體。
需要說明的是L:TF-IDF模型必須在數(shù)據(jù)集上進(jìn)行訓(xùn)練,之后可以使用nlpag的TfIdfAug()函數(shù)根據(jù)分?jǐn)?shù)插入或替換單詞。
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)
段句級增強(qiáng)
文本擴(kuò)充也可以在句子層面進(jìn)行,這包括在保持文本的一般上下文和含義的同時,對句子進(jìn)行變化或調(diào)整。增句技巧的例子包括根據(jù)上下文插入單詞或在保持語法準(zhǔn)確性的情況下重新排列句子中的單詞順序。
nlpag的nlpag . augmester .sentence模塊提供了四個句子增強(qiáng)器:
1、抽象摘要
抽象摘要是對給定文本進(jìn)行簡潔總結(jié)的任務(wù),該摘要捕獲了原始內(nèi)容的關(guān)鍵概念和含義??梢园ㄔ次谋局袥]有出現(xiàn)的新短語和句子。
采用抽象摘要的文本增強(qiáng)可以帶來短語結(jié)構(gòu)和內(nèi)容的多樣性和差異性,這可能對訓(xùn)練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、上下文詞嵌入
在句子級增強(qiáng)的上下文中,上下文詞嵌入從預(yù)訓(xùn)練模型(如XLNet、GPT2或蒸餾GPT2)中添加具有前n個相似詞的新句子。
nlpag的ContextualWordEmbsForSentenceAug()函數(shù)利用上下文詞嵌入來插入新句子:
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
基于語言模型的數(shù)據(jù)增強(qiáng)(LAMBADA)使用預(yù)訓(xùn)練的語言模型來預(yù)測句子中缺失的單詞并生成替代句子變體。
LAMBADA技術(shù)的靈感來自LAMBADA數(shù)據(jù)集,該數(shù)據(jù)集由書籍中的段落組成,其中最后一個單詞被刪除。目標(biāo)是預(yù)測缺失的單詞,這需要對上下文有深刻的理解。LAMBADA文本增強(qiáng)利用語言模型,如GPT或BERT,通過預(yù)測給定上下文的缺失單詞來生成新句子。
使用LAMBADA增強(qiáng)器是在句子結(jié)構(gòu)中引入多樣性和提高NLP模型訓(xùn)練數(shù)據(jù)質(zhì)量的極好方法。
LAMBADA模型必須在數(shù)據(jù)集上進(jìn)行訓(xùn)練,之后可以使用nlpag的LambadaAug()函數(shù)應(yīng)用句子級增強(qiáng)。
4、隨機(jī)
對輸入文本應(yīng)用隨機(jī)的句子級增強(qiáng)行為。nlpag的RandomSentAug()函數(shù)可以隨機(jī)交換、裁剪或刪除句子。這些變化有助于更多樣化的訓(xùn)練數(shù)據(jù)集。
總結(jié)
nlpag庫提供了一組不同的文本增強(qiáng)技術(shù),可以顯著提高NLP任務(wù)的文本數(shù)據(jù)的質(zhì)量和多樣性。從同義詞替換等簡單操作到上下文詞嵌入等高級技術(shù),nlpag為該學(xué)科的學(xué)者和從業(yè)者提供了廣泛的工具包。
這里是它的Github地址,更詳細(xì)的信息可以在這里找到:https://github.com/makcedward/nlpaug