NLP数据增强方法总结及实现
目录
2、简单数据增强(Easy Data Augmentation,EDA)
1、数据增强
数据增强是扩充数据样本规模的一种有效地方法,数据的规模越大、质量越高越好,模型才能够有着更好的泛化能力。
2、简单数据增强(Easy Data Augmentation,EDA)
(1)EDA方法
同义词替换、随机插入、随机交换、随机删除。
- 同义词替换(Synonym Replacement, SR):从句子中随机选取n个不属于停用词集的单词,并随机选择其同义词替换它们;
- 随机插入(Random Insertion, RI):随机的找出句中某个不属于停用词集的词,并求出其随机的同义词,将该同义词插入句子的一个随机位置。重复n次;
- 随机交换(Random Swap, RS):随机的选择句中两个单词并交换它们的位置。重复n次;
- 随机删除(Random Deletion, RD):以 $p$ 的概率,随机的移除句中的每个单词。
(2)EDA工具使用方法
- 先将需要处理的语料按照下面的例子处理好成固定的格式
0 今天天气不错哦。
1 今天天气不行啊!不能出去玩了。
0 又是阳光明媚的一天!
即,标签+一个制表符\t+内容
- 命令使用例子
$python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05
其中:
- input参数:需要进行增强的语料文件
- output参数:输出文件
- num_aug参数:每一条语料将增强的个数
- alpha参数:每一条语料中改动的词所占的比例
(3)EDA相关工具
- 中文语料的EDA数据增强工具
- Synonyms中文近义词工具包
- 中文常用停用词表
- EDA工具论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》
3、回译
在这个方法中,我们用机器翻译把一段中文翻译成另一种语言,然后再翻译回中文。回译的方法不仅有类似同义词替换的能力,它还具有在保持原意的前提下增加或移除单词并重新组织句子的能力。
回译可使用python translate包和textblob包(少量翻译),或者使用百度翻译或谷歌翻译的api通过python实现。
百度开放的翻译接口http://api.fanyi.baidu.com/api/trans/product/apidoc支持每月200万字的免费翻译,提供了各种语言的使用demo,本篇使用Python3调用百度API实现自然语言的翻译,实现代码如下。
import http.client
import hashlib
import json
import urllib
import random
#调用百度翻译API将中文翻译成英文
def baidu_translate(content):
appid = 'appid'
secretKey = '秘钥'
httpClient = None
myurl = '/api/trans/vip/translate'
q = content
fromLang = 'zh' # 源语言
toLang = 'en' # 翻译后的语言
salt = random.randint(32768, 65536)
sign = appid + q + str(salt) + secretKey
sign = hashlib.md5(sign.encode()).hexdigest()
myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(
q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(
salt) + '&sign=' + sign
try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
# response是HTTPResponse对象
response = httpClient.getresponse()
jsonResponse = response.read().decode("utf-8") # 获得返回的结果,结果为json格式
js = json.loads(jsonResponse) # 将json格式的结果转换字典结构
dst = str(js["trans_result"][0]["dst"]) # 取得翻译后的文本结果
#print(dst) # 打印结果
return dst
except Exception as e:
print('err:' + e)
finally:
if httpClient:
httpClient.close()
if __name__=='__main__':
contents='百度翻译开放平台是百度翻译针对广大开发者提供的开放服务平台'
#将翻译后的英文写入文件
with open('data/test_data_translate', 'a', encoding="utf-8") as f:
translate_en = baidu_translate_1(contents) # 中文翻译成英文
f.write( '\t' + translate_zh + '\n')
print(translate_en)
4、基于上下文的数据增强方法
(1)方法论文:Contextual Augmentation: Data Augmentation by Words with Paradigmatic Relations
(2)方法实现代码:使用双向循环神经网络进行数据增强。
(3)该方法目前针对于英文数据进行增强,实验工具:spacy(NLP自然语言工具包)和chainer(深度学习框架)。
5、数据增强的作用
(1)增加训练的数据量,提高模型的泛化能力。
(2)增加噪声数据,提升模型的鲁棒性。
参考:数据增强方法