自然語(yǔ)言處理之文本數(shù)據(jù)增強(qiáng)

什么是數(shù)據(jù)增強(qiáng)

數(shù)據(jù)增強(qiáng)可以簡(jiǎn)單理解為由少量數(shù)據(jù)生成大量數(shù)據(jù)的過(guò)程。一般比較成功的神經(jīng)網(wǎng)絡(luò)擁有大量參數(shù),使這些參數(shù)正確工作需要用大量的數(shù)據(jù)進(jìn)行訓(xùn)練,但實(shí)際情況中數(shù)據(jù)并沒(méi)有那么多,因此需要做數(shù)據(jù)增強(qiáng)芯杀。

數(shù)據(jù)增強(qiáng)的作用

  • 增加訓(xùn)練的數(shù)據(jù)量,提高模型的泛化能力
  • 增加噪聲數(shù)據(jù)雅潭,提升模型的魯棒性
  • 解決數(shù)據(jù)不足或數(shù)據(jù)不均衡問(wèn)題

數(shù)據(jù)增強(qiáng)的分類(lèi)

根據(jù)數(shù)據(jù)增強(qiáng)的對(duì)象可以將增強(qiáng)研究分類(lèi)兩類(lèi):

  • 面向文本表示的增強(qiáng)研究: 主要是對(duì)原始文本的特征表示進(jìn)行處理揭厚,比如在表示層注入隨機(jī)噪音等方法,來(lái)獲得增強(qiáng)后的文本表示扶供。增強(qiáng)后的表示可以再進(jìn)行解碼獲得增強(qiáng)文本或者直接用于訓(xùn)練模型筛圆。
  • 面向原始文本的增強(qiáng)研究: 主要是通過(guò)對(duì)原始文本中的詞進(jìn)行同義詞替換或者刪除等操作來(lái)進(jìn)行增強(qiáng)。大部分研究都通過(guò)引入各種外部資源來(lái)提升增強(qiáng)效果椿浓。

本文針對(duì)于面向原始文本的增強(qiáng)研究太援,總結(jié)以下幾種方法闽晦。

EDA

ICLR 2019 workshop 論文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》介紹了幾種NLP數(shù)據(jù)增強(qiáng)技術(shù),并推出了EDA github代碼提岔。EDA github repo提出了四種簡(jiǎn)單的操作來(lái)進(jìn)行數(shù)據(jù)增強(qiáng)仙蛉,以防止過(guò)擬合,并提高模型的泛化能力碱蒙。EDA 在個(gè)文本分類(lèi)問(wèn)題上帶來(lái)性能的提升荠瘪,但是其增強(qiáng)方式可能會(huì)破壞原始文本的句法結(jié)構(gòu)和通順性。

同義詞替換

不考慮 stopwords赛惩,在句子中隨機(jī)抽取n個(gè)詞哀墓,然后從同義詞詞典中隨機(jī)抽取同義詞,并進(jìn)行替換喷兼。關(guān)于同義詞可以使用開(kāi)源同義詞表+領(lǐng)域自定義詞表來(lái)建立篮绰。

def synonym_replacement(words, n):
    new_words = words.copy()
    random_word_list = list(set([word for word in words if word not in stop_words]))
    random.shuffle(random_word_list)
    num_replaced = 0
    for random_word in random_word_list:
        # get_synonyms 獲取某個(gè)單詞的同義詞列表
        synonyms = get_synonyms(random_word)
        if len(synonyms) >= 1:
            synonym = random.choice(list(synonyms))
            new_words = [synonym if word == random_word else word for word in new_words]
            num_replaced += 1
        if num_replaced >= n:
            break
    sentence = ' '.join(new_words)
    new_words = sentence.split(' ')
    return new_words

隨機(jī)刪除

句子中的每個(gè)詞,以概率p隨機(jī)刪除褒搔。有幾種極端情況需要考慮:

  • 如果句子中只有一個(gè)單詞阶牍,則直接返回
  • 如果句子中所有單詞都被刪掉,則隨機(jī)返回一個(gè)單詞星瘾。(這個(gè)策略可以根據(jù)自己項(xiàng)目進(jìn)行自定義。)
def random_deletion(words, p):
    # obviously, if there's only one word, don't delete it
    if len(words) == 1:
        return words

    # randomly delete words with probability p
    new_words = []
    for word in words:
        r = random.uniform(0, 1)
        if r > p:
            new_words.append(word)

    # if you end up deleting all words, just return a random word
    if len(new_words) == 0:
        rand_int = random.randint(0, len(words) - 1)
        return [words[rand_int]]

    return new_words

隨機(jī)交換

句子中惧辈,隨機(jī)選擇兩個(gè)詞琳状,位置交換。該過(guò)程可以重復(fù)n次盒齿。
(swap_word 函數(shù)中隨機(jī)產(chǎn)生兩個(gè)序列下標(biāo)念逞,如果相同最多重新生成三次。)


def random_swap(words, n):
    new_words = words.copy()
    for _ in range(n):
        new_words = swap_word(new_words)
    return new_words


def swap_word(new_words):
    random_idx_1 = random.randint(0, len(new_words) - 1)
    random_idx_2 = random_idx_1
    counter = 0
    while random_idx_2 == random_idx_1:
        random_idx_2 = random.randint(0, len(new_words) - 1)
        counter += 1
        if counter > 3:
            return new_words
    new_words[random_idx_1], new_words[random_idx_2] = new_words[random_idx_2], new_words[random_idx_1]
    return new_words

