赞
踩
当训练数据量不充分,或者分布单一的情况下,数据增强可以快速扩充语料以避免过拟合的问题,同时,数据增强也可以提升模型的鲁棒性,避免微弱的变化使得模型无法泛化到相似的语境中。
本文介绍几种比较简单但常用的NLP数据增强方法,包括显式和隐式两个方面,在实验或比赛中可以提升效果。可使用nlpaug工具快速实现这些技术。
给定一个输入文本,在尽可能不改变原是文本语义的情况下,微调或修改部分字符或词可以实现快速的增强,主要包括如下几种类型:
对于分类、回归等任务,可以使用反义词表替换所有原始词性的词,实现负采样,也是一种数据增强方法。但使用同义词或反义词表进行替换时,很难保证文本的语义是否符合预期。
由于输入的文本长度长短不一,直觉上希望较长的句子 n n n 较大,因此通过一个参数 α \alpha α 控制,即 n = l × α n=l\times\alpha n=l×α,对于RD,概率 p = α p=\alpha p=α。
本文对标点插入 PI进行了实现,以中文为例,如下所示:
- 借助Spacy分词工具,需要安装Spacy,使用Spacy进行分词、分析词性,根据分词和词性选择需要插入的标点。
- 标点符号可以选择 ,。? !;“ ” 等。
import numpy as np import spacy import random from typing import Dict from tqdm import tqdm class DataAugmentation: def __init__(self): self.nlp = spacy.load('zh_core_web_sm') def fit(self, examples: Dict[str, list]): self.examples = examples # {'text': [], 'label': [], 'id': []} # 简单的数据增强:增加标点符号 text_list = self.examples['text'] label_list = self.examples['label'] id_list = self.examples['id'] aug_text_list, aug_label_list, aug_id_list = [], [], [] pun = [',', '。', '?', '!', ';', '"'] for ei in tqdm(range(len(text_list))): text = text_list[ei] label = label_list[ei] id = label_list[ei] doc = self.nlp(text) # spacy分词 token_list, pos_list = [], [] for token in doc: token_list.append(token.text) pos_list.append(token.pos_) if len(token_list) - 1 >= 1: num = 0 state = False while num < 5: num += 1 insert_position = random.randint(1, len(token_list) - 1) if token_list[insert_position] in pun or token_list[insert_position - 1] in pun: continue token_list.insert(insert_position, ',') # 随机插入一个标点符号 pos_list.insert(insert_position, 'PUN') # 随机插入一个标点符号 state = True break if state is True: augment_text = ''.join(token_list) # print('origin text: {}'.format(text)) # print('augmen text: {}'.format(augment_text)) aug_text_list.append(augment_text) aug_label_list.append(label) aug_id_list.append(len(id_list) + ei + 1) return {'text': text_list + aug_text_list, 'label': label_list + aug_label_list, 'id': id_list + aug_id_list} if __name__ == '__main__': data_augmentation = DataAugmentation() dataset = {'text': ['今天的天气很好,非常适合去旅游。'], 'label': [1], 'id': [0]} dataset = data_augmentation.fit(dataset) print(dataset)
演示效果:
除了前述的几种方法,也可以采用如下几种新的策略:
因为直接对原是文本进行数据增强,很难避免维持原始的文本语义,因此可以可以通过在语义空间上进行隐式数据增强,简单列出几种方法:
如果需要增强的文本所属一个新的领域(例如医疗、生物),基于翻译和生成的方法则需要先在该领域的相关语料上进行训练,得到较为鲁棒的翻译或生成模型。但数据增强又是为了增强数据量,没有充分又无法训练翻译或生成模型,产生矛盾。因此通常对新的领域或任务上不会首选这两种方法。
例如在进行文本分类任务上时,除了文本分类损失函数外,还可以添加类似MLM的辅助任务,或者添加额外的多任务信息
在关系抽取任务中,通过知识库中已有的三元组(例如<乔布斯,创始人,苹果>),来标注一批新的实体对语料。但对于文本“乔布斯吃了一个苹果”而言,远程监督法依然会标注为“创始人”,但显然这是噪声。对于噪声,则可以通过一些规则,或Attention的方法解决。
对于噪声部分,则可以采用几种策略:(1)提高置信度阈值,(2)多个不同的模型共同预测伪标签,取全部预测正确的作为可信样本;(3)伪标签数据回测评估:如果加入伪标签的数据后效果变差,则需要剔除或更改标签。
参考文献:
【1】EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks. (EMNLP2019)
【2】AEDA: An Easier Data Augmentation Technique for Text Classification. (EMNLP2021 Findings)
【3】开源NLP数据增强工具:https://github.com/makcedward/nlpaug,附加博客:https://towardsdatascience.com/data-augmentation-in-nlp-2801a34dfc28
【4】Data Augmentation Approaches in Natural Language Processing: A Survey
【5】哈工大总结的15个数据增强方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。