23 / 04 / 03
/ 利用 Python 整理双语语言资源 /
👀
引入
我们在语言学习的过程中,经常会整理一些中英文上下文对照的 Word 文件。诚然,我们可以在 Word 文件内,利用 Ctrl+F 进行查询。或者利用 Filelocator 等软件,限定文件夹进行进一步检索。但是,如果你是一位职业译者,还是会期待进一步挖掘这些双语资源的潜力。从这个角度去思考,最直接的一种利用办法就是将其纳入翻译记忆库,让这些语言资源融入进计算机辅助翻译流程中。以 Trados 为例,如果这些双语资源已经转成翻译记忆库,一键 F3(相关搜索)、作为片段匹配出现,乃至预翻译时直接高匹配......这一系列场景都让我们有动力去将现有的上下文对照双语资源调整为翻译记忆库。那么问题来了,我们应该如何去做呢?
👀
思路 1——传统思路
首先出场的,仍然是最传统的处理办法。既然翻译记忆库那么好用,那我手动去粘贴就好了。一句一句,复制粘贴到 Excel。再利用其他工具,将双语 Excel 转成.sdltm 或者.tmx 相关格式文件。这个思路,很直接。不过缺点也很明显,这个操作,由人执行,是对时间的极大浪费。
👀
思路 2——初步引入 Python
通过复盘思路 1 中的操作,我们不难发现,我们在进行一句一句复制粘贴的过程中,规则是很明确的:
新建 Excel 文件并打开 Word 文件。
在新建 Excel 文件默认 Sheet 内,第一行第一列输入原文语言代码(本文默认 zhCN),第一行第二列输入译文语言代码(本文默认 enUS)。
复制 Word 原文句段,粘贴至 Excel 第一列第 N 行(N≥2);复制 Word 译文句段,粘贴至 Excel 第二列第 N 行(N≥2)。
完成所有粘贴流程,保存文件。
既然规则这么明确,那么,我们是否可以考虑通过 Python 代码实现这个流程呢?答案是肯定的。可参考以下代码:
import docx
import openpyxl
doc = docx.Document('example.docx')
wb = openpyxl.Workbook()
ws = wb.active
ws.cell(row=1, column=1).value = "zhCN"
ws.cell(row=1, column=2).value = "enUS"
for i in range(len(doc.paragraphs)):
if i % 2 == 0:
ws.cell(row=i // 2 + 2, column=1).value = doc.paragraphs[i].text
else:
ws.cell(row=i // 2 + 2, column=2).value = doc.paragraphs[i].text
wb.save('example.xlsx')
这个思路初步将译员从复制粘贴的过程中解脱了出来。但此时,每次需要修改代码适应文件名(即代码中的 example)
👀
思路 3——进一步利用 Python
单一文件从 Word 转成 Excel 已经通过思路 2 顺利完成。那么,如果我们有多个 Word 需要处理,我们的确可以利用思路 2 的代码完成单一文件的转换,并不断重复应用,直至完成所有的文件转换。但,显得我们有点浪费 Python。我们是否可以把文件重命名的这个过程自动化,比如让系统自动识别 Word 文件名,并把 Word 文件名直接应用到对应 Excel 中,并实现运行一次 Python 代码即可实现单一文件夹内所有 Word 的转换呢?答案是肯定的,因为我们在陈述我们需求的过程中,已经可以把规则很详细地描述出来了。可参考以下代码:
import os
import docx
import openpyxl
doc_files = [filename for filename in os.listdir('.') if filename.endswith('.docx')]
for doc_file in doc_files:
doc = docx.Document(doc_file)
xlsx_file = os.path.splitext(doc_file)[0] + '.xlsx'
wb = openpyxl.Workbook()
ws = wb.active
ws.cell(row=1, column=1).value = "zhCN"
ws.cell(row=1, column=2).value = "enUS"
for i in range(len(doc.paragraphs)):
if i % 2 == 0:
ws.cell(row=i // 2 + 2, column=1).value = doc.paragraphs[i].text
else:
ws.cell(row=i // 2 + 2, column=2).value = doc.paragraphs[i].text
wb.save(xlsx_file)
这个思路可以实现我们刚才的期待,是思路 2 的进一步延伸,也充分利用了 Python 的功能。但是,看着文件夹内一堆的文件,头疼的问题又来了。这么多 Excel,合并到一起,又是一个问题。
👀
思路 4——再试试 Python
从思路 3 出发,其实我们的需求已经很明确了。简单说,就是需要把这些 Excel 合并在一起。那么具体细节还应该注意些什么呢?做一个任务拆解试试:
生成的所有 Excel 保存后,再生成一个汇总的 Excel。
汇总 Excel 之前,先删除所有 Excel 首行的 zhCN 和 enUS,然后进行其他所有内容的汇总,汇总完成后,在汇总 Excel 的首行第一列和第二列重新标注 zhCN 和 enUS。
命名汇总 Excel 的名字为:“当前文件夹汇总”。
思路还是比较清晰,那出一个代码试试。
import os
import docx
import openpyxl
doc_files = [filename for filename in os.listdir('.') if filename.endswith('.docx')]
xlsx_file = '当前文件夹汇总.xlsx'
wb = openpyxl.Workbook()
ws = wb.active
ws.cell(row=1, column=1).value = "zhCN"
ws.cell(row=1, column=2).value = "enUS"
for doc_file in doc_files:
if not doc_file.startswith("~$"):
doc = docx.Document(doc_file)
for i in range(len(doc.paragraphs)):
if i % 2 == 0:
ws.cell(row=i // 2 + 2, column=1).value = doc.paragraphs[i].text
else:
ws.cell(row=i // 2 + 2, column=2).value = doc.paragraphs[i].text
for i in range(ws.max_row, 0, -1):
if not ws.cell(row=i, column=1).value and not ws.cell(row=i, column=2).value:
ws.delete_rows(i)
ws.cell(row=1, column=1).value = "zhCN"
ws.cell(row=1, column=2).value = "enUS"
wb.save(xlsx_file)
上述代码解决了我们目前的所有需求,只需要双击这个 py 文件,即可完成我们从思路 1 开始的所有操作。舒服了。
补充说明:
电脑内应配置 Python 环境并安装相应 Python 包,并建议大致了解 Python 基础语法。
思路 2-4 所有代码(配注释版本,详见 https://github.com/stevenash120/Translation-memory)。
ChatGPT 对代码产出亦有贡献。