如何用Python一次性翻译十万条句子 – 作者:lemisky

前段时间, 我想翻译一个文档, 比较大, 研究一番, 最后还是只有走上写代码这条路. 我不需要高质量翻译, 机器翻译就可以了, 毋庸置疑, 谷歌的翻译质量是最好的, 或者说是我最满意的. 于是就寻找(Python)翻译库, 一番操作下来都不满意, 其中一个比较受欢迎, 但是按照常规(说明文档)方式安装下来, 调用直接报错, 我知道这肯定是可以解决的, 可能哪里出了点小问题, 毕竟很多人用, 后面好像看见说是版本不对, 要稍微指定一下版本. 我没有去尝试, 到现在我也没有用上那个, 因为我自己写了一个 Python翻译库 pygtrans

为什么取这个名字呢? 因为想的好多个名字都被占用了. 含义: Python Google Translate, Python谷歌翻译


基本功能

  • 获取语言支持列表

  • 自动检测语言, 支持批量

  • 文本/HTML 翻译, 支持批量

  • 支持 TTS

Github开源地址: pygtrans

文档地址: 文档

安装

pip install pygtrans

pip install pygtrans -i https://pypi.org/simple

必要时可以加个 --upgrade参数

完全掌握

快速入门

from pygtrans import Translate

client = Translate()

# 检测语言
text = client.detect('Answer the question.')
assert text.language == 'en'

# 翻译句子
text = client.translate('Look at these pictures and answer the questions.')
assert text.translatedText == '看这些图片,回答问题。'

# 批量翻译
texts = client.translate([
    'Good morning. What can I do for you?',
    'Read aloud and underline the sentences about booking a flight.',
    'May I have your name and telephone number?'
])
assert [text.translatedText for text in texts] == [
    '早上好。我能为你做什么?', 
    '大声朗读并在有关预订航班的句子下划线。', 
    '可以给我你的名字和电话号码吗?'
]

# 翻译到日语
text = client.translate('请多多指教', target='ja')
assert text.translatedText == 'お知らせ下さい'

# 翻译到韩语
text = client.translate('请多多指教', target='ko')
assert text.translatedText == '조언 부탁드립니다'

# 文本到语音
tts = client.tts('やめて', target='ja')
open('やめて.mp3', 'wb').write(tts)

assert [text.translatedText for text in texts] == [
‘早上好。我能为你做什么?’,
‘大声朗读并在有关预订航班的句子下划线。’,
‘可以给我你的名字和电话号码吗?’
]

翻译到日语

text = client.translate(‘请多多指教’, target=’ja’)
assert text.translatedText == ‘お知らせ下さい’

翻译到韩语

text = client.translate(‘请多多指教’, target=’ko’)
assert text.translatedText == ‘조언 부탁드립니다’

文本到语音

tts = client.tts(‘やめて’, target=’ja’)
open(‘やめて.mp3’, ‘wb’).write(tts)

**pygtrans**中总共有**6**个模块

