文本数据增强方法-百度翻译API的使用
文本数据增强不同于图像领域的数据增强,因为文本是离散的,而图像是属于连续空间的.
例如针对两张图片,可以通过线性插值,旋转或者SMOTE等方法构造出出另外一张图片;然而对于文本数据而言,假设
x
1
,
x
2
x_1, x_2
x1,x2分别表示一句话,通过线性插值出来的句子可能根本就不存在,再或者假设构造出来的句子存在性满足,然而也可能因为一个较小的扰动影响整个句子的语义信息, 故文本数据增强存在一定的难度.
以下是本人借鉴的一些文本数据增强的方法,在此感谢以下作者:
参考资料:
- https://www.zhihu.com/question/305256736
- https://github.com/quincyliang/nlp-data-augmentation
- https://github.com/yongzhuo/nlp_xiaojiang/tree/master/AugmentText
- https://blog.youkuaiyun.com/nineship/article/details/84452127
目前常用的文本数据增强方法有:
(1) 同义词替换,去停用词;
(2) 随机插入,随机删除;
(3) 随机打乱句子的顺序(对不注重语义信息的文本可能有用);
(4) 随机Mask掉原始文本中的某些词;
(5) 回译-回翻译:指的是将目标语言翻译成另外一种语言再翻译回来的一种方法.
百度的通用翻译API
下边介绍一下如何使用百度的通用翻译API,具体使用文档可参照如下:
http://api.fanyi.baidu.com/api/trans/product/apidoc
通用翻译API每月提供200万字符免费额度,超出后仅收取超出部分费用.
首先需要按照上述链接文档要求注册认证账号,注册账号之后管理控制台会显示对应开发者信息的APP ID与密钥,具体使用方法,可参照上述技术文档,也可参阅一下代码块:
1. 导入基本包
import time
import http.client
import hashlib
import json
import urllib
import random
2. 百度翻译API使用
def baidu_translate(content,from_lang,to_lang):
# 开发者信息申请信息处的APP ID
appid = '***'
# 开发者信息申请信息处的密钥
secretKey = '***'
# 本机的ip地址
httpClient = "***"
myurl = '/api/trans/vip/translate'
# 需要翻译的文本内容
q = content
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=' + from_lang + '&to=' + to_lang + '&salt=' + str(
salt) + '&sign=' + sign
try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
# response是HTTPResponse对象
response = httpClient.getresponse()
# 获得返回的结果,结果为json格式
jsonResponse = response.read().decode("utf-8")
# 将json格式的结果转换字典结构
js = json.loads(jsonResponse)
# 取得翻译后的文本结果
dst = str(js["trans_result"][0]["dst"])
return dst
except Exception as e:
print("Error",e)
finally:
if httpClient:
httpClient.close()
def back_translate(content,from_lang, language_types):
results = []
for to_lang in language_types:
try:
# 将原始语种翻译成另外一种语言
temp_content = baidu_translate(content,from_lang,to_lang)
# 往回翻译
result_content = baidu_translate(temp_content,to_lang,from_lang)
# 存储翻译结果
results.append(result_content)
except Exception as e:
print("Error", e)
return results
3. 具体调用
lang = ['en','yue','wyw','jp','kor']
content = "该地方填写需要翻译的内容"
results = back_translate(content, "zh", lang)
print(results)