使用预训练模型时经常会涉及到中英文互译,总结一下方法
安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple translate
使用
#中文翻译成英文
translator = Translator(from_lang='chinese',to_lang='english')
result = translator.translate("你好,世界!")
#英文翻译成中文
translator = Translator(from_lang='english', to_lang='chinese')
result = translator.translate("hello,world!")
但是翻译稍微复杂的语句就会报错:
RuntimeError: generator raised StopIteration
解决方法:
实际测试之后,发现是from_lang、to_lang两个参数的问题,语言设置写"Chinese"、"ZH"都可以,但是用"Chinese"这种就会报错,全部不改为缩写;
tran=translate.Translator(from_lang="ZH",to_lang="EN")
此外,这个东西有个缺点,它免费的数量每天有定额,我不知道定额是多少,但是反正不够我处理一个数据集的。
除了有道,百度和谷歌也有,但是我试了谷歌那个,搞不明白,有道最好用,还赠送体验金,网上有很多调用谷歌接口的参考代码,基本没有能用的,我也不知道他们是从哪来的,下面这个代码是改自官方给的。
调用接口的参考可以在官方下载,你的api按照他给的流程走就可以拿到,下面贴出主要代码:
# 您的应用ID
APP_KEY = ''
# 您的应用密钥
APP_SECRET = ''
def createRequest(q):
'''
note: 将下列变量替换为需要请求的参数
'''
# q = '待翻译文本'
lang_from = 'zh-CHS'
lang_to = 'en'
# vocab_id = '您的用户词表ID' 这个东西可以不要,好像是对应专业词汇的,
# 如果需要把它也加入到下面的data里
data = {'q': q, 'from': lang_from, 'to': lang_to}
addAuthParams(APP_KEY, APP_SECRET, data)
header = {'Content-Type': 'application/x-www-form-urlencoded'}
res = doCall('https://openapi.youdao.com/api', header, data, 'post')
# print(str(res.content, 'utf-8'))
res_json = res.json()
return res_json['translation'][0]
def doCall(url, header, params, method):
if 'get' == method:
return requests.get(url, params)
elif 'post' == method:
return requests.post(url, params, header)
def addAuthParams(appKey, appSecret, params):
q = params.get('q')
if q is None:
q = params.get('img')
q = "".join(q)
salt = str(uuid.uuid1())
curtime = str(int(time.time()))
sign = calculateSign(appKey, appSecret, q, salt, curtime)
params['appKey'] = appKey
params['salt'] = salt
params['curtime'] = curtime
params['signType'] = 'v3'
params['sign'] = sign
return params
def calculateSign(appKey, appSecret, q, salt, curtime):
strSrc = appKey + getInput(q) + salt + curtime + appSecret
return encrypt(strSrc)
def encrypt(strSrc):
hash_algorithm = hashlib.sha256()
hash_algorithm.update(strSrc.encode('utf-8'))
return hash_algorithm.hexdigest()
def getInput(input):
if input is None:
return input
inputLen = len(input)
return input if inputLen <= 20 else input[0:10] + str(inputLen) + input[inputLen - 10:inputLen]
注意代码里有一句print(str(res.content, ‘utf-8’)) ,这是他官方参考给的,压根没法用,我直接把返回值变成了json,从里面拿出来了translation。
另外还有一个坑,如果你下载了官方的python示例,在AuthV3Util.py文件里有两个addAuthParams方法,需要看你需求注释掉一个。翻译的结果我很满意:
补充:短时间内多次调用api会报错:
requests.exceptions.ProxyError: HTTPSConnectionPool(host='openapi.youdao.com')
每次调用前空几秒:
import time
time.sleep(5)
问题解决。