1. Translate: 翻译模块
2. ApiKeyTranslate: 使用[谷歌翻译APIKEY](https://cloud.google.com/translate/docs/quickstarts)进行翻译的模块
3. TranslateResponse: 翻译的响应模块
4. LanguageResponse: 获取语言支持列表响应的模块
5. DetectResponse: 语言检测响应模块
6. Null: 表示一个失败的对象, 因为有时可能会失败

详情可以查看[源码](https://github.com/foyoux/pygtrans)或[文档](https://pygtrans.readthedocs.io/zh_CN/latest/)

### 一些限制

1. Translate: 暂未发现任何限制, 但这不是官网提供的标准方法, 无法得到任何保证.
2. ApiKeyTranslate:
    * 限制批量翻译数量 **128**以内, 即一次性只能翻译 **128**条句子, 在代码中, 这一个限制已经容错, 无需考虑.
    * 限制翻译整体内容大小 **102400**bytes, 即一次性只能翻译 **100KB**内容. 在使用 **pygtrans**过程中, 只需要注意, 不要让单条句子超过这个 **100KB**限制即可.

这两个翻译模块, 都是不需要楼梯的, 不过 **ApiKeyTranslate**可能需要 **money**, 虽然官方提供了[试用](https://cloud.google.com/translate/docs/quickstarts). 并且由于其限制, 在接受本文**标题任务**[如何用Python一次性翻译十万条句子]时, 虽然亲测可以胜任, 但还是不及 **Translate**用着刺激, 所以本文不介绍 **ApiKeyTranslate**, 具体用法看[ApiKeyTranslate文档](https://pygtrans.readthedocs.io/zh_CN/latest/pygtrans.html#module-pygtrans.ApiKeyTranslate)

如何判断一个请求(翻译/调用方法)是否成功

from pygtrans import Translate, Null

client = Translate()
text = client.translate(‘Hello’)
if isinstance(text, Null):
print(“翻译失败”)
# 失败信息(原因)
print(text.msg)
else:
print(“翻译成功”)

一般不判断, 直接使用

### 使用Translate

导包导模块

from pygtrans import Translate

创建翻译对象

“””
:param target: str: (可选) 目标语言, 默认: zh-CN, :doc:查看完整列表 <target>
:param source: str: (可选) 源语言, 默认: auto(自动检测), :doc:查看完整列表 <source>
:param format: str: (可选) 文本格式, text| html, 默认: html
:param user_agent: str: (可选) 用户代理, 这个参数很重要, 不设置或错误设置非常容易触发 429 Too Many Requests错误,
默认: GoogleTranslate/6.18.0.06.376053713 (Linux; U; Android 11; GM1900), 所以用户可以不用提供.
这个默认 User-Agent很稳定, 暂时未发现 429 错误, 如果出现 429, 建议 模仿默认 进行构造,
或者进行 反馈 <https://github.com/foyoux/pygtrans/issues/new>

最新版中, 已改为了随机.
:param domain: str: (可选) 域名 google.com及其可用平行域名 (如: google.cn), 默认: google.cn
:param proxies: (可选) eg: proxies = {‘http’: ‘http://localhost:10809’, ‘https’: ‘http://localhost:10809’}
“””
client = Translate()

[支持语言列表](https://pygtrans.readthedocs.io/zh_CN/latest/langs.html)

- 翻译单条句子

“””翻译文本, 支持批量, 支持 html
:param q: str: 字符串或字符串列表
:param target: str: (可选) 目标语言, 默认: self.target, :doc:查看支持列表 <target>
:param source: str: (可选) 源语言, 默认: self.source, :doc:查看支持列表 <source>
:param _format: str: (可选) 文本格式, text| html, 默认: self.format
:return: 成功则返回: :class:pygtrans.TranslateResponse.TranslateResponse对象,
或 :class:pygtrans.TranslateResponse.TranslateResponse对象列表, 这取决于 参数: q是字符串还是字符串列表.
失败则返回 :class:pygtrans.Null.Null对象
“””
text = client.translate(“google”)
assert text.translatedText == ‘谷歌’

- 检测语言

“””语言检测
:param q: 需要检测的内容, 不支持批量, 如需批量, 请参阅: :func:translate_and_detect.
:return: 成功则返回 :class:pygtrans.DetectResponse.DetectResponse对象,
失败则返回 :class:pygtrans.Null.Null对象
“””
text = client.detect(‘你好’)
assert text.language == ‘zh-CN’

- 没有批量检测方法, 只有批量检测并翻译的方法

“””检测并翻译
与 :class:translate相同,
区别是 TranslateResponse对象的 detectedSourceLanguage属性可用
“””
text = client.translate_and_detect(‘谷歌翻译’)
assert text.detectedSourceLanguage == ‘zh-CN’
texts = client.translate_and_detect([‘谷歌’, ‘Translate’])
assert texts[0].detectedSourceLanguage == ‘zh-CN’
assert texts[1].detectedSourceLanguage == ‘en’

- 从中文翻译到英语

text = client.translate(‘中国’, target=’en’)
assert text.translatedText == ‘China’

- 以文本格式翻译

默认是以html格式进行翻译的, 要以文本格式翻译, 指定 _format='txt'即可

text = client.translate(“””

“””, _format=’txt’)

print(text)

TranslateResponse(translatedText=’\n<html 语言=zh>\n <元字符集=utf-8>\n ‘, detectedSourceLanguage=None, model=None)

我们注意到, 不该翻译的也被翻译了, 如果使用html格式翻译, 就可以解决这个问题

- 以html格式进行翻译

默认是以html格式进行翻译的, 要以文本格式翻译, 指定 _format='txt'即可

text = client.translate(“””

“””)

print(text)

TranslateResponse(translatedText=’\n\n \n ‘, detectedSourceLanguage=None, model=None)

现在就正常了

## 回到我们的主题

如何用Python一次性翻译十万条句子?

如何用Python一次性翻译十万条句子?

如何用Python一次性翻译十万条句子?

假设字符串列表`words`, `len(words)>100000`

texts = client.translate(words)

大概等待20s左右, 执行完毕

len(texts) == len(words)
for i in range(10):
print(words[i][:20], texts[i][:10])

不知道其他的可不可以, 反正我觉得这个挺牛逼的, 毕竟可是经常有限制 **5000**的说法.

## 最后

* 我第一次翻译这么多的时候, 以为会被反爬, 没想到一切都非常顺利
* 现在是可以用的, 亲测很多次, 未发现问题, 但以后就不知道了. 如果以后不能用了, **求大家不要骂我**, 先谢谢大家了
* 其他谷歌翻译库(方法), 可能都涉及到了`tk`参数的问题, 这个比较麻烦, **可能**需要经常维护, 而 **pygtrans**避开了这个问题
* 有问题, 求[反馈](https://github.com/foyoux/pygtrans/issues/new)
* 觉得不错, 求个[小星星](https://github.com/foyoux/pygtrans)
* 如果大家有什么好的想法或建议, 请[尽管来](https://github.com/foyoux/pygtrans)

2021年07月19日18时00分50秒

来源:freebuf.com 2021-07-19 19:12:52 by: lemisky

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论