Advertisement

google翻译 中文文本大量翻译成英文

阅读量:

如题,我遇到了一下情况,需要将大量wiki百科的中文文本翻译成英文

面对这个问题,有以下几点困难

  • google 翻译的API 已经开始收费了。不在提供免费的API服务。
  • 纯手工在google翻译的网页上翻译,对程序猿来说,你是认真的吗?
  • 在使用github上的开源项目时,发现即使通过web脚本调用google网页翻译的免费服务时,依然存在着字符串长度限制,已经会发生长度超出,翻译失败。

在我解决了这个问题之后,我想还是在这里和大家分享一下吧。

首先,先介绍下使用的开源项目:googletrans
具体如下下载就请参考项目的介绍文档。

假如你就是简单翻译几句短文本,
查看 样例 就完全可以了。

复制代码
    >>> from googletrans import Translator
    >>> translator = Translator()
    >>> translator.translate('안녕하세요.')
    # <Translated src=ko dest=en text=Good evening. pronunciation=Good evening.>
    >>> translator.translate('안녕하세요.', dest='ja')
    # <Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.>
    >>> translator.translate('veritas lux mea', src='la')
    # <Translated src=la dest=en text=The truth is my light pronunciation=The truth is my light>

如果你和我一样需要翻译大量的文本,那么请看下面?

(以下代码处理几百个文件依然没有被禁IP,请自己酌情改小sleep时间,以加快翻译速度)

复制代码
    #首先导入需要的包
    from googletrans import Translator
    from tqdm import tqdm
    import os
    import random
    import time
    import re
    
    #声明源文件目录 和 生成文件的放置目录
    home = os.environ['HOME']
    path = home + "/study/project/chineseSegment/artifical/test"
    dest = home + "/study/project/chineseSegment/artifical/en"
    files = os.listdir(path)
    s = []
    
    # 把长文本切分成短文本,当时google担心会检查文本长度,所以随机了长度,应该没这么严格,想写成固定的也可以
    def getText(string):
    list = []
    randline = random.random() * 500 
    while len(string) > 1500:
        index = string.find("\n",int(randline)+1000)
        if index is not None:
            list.append(string[0:index])
            string = string[index:]
    list.append(string)
    return list
    #保存翻译完后的文件
    def save2file(title,result):
    with open(dest+"/"+title,'w') as d:
        for en in result:
            d.write(en)
        d.close
    # 在文本中无法识别的表情包会使得翻译产生错误,对文本过滤
    emoji_pattern = re.compile(
    u"(\ud83d[\ude00-\ude4f])|"  # emoticons
    u"(\ud83c[\udf00-\uffff])|"  # symbols & pictographs (1 of 2)
    u"(\ud83d[\u0000-\uddff])|"  # symbols & pictographs (2 of 2)
    u"(\ud83d[\ude80-\udeff])|"  # transport & map symbols
    u"(\ud83c[\udde0-\uddff])|"  # flags (iOS)
    u"((-{0,1}[{}]-{0,1}))|"     # 我的项目逻辑需要,可删除
    u"([R efn]|)"				 # 我的项目逻辑需要,可删除
    "+", flags=re.UNICODE)
    
    def remove_emoji(text):
    return emoji_pattern.sub(r'', text)
    
    # 打印单个文本分段后的翻译进度
    def printProcess(cnt,txt_len,tatal_size,error):
    content = "file completed "+str(cnt)+"/"+str(txt_len)
    print(content,end="\r")
    
    # 在短文本翻译出错后,用二分法找到错误地方,并舍去无法翻译的句子
    def binarySearch(text):
    mid = (int) (len(text) *1.0/2)
    result = []
    splitIndex = text.find("。",mid)
    if splitIndex == -1 or splitIndex == 0:
        return result
    
    pre = text[0:splitIndex]
    after = text[splitIndex+1:]
    try:
        result = result+append(pre)
    except:
        result = result+binarySearch(pre)
    
    try:
        result = result+append(after)
    except:
        result = result+binarySearch(after)
        
    return result 
    
    # 翻译文本
    def getTranslateTextList(txt):
    result = []
    time.sleep(1)
    cnt = 0
    txtsize = 0
      
    for text in txt:
        try:
            cnt += 1
            text = remove_emoji(text)
            txtsize += len(text)
            translate = Translator()
            en = translate.translate(text=text, dest='en').text 
            result.append(en)
            printProcess(cnt,len(txt),txtsize,error)
            slptimes = random.random()  #我可能想太多,怕固定的sleep还是会被google检查出来,所以随机了一个时间
            time.sleep(1.2 + slptimes) 
        except Exception as e:
            result = result + binarySearch(text)
    return result
    
    ## 正式开始 mian()
    for file in tqdm(files):
    if not os.path.isdir(file):
        title = Translator().translate(text=file, dest='en').text 
        try:
            with open(path+"/"+file,'r') as f:
                string = f.read()
                f.close()
            txt = getText(string)
            print("analysis:"+title)
            result = getTranslateTextList(txt)
            save2file(title,result)
        except Exception as e:
                print(str(e))
                continue
    time.sleep(30) #为了保证不被google屏蔽IP,不得已设置了一个超长时间的sleep,可以按情况改小

如果 在这过程中遇到问题,可以去github的项目issue中找一下,我记得我当时运行这个项目的时候遇到了问题,通过issue的方法解决了,但是这会儿想不起来当时的问题是什么了。

全部评论 (0)

还没有任何评论哟~