【笔记】Python3|(二)用 Python 翻译文本的代码与测试结果(有道翻译 API 篇)

代码运行时间:2024/07/04

上一篇:【笔记】Python3|(一)用 Python 翻译文本的教程、代码与测试结果(第三方库 translate 和 腾讯 API 篇)

上一篇写完之后反响平平,我还以为没有人看,可能是我标题写的不好。
没想到看到评论区有说要接有道翻译的,咱主打的就是一个有求必应哈!
在这里插入图片描述


价格和 API 申请参考:

  1. 免费翻译接口最新最全汇总(百度翻译,腾讯翻译,谷歌翻译,DeepL翻译等…):了解了大部分免费翻译接口的价格情况以及申请的官方地址。
  2. 百度、阿里、腾讯、有道各平台翻译API申请教程:图文并茂地了解了翻译接口的具体申请方式。

测试方式:

  • 我全写成了 Translator 类,这样就能复用 python 库 translate 的测试代码。
  • 调用方式一律都是 Translator(from_lang="en",to_lang="zh").translate(sentence) 的形式。
  • 性能测试:用的是 Python 的第三方库 Pytest
  • 功能测试:主要是针对我自己的翻译需求做的测试,我的翻译需求是翻译目录,我写的处理脚本是分词分句之后逐词逐句翻译,具体翻译了个啥你们可以直接看后文。

本篇为第二篇,包含有道翻译 API 的测评。

2 有道 - 100元体验金

2.1 参考

参考:

  1. 注册并领取有道翻译API体验金:按照官网自带的提示,一路注册就行了。这个很简单,不需要额外参考任何的博客。
  2. 有道翻译官网-文本翻译文档
    在这里插入图片描述

API接口免费翻译额度:100元体验金,其中10元是注册,40元是实名认证,50元是添加客服微信;

超出免费额度价格:48元/百万字符,有字符资源包出售,比腾讯便宜十块。不过它有区分常见语种和非常见语种。如果是非常见语种互相翻译的话,价格就会上升至100元/百万字符,另外,专业版的翻译也会上升至60元/百万字符。

官方介绍:有道价格中心

2.2 安装

pip install --upgrade requests

有道翻译根本就没有提供现成的开发 sdk,所以只能通过请求网页去调用,所以集成的时候也得用到 requests。
它的网页 api 文档是有变化的,所以网上找到的代码可能用不了,在比较后面看到我这篇博客的读者可能也用不了我的代码。不过,如果出现这种情况,你们可以直接查看他的官方文档对 api 的介绍,对照着修改就能用了:有道翻译官网-文本翻译文档

2.3 测试代码

测试代码:

# from translate import Translator # pip install translate # 极其拉胯难用,因为有次数限制
from youdao import Translator

####################################################################################################
#----------------------------------------  Translator  ---------------------------------------------#
####################################################################################################

def isContainAlpha(str_check):
    return str_check.lower() != str_check.upper()

def test_simple_translate():
    print(Translator(from_lang="English",to_lang="Chinese").translate('Hello, world!'))

Translator 类定义的代码(没有 sdk 就是麻烦哈,还得写这么一大老长串代码):

import requests
import uuid
import time
from hashlib import sha256
SecretId = ""
SecretKey = ""

# from https://download.ydstatic.com/ead/TranslateDemo-py1.zip
'''
    计算鉴权签名 -
    计算方式 : sign = sha256(appKey + input(q) + salt + curtime + appSecret)
    @param appKey    您的应用ID
    @param appSecret 您的应用密钥
    @param q         请求内容
    @param salt      随机值
    @param curtime   当前时间戳(秒)
    @return 鉴权签名sign
'''
def calculateSign(appKey, appSecret, q, salt, curtime):
    strSrc = appKey + getInput(q) + salt + curtime + appSecret
    return encrypt(strSrc)


def encrypt(strSrc):
    hash_algorithm = 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]

