乐趣区

关于python:如何用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 月 25 日 14 时 17 分 54 秒

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

tts = client.tts("""
我的小鱼你醒了,还意识晚上吗?昨夜你已经说,愿夜幕永不来临。你的香腮边微微滑落的,是你的泪,还是我的泪?初吻吻别的那个节令,不是曾经哭过了嘛?我的指尖还记忆着,你慌乱的心跳。温顺的体香里,那一绺长发飘飘。""")
open('我的小鱼你醒了.mp3', 'wb').write(tts)

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

退出移动版