如何用Python一次性翻译十万条数据
Posted foyou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Python一次性翻译十万条数据相关的知识,希望对你有一定的参考价值。
前段时间, 我想翻译一个文档, 比较大, 研究一番, 最后还是只有走上写代码这条路. 我不需要高质量翻译, 机器翻译就可以了, 毋庸置疑, 谷歌的翻译质量是最好的, 或者说是我最满意的. 于是就寻找(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)
pygtrans中总共有6个模块
- Translate: 翻译模块
- ApiKeyTranslate: 使用谷歌翻译APIKEY进行翻译的模块
- TranslateResponse: 翻译的响应模块
- LanguageResponse: 获取语言支持列表响应的模块
- DetectResponse: 语言检测响应模块
- Null: 表示一个失败的对象, 因为有时可能会失败
详情可以查看源码或文档
一些限制
- Translate: 暂未发现任何限制, 但这不是官网提供的标准方法, 无法得到任何保证.
ApiKeyTranslate:
- 限制批量翻译数量 128 以内, 即一次性只能翻译 128 条句子, 在代码中, 这一个限制已经容错, 无需考虑.
- 限制翻译整体内容大小 102400 bytes, 即一次性只能翻译 100KB 内容. 在使用 pygtrans 过程中, 只需要注意, 不要让单条句子超过这个 100KB 限制即可.
这两个翻译模块, 都是不需要楼梯的, 不过 ApiKeyTranslate 可能需要 money, 虽然官方提供了试用. 并且由于其限制, 在接受本文标题任务[如何用Python一次性翻译十万条句子]时, 虽然亲测可以胜任, 但还是不及 Translate 用着刺激, 所以本文不介绍 ApiKeyTranslate, 具体用法看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()
支持语言列表
- 翻译单条句子
"""翻译文本, 支持批量, 支持 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("""<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
""", _format=\'txt\')
print(text)
# TranslateResponse(translatedText=\'<!DOCTYPE html>\\n<html 语言=zh>\\n <元字符集=utf-8>\\n <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">\', detectedSourceLanguage=None, model=None)
# 我们注意到, 不该翻译的也被翻译了, 如果使用html格式翻译, 就可以解决这个问题
- 以html格式进行翻译
# 默认是以html格式进行翻译的, 要以文本格式翻译, 指定 `_format=\'txt\'` 即可
text = client.translate("""<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
""")
print(text)
# TranslateResponse(translatedText=\'<!DOCTYPE html>\\n<html lang=en>\\n <meta charset=utf-8>\\n <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">\', 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 的说法.
最后
- 我第一次翻译这么多的时候, 以为会被反爬, 没想到一切都非常顺利
- 现在是可以用的, 亲测很多次, 未发现问题, 但以后就不知道了. 如果以后不能用了, 求大家不要骂我, 先谢谢大家了
以上是关于如何用Python一次性翻译十万条数据的主要内容,如果未能解决你的问题,请参考以下文章
我如何用 Ruby/Python 编写这个?或者,你能把我的 LINQ 翻译成 Ruby/Python 吗?
如何用 Android 数据绑定替换 androidx.fragment.app.FragmentContainerView 中的片段