class Translator:
    def __init__(self, from_lang, to_lang):
        self.from_lang = from_lang
        self.to_lang = to_lang

    def translate(self, text):
        try: 
            url = 'https://openapi.youdao.com/api'
            curtime = str(int(time.time()))
            uuid_str = uuid.uuid4().hex
            # 强制将 text 转为 utf-8 编码
            text = text.encode("utf-8").decode("utf-8")
            data = {
                "q": text,  # 待翻译的字符串
                "from": self.from_lang,  # 源语言
                "to": self.to_lang,  # 目标语言
                "appKey": SecretId,  # 应用id
                "salt": uuid_str,  # 随机字符串
                "sign": calculateSign(SecretId, SecretKey, text, uuid_str, curtime),  # 签名
                "signType": "v3",  # 签名类型
                "curtime": curtime  # 当前时间戳
            }
            res = requests.post(url, data=data).json()
            return res['translation'][0]
        except Exception as e:
            # 频率过快会返回 411 错误码
            if res.get('errorCode') == '411':
                # 休眠 0.5 秒后重试
                time.sleep(0.5)
                return self.translate(text)
            return f"{text}(翻译出错错误码是{res.get('errorCode')})"

if __name__ == '__main__':
    translator = Translator(from_lang="en", to_lang="zh")
    print(translator.translate("Hello, world!"))

2.4 测试效果

2.4.1 性能测试:效果很好,响应飞快!

输出打印时间:0.18s
在这里插入图片描述
这时间这么少,主要是因为我的网速变得更快了。我搭了有线网。实际速度应该和腾讯那个差不多吧。

2.4.2 功能测试:大部分计算机专有的词汇处理得还行,少数受上下文影响有问题

比如下图的 fixtures 单独出现没问题,和 test 放一起出现就被误翻译成“夹具”了,不过其他的常见词汇翻译挺好的,比腾讯那个效果好。

在这里插入图片描述

2.4.2 API 使用情况:挺快,但有坑

我只不过是想翻译一个文档,就触发了 411:访问频率受限,请稍后访问
难道网速快也是一种错?
在这里插入图片描述
我不得已在代码里面加了一个重启的机制,然后我个人因此觉得这个翻译真的非常的久。尤其是我还特地设置了就是某一些字符不翻译,就是大大减少它的翻译次数,还翻译的这么慢,我的耐心都没了。

  • 翻译次数:我翻译的文档是 548 行的目录文件,由于我加了一些筛选词,所以平均一行只翻译了 1~2 次。和后台的请求次数 653 是能对得上的。所以它应该是没有把返回了441这种请求算作请求次数的,还算良心。其中有大概50次是我随便试的,并不是在功能测试里面的,所以总共的请求数大概在600次。
  • 文本翻译字符数:我翻译的文档是 26865 字符数的目录文件,输出的结果是 17752 个字符的文件,不过我写的脚本对一些符号做了去除的处理,所以实际参与翻译的字符没那么多,像制表符之类的,都没有参与翻译。可以看到,它应该也是没有把翻译的结果阴险地加到字符数里面的,和腾讯差不多。

在这里插入图片描述
只是有一点我有一点想吐槽的是,他推出的这个体验金模式,就没有腾讯那个聪明。我仅仅是翻译一篇500多行的目录,就要收我将近一块钱,我明明白白的能看到钱花在哪儿了,这让我感到贵。腾讯那个就是花的不那么明白,就没什么感觉。
在这里插入图片描述
而且它并没有每个月免费的模式,它只有一个注册体验金,所以平时使用翻译的时候,我也不会敢用他的翻译。因为稍微不注意,就会超出我这个账号的额度,以后,就再也用不了了。所以以后在使用翻译的时候,如果甲方没有特定的需求的话,我应该不会考虑有道翻译 API。

后续其他篇目敬请期待,若有更新会在本文结尾附上链接。

上一篇:【笔记】Python3|(一)用 Python 翻译文本的教程、代码与测试结果(第三方库 translate 和 腾讯 API 篇)

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/140190895。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shandianchengzi

谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值