NLP中數(shù)據(jù)增強(qiáng)的綜述大全

與計(jì)算機(jī)視覺中使用圖像進(jìn)行數(shù)據(jù)增強(qiáng)不同,NLP中文本數(shù)據(jù)增強(qiáng)是非常罕見的。這是因?yàn)閳D像的一些簡單操作,如將圖像旋轉(zhuǎn)或?qū)⑵滢D(zhuǎn)換為灰度,并不會改變其語義。語義不變變換的存在使增強(qiáng)成為計(jì)算機(jī)視覺研究中的一個(gè)重要工具。

我很好奇是否有人嘗試開發(fā)NLP的增強(qiáng)技術(shù),并研究了現(xiàn)有的文獻(xiàn)。在這篇文章中,我將分享我對當(dāng)前用于增加文本數(shù)據(jù)的方法的發(fā)現(xiàn)。

方法

1. 詞匯替換

這種方法試圖在不改變句子主旨的情況下替換文本中的單詞。

  • 基于詞典的替換

    在這種技術(shù)中,我們從句子中隨機(jī)取出一個(gè)單詞,并使用同義詞詞典將其替換為同義詞。例如,我們可以使用WordNet的英語詞匯數(shù)據(jù)庫來查找同義詞,然后執(zhí)行替換。它是一個(gè)手動(dòng)管理的數(shù)據(jù)庫,其中包含單詞之間的關(guān)系。

  • Zhang et al.在其2015年的論文“Character-level Convolutional Networks for Text Classification”中使用了這一技術(shù)。Mueller et al.使用了類似的策略來為他們的句子相似模型生成了額外的10K訓(xùn)練樣本。NLTK提供了對WordNet的編程接口。你還可以使用TextBlob API。還有一個(gè)名為PPDB的數(shù)據(jù)庫,其中包含數(shù)百萬條詞的解釋,你可以通過編程的方式下載和訪問它們。

  • 基于詞向量的替換在這種方法中,我們采用預(yù)先訓(xùn)練好的單詞嵌入,如Word2Vec、GloVe、FastText、Sent2Vec,并使用嵌入空間中最近的相鄰單詞替換句子中的某些單詞。Jiao et al.在他們的論文“TinyBert”中使用了這種技術(shù),以提高他們的語言模型在下游任務(wù)上的泛化能力。Wang et al.使用它來增加學(xué)習(xí)主題模型所需的tweet。

例如,你可以用三個(gè)最相似的單詞來替換句子中的單詞,并得到文本的三個(gè)變體。

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

# pip install gensim
import gensim.downloader as api

model = api.load('glove-twitter-25')  
model.most_similar('awesome', topn=5)

你會得到5個(gè)最相似的單詞和余弦相似度。

[('amazing', 0.9687871932983398),
 ('best', 0.9600659608840942),
 ('fun', 0.9331520795822144),
 ('fantastic', 0.9313924312591553),
 ('perfect', 0.9243415594100952)]
  • Masked Language Model

    像BERT、ROBERTA和ALBERT這樣的Transformer模型已經(jīng)接受了大量的文本訓(xùn)練,使用一種稱為“Masked Language Modeling”的預(yù)訓(xùn)練,即模型必須根據(jù)上下文來預(yù)測遮蓋的詞匯。這可以用來擴(kuò)充一些文本。例如,我們可以使用一個(gè)預(yù)訓(xùn)練的BERT模型并屏蔽文本的某些部分。然后,我們使用BERT模型來預(yù)測遮蔽掉的token。

因此,我們可以使用mask預(yù)測來生成文本的變體。與之前的方法相比,生成的文本在語法上更加連貫,因?yàn)槟P驮谶M(jìn)行預(yù)測時(shí)考慮了上下文。

使用開源庫這很容易實(shí)現(xiàn),如Hugging Face的transformers。你可以將你想要替換的token設(shè)置為并生成預(yù)測。

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

然而,這種方法的一個(gè)問題是,決定要屏蔽文本的哪一部分并不是一件小事。你必須使用啟發(fā)式的方法來決定掩碼,否則生成的文本將不保留原句的含義。

  • 基于TF-IDF的詞替換

    這種增強(qiáng)方法是由Xie et al.在無監(jiān)督數(shù)據(jù)增強(qiáng)論文中提出的。其基本思想是,TF-IDF分?jǐn)?shù)較低的單詞不能提供信息,因此可以在不影響句子的ground-truth的情況下替換它們。

要替換的單詞是從整個(gè)文檔中TF-IDF分?jǐn)?shù)較低的整個(gè)詞匯表中選擇的。你可以參考原文中的實(shí)現(xiàn):https://github.com/googresearch/uda/blob/master/text/augmentation/word_level_augment.py。

2. 反向翻譯

在這種方法中,我們利用機(jī)器翻譯來解釋文本,同時(shí)重新訓(xùn)練含義。Xie et al.使用這種方法來擴(kuò)充未標(biāo)注的文本,并在IMDB數(shù)據(jù)集中學(xué)習(xí)一個(gè)只有20個(gè)有標(biāo)注樣本的半監(jiān)督模型。該方法優(yōu)于之前的先進(jìn)模型,該模型訓(xùn)練了25,000個(gè)有標(biāo)注的樣本。

