如何用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个模块

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

详情可以查看源码文档

一些限制

  1. Translate: 暂未发现任何限制, 但这不是官网提供的标准方法, 无法得到任何保证.
  2. 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()

支持语言列表

  1. 翻译单条句子
"""翻译文本, 支持批量, 支持 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 == '谷歌'
  1. 检测语言
"""语言检测
:param q: 需要检测的内容, 不支持批量, 如需批量, 请参阅: :func:`translate_and_detect`.
:return: 成功则返回 :class:`pygtrans.DetectResponse.DetectResponse` 对象,
    失败则返回 :class:`pygtrans.Null.Null` 对象
"""
text = client.detect('你好')
assert text.language == 'zh-CN'
  1. 没有批量检测方法, 只有批量检测并翻译的方法
"""检测并翻译
与 :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'
  1. 从中文翻译到英语
text = client.translate('中国', target='en')
assert text.translatedText == 'China'
  1. 以文本格式翻译
# 默认是以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格式翻译, 就可以解决这个问题
  1. 以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 的说法.

最后

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

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

对了, 还有个TTS (文本转语音) 的功能

tts = client.tts("""
我的小鱼你醒了,还认识早晨吗?

昨夜你曾经说,愿夜幕永不降临。

你的香腮边轻轻滑落的,是你的泪,还是我的泪?

初吻吻别的那个季节,不是已经哭过了嘛?

我的指尖还记忆着,你慌乱的心跳。

温柔的体香里,那一绺长发飘飘。
""")
open('我的小鱼你醒了.mp3', 'wb').write(tts)

这里不能放视频, 大家可以看下 这里

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • pygtrans: python google translate 谷歌翻译, 支持 APIKEY github[...
    lemisky阅读 3,257评论 4 13
  • 通过DOM操作插入到页面,势必导致页面运行出现卡顿, 为此我还特意写了一个 demo测试了一下, 代码如下 dat...
    world_7735阅读 1,395评论 0 17
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,598评论 1 180
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,045评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,030评论 0 4