Python实现中英文互译

使用预训练模型时经常会涉及到中英文互译,总结一下方法

1、translate库

安装

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")

  此外,这个东西有个缺点,它免费的数量每天有定额,我不知道定额是多少,但是反正不够我处理一个数据集的。

2、有道翻译API

  除了有道,百度和谷歌也有,但是我试了谷歌那个,搞不明白,有道最好用,还赠送体验金,网上有很多调用谷歌接口的参考代码,基本没有能用的,我也不知道他们是从哪来的,下面这个代码是改自官方给的。
  调用接口的参考可以在官方下载,你的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方法,需要看你需求注释掉一个。翻译的结果我很满意:
Python实现中英文互译_第1张图片

  补充:短时间内多次调用api会报错:

requests.exceptions.ProxyError: HTTPSConnectionPool(host='openapi.youdao.com')

  每次调用前空几秒:

import time
time.sleep(5)

  问题解决。

你可能感兴趣的:(python,开发语言)