原文鏈接:https://amitness.com/2020/05/data-augmentation-for-nlp/
譯文鏈接:https://blog.csdn.net/u011984148/article/details/106233312/
semantically invariant transformation,“語義不變變換” 使得數據增強成為計算機視覺研究中的一個重要工具。
1. 詞匯替換 / Lexical Substitution
基於詞典的替換 / Thesaurus-based substitution
在這種技術中,我們從句子中隨機取出一個單詞,並使用同義詞詞典將其替換為同義詞。例如,我們可以使用WordNet的英語詞匯數據庫來查找同義詞,然后執行替換。
應用案例&資源
- Zhang et al.在其2015年的論文“Character-level Convolutional Networks for Text Classification”中使用了這一技術 https://arxiv.org/abs/1509.01626
- Mueller et al.使用了類似的策略來為他們的句子相似模型生成了額外的10K訓練樣本 https://www.aaai.org/ocs/index.php/AAAI/AAAI16/paper/download/12195/12023
- Wei et al也使用了這個技術,作為他們論文“Easy Data Augmentation”四種隨機生成策略的一種 https://arxiv.org/abs/1901.11196
- NLTK提供了對WordNet的編程接口
- 還可以使用TextBlob API
- 有一個名為PPDB的數據庫,其中包含數百萬條詞的解釋
基於詞向量的替換
在這種方法中,我們采用預先訓練好的單詞嵌入,如Word2Vec、GloVe、FastText、Sent2Vec,並使用嵌入空間中最近的相鄰單詞替換句子中的某些單詞。
應用案例&資源
- Jiao et al.在他們的論文“TinyBert”中使用了這種技術,以提高他們的語言模型在下游任務上的泛化能力 https://arxiv.org/abs/1909.10351
- Wang et al.使用它來增加學習主題模型所需的tweet https://www.aclweb.org/anthology/D15-1306.pdf
- 使用像Gensim這樣的包來訪問預先訓練好的字向量和獲取最近的鄰居是很容易的
# pip install gensim
import gensim.downloader as api
model = api.load('glove-twitter-25')
model.most_similar('awesome', topn=5)
Masked Language Model
像BERT、ROBERTA和ALBERT這樣的Transformer模型已經接受了大量的文本訓練,使用一種稱為“Masked Language Modeling”的預訓練,即模型必須根據上下文來預測遮蓋的詞匯。這可以用來擴充一些文本。例如,我們可以使用一個預訓練的BERT模型並屏蔽文本的某些部分。然后,我們使用BERT模型來預測遮蔽掉的token。
因此,我們可以使用mask預測來生成文本的變體。與之前的方法相比,生成的文本在語法上更加連貫,因為模型在進行預測時考慮了上下文。
資源
- 使用開源庫這很容易實現,如Hugging Face的transformers。你可以將你想要替換的token設置為
<mask>
並生成預測。然而,這種方法的一個問題是,決定要屏蔽文本的哪一部分並不是一件小事。你必須使用啟發式的方法來決定掩碼,否則生成的文本將不保留原句的含義。https://github.com/huggingface/transformers
from transformers import pipeline
nlp = pipeline('fill-mask')
nlp('This is <mask> cool')
[{'score': 0.515411913394928,
'sequence': '<s> This is pretty cool</s>',
'token': 1256},
{'score': 0.1166248694062233,
'sequence': '<s> This is really cool</s>',
'token': 269},
{'score': 0.07387523353099823,
'sequence': '<s> This is super cool</s>',
'token': 2422},
{'score': 0.04272908344864845,
'sequence': '<s> This is kinda cool</s>',
'token': 24282},
{'score': 0.034715913236141205,
'sequence': '<s> This is very cool</s>',
'token': 182}]
基於TF-IDF的詞替換
這種增強方法是由Xie et al.在無監督數據增強論文中提出的。https://arxiv.org/abs/1904.12848
其基本思想是,TF-IDF分數較低的單詞不能提供信息,因此可以在不影響句子的ground-truth的情況下替換它們。
要替換的單詞是從整個文檔中TF-IDF分數較低的整個詞匯表中選擇的。你可以參考原文中的代碼實現:
https://github.com/google-research/uda/blob/master/text/augmentation/word_level_augment.py
https://github.com/google-research/uda
2. 反向翻譯 / Back Translation
Xie et al.使用這種方法來擴充未標注的文本,並在IMDB數據集中學習一個只有20個有標注樣本的半監督模型
反向翻譯過程如下:
- 把一些句子(如英語)翻譯成另一種語言,如法語
- 將法語句子翻譯回英語句子。
- 檢查新句子是否與原來的句子不同。如果是,那么我們使用這個新句子作為原始文本的數據增強。
你還可以同時使用不同的語言運行反向翻譯以生成更多的變體。如下圖所示,我們將一個英語句子翻譯成三種目標語言:法語、漢語、意大利語,然后再將其翻譯回英語。
應用案例&資源
- 這項技術被用在了的Kaggle上的“Toxic Comment Classification Challenge”的第一名解決方案中 https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52557
- 對於反向翻譯的實現,可以使用TextBlob
- 也可以使用Google Sheets,並按照此處給出的說明:https://amitness.com/2020/02/backtransling-ingooglesheets/,免費申請谷歌翻譯。
3. 文本表面轉換 / Text Surface Transformation
這些是使用正則表達式的簡單的模式匹配的轉換,由Claude Coulombe在他的論文中介紹。 https://arxiv.org/abs/1812.04718
在本文中,他給出了一個將動詞形式由簡寫轉化為完整形式或者反過來的例子
既然轉換不應該改變句子的意思,我們可以看到,在擴展模棱兩可的動詞形式時,這可能會失敗
為了解決這一問題,本文提出允許模糊收縮,但跳過模糊展開。
英文縮略語列表:https://en.wikipedia.org/wiki/wiki/wikipedia%3Alist_of_english_contractions
展開庫:https://github.com/kootenpv/contractions
4. 隨機噪聲注入 / Random Noise Injection
拼寫錯誤注入
我們在句子中的一些隨機單詞上添加拼寫錯誤。這些拼寫錯誤可以通過編程方式添加
也可以使用常見拼寫錯誤的映射,如:https://github.com/makcedward/nlpaug/blob/master/model/spelling_en.txt
QWERTY鍵盤錯誤注入
該方法試圖模擬在QWERTY布局鍵盤上輸入時發生的常見錯誤,這些錯誤是由於按鍵之間的距離非常近造成的。錯誤是根據鍵盤距離注入的。
Unigram噪聲
該方法已被Xie et al.( https://arxiv.org/abs/1703.02573 )和UDA論文( https://arxiv.org/abs/1904.12848 )所采用。其思想是用從單字符頻率分布中采樣的單詞進行替換。這個頻率基本上就是每個單詞在訓練語料庫中出現的次數。
Blank Noising
這個方法是由Xie et al.在他們的論文中提出的。其思想是用占位符標記替換一些隨機單詞。本文使用“_”作為占位符標記。在論文中,他們將其作為一種避免特定上下文過擬合的方法,以及語言模型的平滑機制。該技術有助於提高perplexity和BLEU評分。
句子打亂
這是一種朴素的技術,我們將訓練文本中的句子打亂,以創建一個增強版本。
隨機插入 / 交換 / 刪除
Easy Data Augmentation,https://arxiv.org/abs/1901.11196
5. 實例交叉增強
這項技術是由Luque在他的關於TASS 2019情緒分析的論文中提出的。 https://arxiv.org/abs/1909.11241
這項技術的靈感來自於遺傳學中發生的染色體交叉操作。
一個tweet被分為兩半,相同極性的tweet可以交換一半。這樣,盡管可能不符合語義,但是仍然會保留極性。
這樣對acc沒有影響,但是會提升F1.
6. 操縱語法樹 / Syntax-tree Manipulation
該方法由Coulombe提出,https://arxiv.org/abs/1812.04718
思想是解析並生成原句的依存語法樹,然后通過規則進行轉換,生成復述的句子。例如從主動句轉換成被動句。
7. 文本混合
這個技術在2017年的這篇文章被提出:https://arxiv.org/abs/1710.09412
思路就是從一個mini-batch中隨機挑兩張圖片,然后按比例合成新的圖片,這些圖片就合並了兩個類別的信息,在訓練過程中起到正則化的作用。
在NLP領域,Guo et al針對文本修改了Mixup方法,並提出了兩種應用Mixup到文本的方法,https://arxiv.org/abs/1905.08941
wordMixup
- 從Mini-batch中隨機選2個句子,這兩個句子是經過zero-pad且等長的;
- 將兩個句子的word embeddings按比例合並;
- 將合並后的word embedding傳入神經網絡
- 交叉熵loss用於給定比例的原始文本的類別(The cross-entropy loss is calculated for both the labels of the original text in the given proportion.)
sentMixup
流程與wordMixup相似。
8. 生成模型 / Generative Methods
Conditional Pre-trained Language Models
這個技術由Kumar等人在論文 https://arxiv.org/abs/2003.02245 中提出,使用transformers模型來擴展訓練數據。具體流程如下
- 在每條訓練數據中前置類別標簽,轉換成新的數據
- 用新的數據微調預訓練模型(BERT/GPT2/BART等),對於GPT2微調任務是generation,對於BERT微調目標是masked token prediction。
- 使用微調過的語言模型,輸入類標標簽和少量起始詞,比如3個。
實現
https://github.com/makcedward/nlpaug
https://github.com/QData/TextAttack
References
Qizhe Xie, et al. “Unsupervised Data Augmentation for Consistency Training”
Claude Coulombe “Text Data Augmentation Made Simple By Leveraging NLP Cloud APIs”
Xiaoqi Jiao, et al. “TinyBERT: Distilling BERT for Natural Language Understanding”
Xiang Zhang, et al. “Character-level Convolutional Networks for Text Classification”
Franco M. Luque “Atalaya at TASS 2019: Data Augmentation and Robust Embeddings for Sentiment Analysis”
Ziang Xie, et al. “Data Noising as Smoothing in Neural Network Language Models”
Hongyu Guo, et al. “Augmenting Data with Mixup for Sentence Classification: An Empirical Study”
Hongyi Zhang, et al. “mixup: Beyond Empirical Risk Minimization”
Varun Kumar, et al. “Data Augmentation using Pre-trained Transformer Models”
Jason Wei, et al. “EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks”