NLP中数据增强的综述,快速的生成大量的训练数据
作者:amitness編譯:ronghuaiyang
導讀
深度學習視覺領域的增強方法可以很大程度上提高模型的表現,并減少數據的依賴,而NLP上做數據增強不像在圖像上那么方便,但還是有一些方法的。
與計算機視覺中使用圖像進行數據增強不同,NLP中文本數據增強是非常罕見的。這是因為圖像的一些簡單操作,如將圖像旋轉或將其轉換為灰度,并不會改變其語義。語義不變變換的存在使增強成為計算機視覺研究中的一個重要工具。
我很好奇是否有人嘗試開發NLP的增強技術,并研究了現有的文獻。在這篇文章中,我將分享我對當前用于增加文本數據的方法的發現。
方法
1. 詞匯替換
這種方法試圖在不改變句子主旨的情況下替換文本中的單詞。
基于詞典的替換
在這種技術中,我們從句子中隨機取出一個單詞,并使用同義詞詞典將其替換為同義詞。例如,我們可以使用WordNet的英語詞匯數據庫來查找同義詞,然后執行替換。它是一個手動管理的數據庫,其中包含單詞之間的關系。
Zhang et al.在其2015年的論文“Character-level Convolutional Networks for Text Classification”中使用了這一技術。Mueller et al.使用了類似的策略來為他們的句子相似模型生成了額外的10K訓練樣本。NLTK提供了對WordNet的編程接口。你還可以使用TextBlob API。還有一個名為PPDB的數據庫,其中包含數百萬條詞的解釋,你可以通過編程的方式下載和訪問它們。
基于詞向量的替換在這種方法中,我們采用預先訓練好的單詞嵌入,如Word2Vec、GloVe、FastText、Sent2Vec,并使用嵌入空間中最近的相鄰單詞替換句子中的某些單詞。Jiao et al.在他們的論文“TinyBert”中使用了這種技術,以提高他們的語言模型在下游任務上的泛化能力。Wang et al.使用它來增加學習主題模型所需的tweet。
例如,你可以用三個最相似的單詞來替換句子中的單詞,并得到文本的三個變體。
使用像Gensim這樣的包來訪問預先訓練好的字向量和獲取最近的鄰居是很容易的。例如,這里我們通過訓練推特上的單詞向量找到了單詞“awesome”的同義詞。
#?pip?install?gensim import?gensim.downloader?as?apimodel?=?api.load('glove-twitter-25')?? model.most_similar('awesome',?topn=5)你會得到5個最相似的單詞和余弦相似度。
[('amazing', 0.9687871932983398),('best', 0.9600659608840942),('fun', 0.9331520795822144),('fantastic', 0.9313924312591553),('perfect', 0.9243415594100952)]Masked Language Model
像BERT、ROBERTA和ALBERT這樣的Transformer模型已經接受了大量的文本訓練,使用一種稱為“Masked Language Modeling”的預訓練,即模型必須根據上下文來預測遮蓋的詞匯。這可以用來擴充一些文本。例如,我們可以使用一個預訓練的BERT模型并屏蔽文本的某些部分。然后,我們使用BERT模型來預測遮蔽掉的token。
因此,我們可以使用mask預測來生成文本的變體。與之前的方法相比,生成的文本在語法上更加連貫,因為模型在進行預測時考慮了上下文。
使用開源庫這很容易實現,如Hugging Face的transformers。你可以將你想要替換的token設置為并生成預測。
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.在無監督數據增強論文中提出的。其基本思想是,TF-IDF分數較低的單詞不能提供信息,因此可以在不影響句子的ground-truth的情況下替換它們。
要替換的單詞是從整個文檔中TF-IDF分數較低的整個詞匯表中選擇的。你可以參考原文中的實現:https://github.com/googresearch/uda/blob/master/text/augmentation/word_level_augment.py。
2. 反向翻譯
在這種方法中,我們利用機器翻譯來解釋文本,同時重新訓練含義。Xie et al.使用這種方法來擴充未標注的文本,并在IMDB數據集中學習一個只有20個有標注樣本的半監督模型。該方法優于之前的先進模型,該模型訓練了25,000個有標注的樣本。
反向翻譯過程如下:
把一些句子(如英語)翻譯成另一種語言,如法語
將法語句子翻譯回英語句子。
檢查新句子是否與原來的句子不同。如果是,那么我們使用這個新句子作為原始文本的數據增強。

