NLP中數據增強技術的可視化綜述

本文翻譯自:A Visual Survey of Data Augmentation in NLP,原作者Amit Chaudhary,已獲得轉載翻譯授權。

在計算機視覺中,使用圖像數據增強是比較常規的做法,而在NLP中對文本數據進行增強則非常罕見。 這是因爲對圖像做一些微不足道的操作(例如將圖像旋轉幾度或將其轉換爲灰度圖像)並不會改變其原來的內容。 這種特性使數據增強成爲CV研究中必不可少的步驟。

我很好奇是否有嘗試在NLP的研究中使用數據增強的方法,並且查閱了現有文獻。 在這篇文章中,我將分享我發現的當前用於擴充文本數據的方法。

NLP數據增強方法

詞彙替換

這種方法是在不改變句子意思的情況下替換文本中的單詞。

基於同義詞詞典的替換

在這種方法中,我們從句子中隨機取出一個單詞,並使用同義詞詞典將其替換爲同義詞。例如,我們可以使用英語詞彙數據庫WordNet來查找同義詞,然後進行替換。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”中就是將使用了GloVe word embeddings來提升他們語言模型的下游任務的泛化能力。Wang et al.使用了這種方法去增強推特文本,來學習主題模型。

比如說,你可以使用3個最相似來替換句子中的一個詞,然後獲得3個該句子的變體。

使用像Gensim這樣的包來訪問預先訓練好的字向量和獲取最近鄰詞向量是很容易的。例如,這裏我們通過訓練推特上的詞向量找到了單詞“awesome”的同義詞。

# pip install gensim
import gensim.downloader as api

model = api.load('glove-twitter-25')  
model.most_similar('awesome', topn=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 Model”的任務進行訓練的,即模型必須根據上下文來預測被掩蓋的詞彙。
這就可以被用來做數據增強。比如,我們將句子中的某個部分掩蓋,並使用預訓練好的BERT模型來預測被掩蓋的token。

因此,我們可以使用BERT模型來生成句子的不同變體。相比於之前的方法,生成的文本在語法上更加連貫,因爲模型在做出預測時考慮了上下文。

使用Hugging Face的開源庫transformers就可以很容易的實現,可以設置需要掩蓋的token爲<mask>,然後生成預測:

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}]

值得注意的是,決定需要掩蓋的token並不是一件小事,你可以使用啓發式的方法來決定掩碼,否則生成的文本將不保留原句的含義。

基於TF-IDF的替換

這種方法是由Xie et al.在無監督數據增強方法中提出來的。其基本思想是,TF-IDF分數較低的單詞不能提供有效信息,因此可以在不影響句子的ground-truth標籤的情況下替換它們。

要替換的單詞是從整個文檔中TF-IDF分數較低的整個詞彙表中選擇的。你可以參考原文的實現方法

反向翻譯

在這種方法中,我們利用機器翻譯來解釋文本,同時重新訓練含義。Xie et al等人使用這種方法來擴充未標記的文本,並學習IMDB數據集上只有20個標記示例的半監督模型。該方法優於之前的state-of-the-art模型,該模型訓練了25000個標記的例子。
反向翻譯過程如下:

  • 找一些句子(如英語),翻譯成另一種語言,如法語;
  • 將法語句子翻譯成英語句子;
  • 檢查新句子是否與原來的句子不同。如果是,那麼我們使用這個新句子作爲原始文本的數據增強版本。

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

    這項技術也在Kaggle上的“Toxic Comment Classification Challenge”的第一名解決方案中被使用。獲勝者將其用於訓練數據擴充和測試期間,在測試期間,對英語句子的預測概率以及使用三種語言(法語、德語、西班牙語)的反向翻譯進行平均,以得到最終的預測。
    對於反向翻譯的實現,可以使用TextBlob。或者,也可以使用Google Sheets,並按照給出的說明免費地應用谷歌翻譯。

文本表達轉換

這種方法是使用正則表達式,並應用的簡單模式匹配進行變換,Claude Coulombe在他的論文中介紹了這些變換。在這篇文章中,他給出了一個將動詞形式由收縮轉化爲擴張,反之亦然的例子。我們可以通過應用這個來生成增強文本。

既然轉換不應該改變句子的意思,我們可以看到,在擴展模棱兩可的動詞形式時,這可能會失敗,比如:

爲了解決這一問題,文章提出允許模糊收縮,但跳過模糊展開。

你可以在這裏找到英語縮寫的列表

隨機噪聲注入

這些方法的思想是在文本中加入噪聲,使所訓練的模型對擾動具有魯棒性。

拼寫錯誤注入

在這種方法中,我們在句子中的一些隨機單詞上添加拼寫錯誤。這些拼寫錯誤可以通過編程方式添加,也可以使用常見拼寫錯誤的映射,如英語的這個拼寫錯誤列表

QWERTY鍵盤錯誤注入

該方法試圖模擬在QWERTY佈局鍵盤上輸入時發生的常見錯誤,這些錯誤是由於按鍵之間的距離非常近造成的。錯誤是根據鍵盤距離注入的。

Unigram噪聲

Xie et al.UDA的工作中使用了這種方法。其思想是用從單字符頻率分佈中採樣的單詞進行替換。這個頻率基本上就是每個單詞在訓練語料庫中出現的次數。

空白噪聲

該方法由Xie et al在他們的論文中提出。其思想是用佔位符標記替換一些隨機單詞。文章使用“_”作爲佔位符標記。在論文中,他們將其作爲一種避免特定上下文過度擬合的方法,以及語言模型的平滑機制。該技術有助於提高困惑度和BLEU評分。

句子洗牌

這是一種很簡單的技術,我們將訓練文本中的句子打亂,以創建一個擴充版本。

實例交叉擴增

Luque在他的TASS2019上的情感分析論文上提出了這種方法。這項技術的靈感來自於遺傳學中的染色體交叉操作。
該方法將推特分爲兩半和兩個具有相同極性的隨機推文(即正面/負面)交換他們的另一半。假設是,即使結果是不符合語法和語義的,新文本仍將保留情感極性。

這一技術對準確性沒有影響,但有助於論文中的F1分數顯示其對少數類的影響,如推文較少的中性類。

語法樹操作

Coulombe在他的論文中提出這個方法。其思想是解析和生成原始句子的依賴關係樹,使用規則對其進行轉換,並生成改寫後的句子。
例如,一個不改變句子意思的轉換是句子從主動語態到被動語態的轉換,反之亦然。

實現

要應用上述所有方法,可以使用名爲nlpaug的python庫。它提供了一個簡單且一致的API來應用這些技術。

總結

我從文獻綜述中得出的結論是,這些增強方法中有許多是非常依賴於特定任務的,它們對性能的影響僅針對某些特定用例進行了研究。系統地比較這些方法並分析它們對許多任務的性能的影響將是一項有趣的研究。


歡迎關注我的公衆號“「野風同學」”,一個程序員的自我成長之路,持續分享技術乾貨文章與軟件、工具和書籍等優質內容推薦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章