当前位置: 首页 > 科技观察

Python写的文档批量翻译工具,效果比付费软件还要好?

时间:2023-03-15 22:20:52 科技观察

一、需求说明手头有大量外文文档(本案例以5份为例,命名为test1.docxtest2.docx等),其中一份如下:基本需求:“批量将所有内容翻译成中文并转移到新文件”,效果如下:高级要求:在满足基本要求的同时,要求“保留原文档的格式”,效果为如下:二、逻辑梳理1、翻译API需求核心是翻译,策略是使用互联网的翻译API。这里推荐百度翻译开放平台。如果不考虑并发数,可以使用标准版,而且可以免费使用无限字符!百度翻译开放平台:http://api.fanyi。baidu.com/api/trans/product/index使用百度通用翻译API前,您需要完成以下任务:使用您的百度账号登录百度翻译开放平台(http://api.fanyi.baidu.com);注册成为开发者,获取APPID;进行开发者认证(如果只需要标准版可以跳过);开启通用翻译API服务:打开链接可以参考技术文档和Demo代码,写完代码就可以在个人页面看到ID和key,非常easy重要!以下是组织良好的通用翻译API的演示。输出做了简单的修改,代码拿走就可以用了!可以看到测试内容翻译准确。注意,如果需要多次访问API,免费版有并发和时间限制,可以使用time模块休眠一秒。2.格式修改高级需求的难点在于保存格式。简单的说,原文档的页面格式和段落格式是什么,翻译后对应的部分是什么。基于以上逻辑关系,只需要获取原始文档的相应内容,并将其赋值给新翻译的文档即可。(暂时只能满足页面设置和段落设置的统一,对于段落中特定词的格式修改,精度需要基于自然语言处理NLP,本文不涉及。)2.1页面样式页面样式只需要包括margins,directions,heights,width等,从原文档可以看出,使用的是narrowmargins。但是我们不需要知道如何设置窄边距的四个方向。我们只需要在代码中传递新旧文档的变量即可,如下:2.2段落样式段落样式包括对齐、缩进、间距等,在原文档中采用段落缩进后,标题居中对齐.这些设置可以在变量传递中很好地完成。如果原始文档中未设置变量,则值为None。2.3文本块样式修改对于字号、粗体、斜体、颜色等样式的调整,采用的策略是创建一个空列表,遍历原始文档的每个段落和每个文本块,获取对应的属性,放入它们的各自的列表,并针对同一段落例如,包含最多文本块属性的选项分配给翻译文档的相应段落(例如,如果段落中的所有或大部分文本为粗体,则所有文本翻译后相应段落中的块将设置为粗体)对NLP敏感有兴趣的读者可以尝试高度还原英文文档中某些特定单词的样式修改,并在翻译文档中体现出来。上面的代码不包括字体设置,因为不需要将英文字体传递给中文文档。中文字体的设置在之前的文章中有提到,比较复杂,直接看代码:fromdocx.oxml.nsimportqnrun.font.name='微软雅黑'r=run._element.rPr.rFontsr.set(qn('w:eastAsia'),'MicrosoftYahei')3.整体执行步骤至此,各部分的操作已经完成。考虑到本例中有多个文档需要翻译,整个逻辑如下:使用glob模块批处理框架可以获取到某个文件的绝对路径。word文件通过python-docx实例化后,进行段落解析,解析后的段落文本交给百度通用翻译API,解析返回的Json格式结果(这在上面修改的demo中已经完成。步骤1)并重新写入新文件,解析、翻译并将同一文件写入新文件并保存文件。3.代码实现导入所需的模块。除了翻译demo中需要的库外,还需要glob库来批量获取文件,python-docx读取文件,time模块控制访问并发。为什么要使用os模块?见下图:importrequestsimportrandomimportjsonfromhashlibimportmd5importtimefromdocximportDocumentimportglobimportos保留了原demo的部分内容,查询参数相关的代码需要移到下面的循环中。保留部分:作用如下:获取段落文字后,可以将段落文字赋值给查询参数,调用APIdemo的后续代码。在输出结果的同时,使用add_paragraph将结果写入一个新文件:最后另存为一个新文件,希望以原文件名_translated的形式命名,可以通过os.path获取。basename方法,通过字符串拼接实现:wordfile_new.save(path+r'\\'+os.path.basename(file)[:-5]+'_translated.docx')单文件操作完成后,将将文件读取并创建到批处理框架中的代码块:完成以上内容完成后,基本需求就完成了。根据我们整理的样式修改知识,添加样式调整的代码即可。最终完整代码如下:代码运行后,得到五个新的翻译文件:翻译效果如下,可以看到英文被翻译成了中文,并且保留了大部分样式!至此,所有文件均已成功翻译。当然这是机器翻译,具体应用还需要对关键部分做进一步的人工调整,但总体来说还是一次成功的Python办公自动化尝试!