周末在看一本英文书籍,发现还是有不少专业词汇读起来不顺,再要连成文章感觉太累。
想到百度和谷歌翻译,把不懂的词汇或者语句拷贝过去,确实轻松不少,想想是不是可以整篇文章一次翻译出来?
没想到发现不少问题,一是每次拷贝限制字数只有5000,二是如果传文档上去,无论是百度还是谷歌,甚至把网易有道、搜狐、微软等等找了一圈,都没有好的办法,除非给银子。
一次只有5000字,一篇文章好歹几十万的字数,拷贝粘贴岂不是几个月都无法解决?
人生苦短,怎么能把时间花在拷贝粘贴之上?用python吧。
长话短说,开始动手了。先是百度一下,发现前人有不少工作,似乎很简单的一件事。但动手后,发现这件事情还是很多弯弯道道,把过程写了下来,让大家参考吧。
一、谷歌翻译
从《Python3调用Google翻译》(附录1)写了一段谷歌的翻译,但很快发现几个问题:(1)谷歌的翻译结果一般般,没有网页上准确,仔细看了,发现是谷歌给了几种翻译,但用python调用谷歌翻译,结果是另外一条。(这种情况网易有道也类似)(2)谷歌翻译限制连接数,翻译了一段后,后面的就不给用了。
注:这篇文章写得很简洁易懂,但对结果处理不好,只能取到部分翻译结果,而且如果文章有换行等就容易出错了。
二、Python自带翻译
放弃了谷歌,便想到Python自己能不能做?还真找到了,见附件2,好简单。但用后更加失望,虽然这个Translate介绍是用了微软的接口,单句的实现效果不错,但很快就发现:(1)一次限制500字符数,长一点段落就出错了;(2)接口调用也被限制了次数。
后来发现附录3《Python实现文档自动翻译》写得比较全面,但实现大文件文全翻译还是有很多不足,其中介绍的方法没有一种可以拿来就用。
三、大文件全文翻译实现
仔细比较后,发现还是老老实实用百度的翻译API模式最好,便以此来实现大文件翻译,结果还算可以。
假设源文件为 temp.txt , 翻译的结果存在 result.txt
由于文件较大,采用逐行读取逐行翻译的方式
百度API使用百度提供的示例,改写为函数,改进2点:(1)翻译后的结果通过json解释,返回字符串而不是json;(2)由于注册用了标准版,限制每秒不能超过一次,否则出错。所以强制加了延时1秒。牺牲了速度,可以申请高级版开发权限,每月有200万字的免费试用。
注:源文件中可以有换行,但尽量把空行,如只有空格的行格式化。
代码如下:
# 有些库用于测试,就没清理了
import urllib.request
import urllib.parse
import json
import requests
import http.client
import hashlib
import urllib
import random
import time
# 写TXT文档
def write_txt(path,content):
'''实现TXT文档的写方法'''
with open(path,'a+') as f:
f.write(content)
# 百度翻译API方法
def baidu_translate(content):
'''实现百度翻译'''
appid = '*******' # 填写你的appid
secretKey = '********' # 填写你的密钥
httpClient = None
myurl = '/api/trans/vip/translate'
fromLang = 'auto' #原文语种
toLang = 'zh' #译文语种
salt = random.randint(32768, 65536)
q= content
sign = appid + q + str(salt) + secretKey
sign = hashlib.md5(sign.encode()).hexdigest()
myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(
salt) + '&sign=' + sign
time.sleep(1)
try:
httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
# response是HTTPResponse对象
response = httpClient.getresponse()
result_all = response.read().decode("utf-8")
result = json.loads(result_all)
print (result)
print (len(result))
trans = result['trans_result']
ret = ''
for i in range(len(trans)):
ret += trans[i]['dst']
# print(ret)
except Exception as e:
ret = ""
print (e)
finally:
if httpClient:
httpClient.close()
return ret
def main():
srcFile = "e:\\test\\temp.txt"
destFile = "e:\\test\\result.txt"
bWr = True
for line in open(srcFile,'r'):
line = line.strip('\n')
if(len(line)<1): # 该行仅仅是换行
bWr = False
else:
bWr = True
if(bWr):
# write_txt(destFile,translate(line)+"\n") # python translate 库
# write_txt(destFile,google_translate(line)+"\n") #google get 方法
write_txt(destFile,baidu_translate(line)+"\n") #百度API 方法
# write_txt(destFile,youdao_translate(line)+"\n") # 有道方法
if __name__ == '__main__':
main()
参考文章:
- Python3调用Google翻译 https://www.jianshu.com/p/e42609d9a9e8
- Python3中使用translate实现翻译 https://blog.csdn.net/qq_16668303/article/details/89677696
- Python实现文档自动翻译 https://www.jianshu.com/p/2d51a87e2926