隨機(jī)插入

句子中的每個(gè)詞边翁,以概率p隨機(jī)刪除翎承。隨機(jī)插入的字符通過(guò)同義詞獲取。

def random_insertion(words, n):
    new_words = words.copy()
    for _ in range(n):
        add_word(new_words)
    return new_words


def add_word(new_words):
    synonyms = []
    counter = 0
    while len(synonyms) < 1:
        random_word = new_words[random.randint(0, len(new_words) - 1)]
        synonyms = get_synonyms(random_word)
        counter += 1
        if counter >= 10:
            return
    random_synonym = synonyms[0]
    random_idx = random.randint(0, len(new_words) - 1)
    new_words.insert(random_idx, random_synonym)

模型預(yù)打標(biāo)

使用少量的數(shù)據(jù)訓(xùn)練一個(gè)模型或者將少量數(shù)據(jù)通過(guò) Bert finetune 訓(xùn)練一個(gè)模型符匾,在已有模型的基礎(chǔ)上對(duì)無(wú)監(jiān)督數(shù)據(jù)打標(biāo)叨咖,選擇置信度較高的數(shù)據(jù)作為偽標(biāo)簽(pseudo label)加入到已有數(shù)據(jù)中訓(xùn)練模型,循環(huán)迭代優(yōu)化模型啊胶。

回譯(Back Translation)

回譯(Back Translation)是機(jī)器翻譯中非常常用的數(shù)據(jù)增強(qiáng)的方式甸各,其主要的思想就是通過(guò)翻譯工具將一個(gè)句子翻譯為另一種語(yǔ)言,再把這翻譯的另一種語(yǔ)言再翻譯為原來(lái)的語(yǔ)言焰坪,最后得到一個(gè)意思相近但表達(dá)方式不同的句子趣倾。這種方式也是目前相對(duì)靠譜的方式,這種方式不僅有同義詞替換某饰,詞語(yǔ)增刪儒恋,還具有對(duì)句子結(jié)構(gòu)語(yǔ)序調(diào)整的效果善绎,并還能保持與原句子意思相近,是目前一種非常有效的文本數(shù)據(jù)增強(qiáng)方式诫尽。

反向翻譯的過(guò)程如下:

  • 假設(shè)需要增強(qiáng)的數(shù)據(jù)是中文
  • 借助第三方翻譯軟件禀酱,將中文翻譯為法文、日文等多種語(yǔ)言箱锐。
  • 將翻譯的文本二次翻譯為中文(可以選取不同的翻譯接口)比勉。
  • 如果二次翻譯的結(jié)果和原文本不一致,則加入到增強(qiáng)樣本中驹止。

我喜歡學(xué)習(xí)NLP浩聋,因?yàn)樗嬖跇O大的挑戰(zhàn)。

  • 百度翻譯結(jié)果:I like learning NLP because it has great challenges.
  • 將百度翻譯結(jié)果通過(guò)谷歌翻譯:我喜歡學(xué)習(xí) NLP臊恋,因?yàn)樗泻艽蟮奶魬?zhàn)衣洁。(與原句不同,則獲得增強(qiáng)數(shù)據(jù))

其他方法

  • 加入無(wú)意義的詞語(yǔ):比如“忘記打卡怎么辦”抖仅,加入無(wú)意義的詞語(yǔ)“你好坊夫,忘記打卡怎么辦”

參考鏈接

關(guān)于我

dreampai(公眾號(hào),簡(jiǎn)書(shū)撤卢,知乎同名)环凿,專(zhuān)注于 NLP和金融。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末放吩,一起剝皮案震驚了整個(gè)濱河市智听,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渡紫,老刑警劉巖到推,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惕澎,居然都是意外死亡莉测,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)唧喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捣卤,“玉大人,你說(shuō)我怎么就攤上這事欣喧‰缌悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵唆阿,是天一觀的道長(zhǎng)益涧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)驯鳖,這世上最難降的妖魔是什么闲询? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任久免,我火速辦了婚禮,結(jié)果婚禮上扭弧,老公的妹妹穿的比我還像新娘阎姥。我一直安慰自己,他們只是感情好鸽捻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布呼巴。 她就那樣靜靜地躺著,像睡著了一般御蒲。 火紅的嫁衣襯著肌膚如雪衣赶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天厚满,我揣著相機(jī)與錄音府瞄,去河邊找鬼。 笑死碘箍,一個(gè)胖子當(dāng)著我的面吹牛遵馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丰榴,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼货邓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了四濒?” 一聲冷哼從身側(cè)響起逻恐,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峻黍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拨匆,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姆涩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惭每。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骨饿。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖台腥,靈堂內(nèi)的尸體忽然破棺而出宏赘,到底是詐尸還是另有隱情,我是刑警寧澤黎侈,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布察署,位于F島的核電站,受9級(jí)特大地震影響峻汉,放射性物質(zhì)發(fā)生泄漏贴汪。R本人自食惡果不足惜脐往,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扳埂。 院中可真熱鬧业簿,春花似錦、人聲如沸阳懂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岩调。三九已至巷燥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間誊辉,已是汗流浹背矾湃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堕澄,地道東北人邀跃。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛙紫,于是被迫代替她去往敵國(guó)和親拍屑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容