使用 NLPAUG 進行文本數據的擴充增強
在機器學習中,訓練數據集的質量在很大程度上決定了模型的有效性。我們往往沒有足夠的多樣化數據,這影響了模型的準確性。這時數據增強技術就派上了用場。
數據增強可以通過添加對現有數據進行略微修改的副本或從現有數據中新創建的合成數據來增加數據量。這種數據擴充的方式在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(actinotallow="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個相似的詞進行增強??梢允褂胊ction 參數指定要應用的一種操作類型:插入或替換。
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://github.com/makcedward/nlpaug