反向翻譯過程如下:

  • 把一些句子(如英語)翻譯成另一種語言,如法語

  • 將法語句子翻譯回英語句子。

  • 檢查新句子是否與原來的句子不同。如果是,那么我們使用這個(gè)新句子作為原始文本的數(shù)據(jù)增強(qiáng)。

    [圖片上傳失敗...(image-ab180d-1590722473752)]

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

[圖片上傳失敗...(image-530637-1590722473752)]

這項(xiàng)技術(shù)也被用在了的Kaggle上的“Toxic Comment Classification Challenge”的第一名解決方案中。獲勝者將其用于訓(xùn)練數(shù)據(jù)增強(qiáng)和測試期間,在測試期間,對英語句子的預(yù)測概率以及使用三種語言(法語、德語、西班牙語)的反向翻譯進(jìn)行平均,以得到最終的預(yù)測。

對于反向翻譯的實(shí)現(xiàn),可以使用TextBlob?;蛘?,你也可以使用Google Sheets,并按照此處給出的說明:https://amitness.com/2020/02/backtransling-ingooglesheets/,免費(fèi)申請谷歌翻譯。

3. 文本表面轉(zhuǎn)換

這些是使用正則表達(dá)式的簡單的模式匹配的轉(zhuǎn)換,由Claude Coulombe在他的論文中介紹。

在本文中,他給出了一個(gè)將動(dòng)詞形式由簡寫轉(zhuǎn)化為完整形式或者反過來的例子。我們可以通過這個(gè)來生成增強(qiáng)型文本。

既然轉(zhuǎn)換不應(yīng)該改變句子的意思,我們可以看到,在擴(kuò)展模棱兩可的動(dòng)詞形式時(shí),這可能會失敗,比如:

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

你可以在這里找到英語縮略語的列表:https://en.wikipedia.org/wiki/wiki/wikipedia%3alist_of_english_contractions

4. 隨機(jī)噪聲注入

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

  • 拼寫錯(cuò)誤注入

    在這種方法中,我們在句子中的一些隨機(jī)單詞上添加拼寫錯(cuò)誤。這些拼寫錯(cuò)誤可以通過編程方式添加,也可以使用常見拼寫錯(cuò)誤的映射,如:https://github.com/makcedward/nlpaug/blob/master/model/spelling_en.txt。

  • QWERTY鍵盤錯(cuò)誤注入

    該方法試圖模擬在QWERTY布局鍵盤上輸入時(shí)發(fā)生的常見錯(cuò)誤,這些錯(cuò)誤是由于按鍵之間的距離非常近造成的。錯(cuò)誤是根據(jù)鍵盤距離注入的。

  • Unigram噪聲

    該方法已被Xie et al.和UDA論文所采用。其思想是用從單字符頻率分布中采樣的單詞進(jìn)行替換。這個(gè)頻率基本上就是每個(gè)單詞在訓(xùn)練語料庫中出現(xiàn)的次數(shù)。

  • Blank Noising

    這個(gè)方法是由Xie et al.在他們的論文中提出的。其思想是用占位符標(biāo)記替換一些隨機(jī)單詞。本文使用“_”作為占位符標(biāo)記。在論文中,他們將其作為一種避免特定上下文過擬合的方法,以及語言模型的平滑機(jī)制。該技術(shù)有助于提高perplexity和BLEU評分。

  • 句子打亂

    這是一種樸素的技術(shù),我們將訓(xùn)練文本中的句子打亂,以創(chuàng)建一個(gè)增強(qiáng)版本。

5. 實(shí)例交叉增強(qiáng)

這項(xiàng)技術(shù)是由Luque在他的關(guān)于TASS 2019情緒分析的論文中提出的。這項(xiàng)技術(shù)的靈感來自于遺傳學(xué)中發(fā)生的染色體交叉操作。

該方法將tweets分為兩部分,兩個(gè)具有相同極性的隨機(jī)推文(即正面/負(fù)面)進(jìn)行交換。這個(gè)方法的假設(shè)是,即使結(jié)果是不符合語法和語義的,新文本仍將保留情感的極性。

這一技術(shù)對準(zhǔn)確性沒有影響,但有助于論文中極少數(shù)類的F1分?jǐn)?shù),如tweets較少的中性類。

6. 語法樹操作

這項(xiàng)技術(shù)已經(jīng)在Coulombe的論文中使用。其思想是解析和生成原始句子的依賴關(guān)系樹,使用規(guī)則對其進(jìn)行轉(zhuǎn)換,并生成改寫后的句子。

例如,一個(gè)不改變句子意思的轉(zhuǎn)換是句子從主動(dòng)語態(tài)到被動(dòng)語態(tài)的轉(zhuǎn)換,反之亦然。

實(shí)現(xiàn)

要使用上述所有方法,可以使用名為nlpaug的python庫:https://github.com/makcedward/nlpaug。它提供了一個(gè)簡單且一致的API來應(yīng)用這些技術(shù)。

總結(jié)

我從文獻(xiàn)綜述中得出的結(jié)論是,這些增強(qiáng)方法中有許多是非常特定于任務(wù)的,它們對性能的影響僅針對某些特定用例進(jìn)行了研究。系統(tǒng)地比較這些方法并分析它們對許多任務(wù)的性能的影響將是一項(xiàng)有趣的研究。

參考原文:https://mp.weixin.qq.com/s/Ey24ZEAgFEl9ZN0jw2y76g

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容