你還可以同時使用不同的語言運行反向翻譯以生成更多的變體。如下圖所示,我們將一個英語句子翻譯成三種目標語言:法語、漢語、意大利語,然后再將其翻譯回英語。

這項技術也被用在了的Kaggle上的“Toxic Comment Classification Challenge”的第一名解決方案中。獲勝者將其用于訓練數據增強和測試期間,在測試期間,對英語句子的預測概率以及使用三種語言(法語、德語、西班牙語)的反向翻譯進行平均,以得到最終的預測。
對于反向翻譯的實現,可以使用TextBlob。或者,你也可以使用Google Sheets,并按照此處給出的說明:https://amitness.com/2020/02/backtransling-ingooglesheets/,免費申請谷歌翻譯。
3. 文本表面轉換
這些是使用正則表達式的簡單的模式匹配的轉換,由Claude Coulombe在他的論文中介紹。
在本文中,他給出了一個將動詞形式由簡寫轉化為完整形式或者反過來的例子。我們可以通過這個來生成增強型文本。
既然轉換不應該改變句子的意思,我們可以看到,在擴展模棱兩可的動詞形式時,這可能會失敗,比如:
為了解決這一問題,本文提出允許模糊收縮,但跳過模糊展開。
你可以在這里找到英語縮略語的列表:https://en.wikipedia.org/wiki/wiki/wikipedia%3alist_of_english_contractions。
4. 隨機噪聲注入
這些方法的思想是在文本中加入噪聲,使所訓練的模型對擾動具有魯棒性。
拼寫錯誤注入
在這種方法中,我們在句子中的一些隨機單詞上添加拼寫錯誤。這些拼寫錯誤可以通過編程方式添加,也可以使用常見拼寫錯誤的映射,如:https://github.com/makcedward/nlpaug/blob/master/model/spelling_en.txt。
QWERTY鍵盤錯誤注入
該方法試圖模擬在QWERTY布局鍵盤上輸入時發生的常見錯誤,這些錯誤是由于按鍵之間的距離非常近造成的。錯誤是根據鍵盤距離注入的。
Unigram噪聲
該方法已被Xie et al.和UDA論文所采用。其思想是用從單字符頻率分布中采樣的單詞進行替換。這個頻率基本上就是每個單詞在訓練語料庫中出現的次數。
Blank Noising
這個方法是由Xie et al.在他們的論文中提出的。其思想是用占位符標記替換一些隨機單詞。本文使用“_”作為占位符標記。在論文中,他們將其作為一種避免特定上下文過擬合的方法,以及語言模型的平滑機制。該技術有助于提高perplexity和BLEU評分。
句子打亂
這是一種樸素的技術,我們將訓練文本中的句子打亂,以創建一個增強版本。
5. 實例交叉增強
這項技術是由Luque在他的關于TASS 2019情緒分析的論文中提出的。這項技術的靈感來自于遺傳學中發生的染色體交叉操作。
該方法將tweets分為兩部分,兩個具有相同極性的隨機推文(即正面/負面)進行交換。這個方法的假設是,即使結果是不符合語法和語義的,新文本仍將保留情感的極性。
這一技術對準確性沒有影響,但有助于論文中極少數類的F1分數,如tweets較少的中性類。
6. 語法樹操作
這項技術已經在Coulombe的論文中使用。其思想是解析和生成原始句子的依賴關系樹,使用規則對其進行轉換,并生成改寫后的句子。
例如,一個不改變句子意思的轉換是句子從主動語態到被動語態的轉換,反之亦然。
實現
要使用上述所有方法,可以使用名為nlpaug的python庫:https://github.com/makcedward/nlpaug。它提供了一個簡單且一致的API來應用這些技術。
總結
我從文獻綜述中得出的結論是,這些增強方法中有許多是非常特定于任務的,它們對性能的影響僅針對某些特定用例進行了研究。系統地比較這些方法并分析它們對許多任務的性能的影響將是一項有趣的研究。
—END—
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯AI基礎下載(pdf更新到25集)機器學習的數學基礎專輯本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的NLP中数据增强的综述,快速的生成大量的训练数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python入门】Python之OS模
- 下一篇: 【算法知识】详解堆排序算法