PaddleHub机器翻译:文档的批量翻译
通过机器翻译,打破语言隔阂,促进沟通交流,始终是NLP领域倍受关注的应用场景之一。当前,很多时候我们会以来各大厂商的在线翻译能力,翻译一些段落(至少笔者是这样)。不过,基于PaddleHub,我们可以实现自由、不首先本地的文本翻译能力,同时,这种实现方式,也为我们提供了针对自有数据集,形成更能精准匹配业务需求翻译能力的可能。

0. 引言
通过机器翻译,打破语言隔阂,促进沟通交流,始终是NLP领域倍受关注的应用场景之一。当前,很多时候我们会以来各大厂商的在线翻译能力,翻译一些段落(至少笔者是这样)。不过,基于PaddleHub,我们可以实现自由、不首先本地的文本翻译能力,同时,这种实现方式,也为我们提供了针对自有数据集,形成更能精准匹配业务需求翻译能力的可能。那么,我们就先来看看,基于PaddleHub,如何在本地将word文档直接翻译为另一种语言,并且还能保留该word文档的标题层级等格式结构。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
1. python-docx简介
python-docx将整个文章看做是一个Document对象 最新文档 - Document,其基本结构如下:
每个Document包含许多个代表“段落”的Paragraph对象,存放在document.paragraphs中。每个Paragraph都有许多个代表"行内元素"的Run对象,存放在paragraph.runs中。
在python-docx中,run是最基本的单位,每个run对象内的文本样式都是一致的,也就是说,在从docx文件生成文档对象时,python-docx会根据样式的变化来将文本切分为一个个的Run对象。
也可以通过它来处理表格 最新文档 - 表格,基本结构如下:
python-docx将文章中所有的表格都存放在document.tables中每个Table都有对应的行table. rows、列table. columns和单元格(table. cell())单元格是最基本的单位,每个单元格又被划分成不同的Paragraph对象,具体内容同上。
参考资料:python docx 使用总结
1.1 用Python写一个word文档
参考最新文档的示例,基于python-docx,我们不需要打开Office软件,也可以用Python写一个完整的word文档,比如:
In [4]!pip install python-docx登录后复制
Looking in indexes: https://mirror.baidu.com/pypi/simple/Collecting python-docx Downloading https://mirror.baidu.com/pypi/packages/8b/a0/52729ce4aa026f31b74cc877be1d11e4ddeaa361dc7aebec148171644b33/python-docx-0.8.11.tar.gz (5.6MB) |████████████████████████████████| 5.6MB 14.9MB/s eta 0:00:01Collecting lxml>=2.3.2 (from python-docx) Downloading https://mirror.baidu.com/pypi/packages/cf/4d/6537313bf58fe22b508f08cf3eb86b29b6f9edf68e00454224539421073b/lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl (5.5MB) |████████████████████████████████| 5.5MB 15.6MB/s eta 0:00:01Building wheels for collected packages: python-docx Building wheel for python-docx (setup.py) ... done Created wheel for python-docx: filename=python_docx-0.8.11-cp37-none-any.whl size=184493 sha256=1e95784e743db12bb4c235313b317ef8493520b701e72280d10127fa590a7627 Stored in directory: /home/aistudio/.cache/pip/wheels/dc/ab/e8/a6413f4f5da9cbf373772fa4345e340fc5b7860fd2b7f56ac4Successfully built python-docxInstalling collected packages: lxml, python-docxSuccessfully installed lxml-4.6.3 python-docx-0.8.11登录后复制In [5]
from docx import Documentfrom docx.shared import Inchesdocument = Document()document.add_heading('Document Title', 0)p = document.add_paragraph('A plain paragraph having some ')p.add_run('bold').bold = Truep.add_run(' and some ')p.add_run('italic.').italic = Truedocument.add_heading('Heading, level 1', level=1)document.add_paragraph('Intense quote', style='Intense Quote')document.add_paragraph( 'first item in unordered list', style='List Bullet')document.add_paragraph( 'first item in ordered list', style='List Number')document.add_picture('imgs/13523736-c694e2233a8d0bb6.webp', width=Inches(1.25))records = ( (3, '101', 'Spam'), (7, '422', 'Eggs'), (4, '631', 'Spam, spam, eggs, and spam'))table = document.add_table(rows=1, cols=3)hdr_cells = table.rows[0].cellshdr_cells[0].text = 'Qty'hdr_cells[1].text = 'Id'hdr_cells[2].text = 'Desc'for qty, id, desc in records: row_cells = table.add_row().cells row_cells[0].text = str(qty) row_cells[1].text = id row_cells[2].text = descdocument.add_page_break()document.save('demo.docx')登录后复制打开demo.docx可以看到效果如下:

1.2 用python-docx提取文档结构层级
在python-docx中,可以对word文档的格式进行解析。本文准备了一个简单的新闻稿word示例,如下所示:
In [15]document = Document('新闻稿_带格式.docx')登录后复制In [36]# 查看第1个段落的结构格式print(document.paragraphs[0].style.name)# 查看第1个段落的文本内容print(document.paragraphs[0].text)登录后复制
Title网民规模超10亿,国人的数字生活有哪些新生态登录后复制In [37]
# 查看第2个段落的结构格式print(document.paragraphs[1].style.name)# 查看第2个段落的文本内容print(document.paragraphs[1].text)登录后复制
text_align-justify截至2024年6月,我国网民规模为10.11亿,互联网普及率达71.6%……8月27日,中国互联网络信息中心(CNNIC)发布第48次《中国互联网络发展状况统计报告》指出,我国超10亿用户接入互联网,形成了全球最为庞大、生机勃勃的数字社会。登录后复制In [35]
# 查看第4个段落的结构格式print(document.paragraphs[3].style.name)# 查看第4个段落的文本内容print(document.paragraphs[3].text)登录后复制
Heading 1数字化转型的浪潮已开启登录后复制
1.3 提取并封装文档信息
通过下面的方法,将word文档不同段落的结构和内容进行整理。
In [39]def get_paragraphs_text(path): """ 获取所有段落的文本 :param path: word路径 :return: list类型,如: ['Test', 'hello world', ...] """ document = Document(path) all_paragraphs = document.paragraphs paragraphs_text = [] for paragraph in all_paragraphs: # 拼接一个list,包括段落的结构和内容 paragraphs_text.append([paragraph.style.name,paragraph.text]) return paragraphs_text登录后复制In [40]
# 提取文档信息text = get_paragraphs_text('新闻稿_带格式.docx')登录后复制In [44]# 随机查看一个封装后段落的信息text[9]登录后复制
['text_align-justify', '“短视频、直播正在成为全民新的娱乐方式。”报告指出,截至2024年6月,我国短视频用户规模为8.88亿,占网民整体的87.8%。网络直播用户规模达6.38亿,占网民整体的63.1%。其中,电商直播用户规模为3.84亿,同比增长7524万。']登录后复制
2. Paddlehub 文本-机器翻译预训练模型
在PaddleHub中,我们可以便捷地获取PaddlePaddle生态下的预训练模型,完成模型的管理和一键预测。配合使用Fine-tune API,可以基于大规模预训练模型快速完成迁移学习,让预训练模型能更好地服务于特定场景的应用。 PaddleHub目前提供了两种机器翻译的预训练模型,分别是:
transformer_zh-entransformer_zh-en包含6层的transformer结构,头数为8,隐藏层参数为512,参数量为64M。该模型在CWMT2024的数据集进行了预训练,加载后可直接用于预测, 提供了中文翻译为英文的能力。transformer_en-detransformer_en-de包含6层的transformer结构,头数为8,隐藏层参数为512,参数量为64M。该模型在WMT'14 EN-DE数据集进行了预训练,加载后可直接用于预测,提供了英文翻译为德文的能力。2.1 单个文档转换-中文文档转英文
In [ ]import osimport paddlehub as hub登录后复制In [59]
text = get_paragraphs_text('新闻稿_带格式.docx')登录后复制In [6]model = hub.Module(name='transformer_zh-en', beam_size=5)new_document = Document()for item in text: src_style = item[0] src_texts = [item[1]] print('标题层级:', src_style) print(src_texts) n_best = 1 # 每个输入样本的输出候选句子数量 trg_texts = model.predict(src_texts, n_best=n_best) print(trg_texts) if src_style == 'Title': new_document.add_heading(trg_texts, 0) elif src_style[:7:] == 'Heading': new_document.add_heading(trg_texts, level=int(src_style[-1])) else: new_document.add_paragraph(trg_texts)new_document.save('translate_news.docx')登录后复制转换效果:
标题层级: text_align-justify['身处数字时代的浪潮中,你我的数字生活有哪些新生态?']['In the digital age wave, what new ecology do you and I have in digital life?']标题层级: Heading 1['数字化转型的浪潮已开启']['The tide of digital transformation has started']标题层级: text_align-justify['截至2024年6月,我国网民规模为10.11亿,较2020年12月新增网民2175万,互联网普及率达71.6%。其中,我国手机网民规模为10.07亿,网民中使用手机上网的比例为99.6%。']["By June 2024, the number of China's Internet users was 1.011 billion, an increase of 21.75 million since December 2020, and 71.6 percent of the Internet population."]登录后复制

2.2 单个文档转换-英文文档转德文
In [ ]text = get_paragraphs_text('092016_cfpb_CreditReportingDisputeLetter.docx')登录后复制In [ ]model = hub.Module(name='transformer_en-de', beam_size=5)new_document = Document()for item in text: src_style = item[0] src_texts = [item[1]] print('标题层级:', src_style) print(src_texts) n_best = 1 # 每个输入样本的输出候选句子数量 trg_texts = model.predict(src_texts, n_best=n_best) print(trg_texts) if src_style == 'Title': new_document.add_heading(trg_texts, 0) elif src_style[:7:] == 'Heading': new_document.add_heading(trg_texts, level=int(src_style[-1])) else: new_document.add_paragraph(trg_texts)new_document.save('translate_en2de.docx')登录后复制2.3 文档批量转换
In [65]def doc_translate(input_file, output_file, modelname): # 提取docx文档信息 text = get_paragraphs_text(input_file) # 指定模型 model = hub.Module(name=modelname, beam_size=5) # 准备生成转换后的文档 new_document = Document() for item in text: src_style = item[0] src_texts = [item[1]] print('标题层级:', src_style) print(src_texts) n_best = 1 # 每个输入样本的输出候选句子数量 trg_texts = model.predict(src_texts, n_best=n_best) print(trg_texts) # 匹配转换后文档的标题层级 if src_style == 'Title': new_document.add_heading(trg_texts, 0) elif src_style[:7:] == 'Heading': new_document.add_heading(trg_texts, level=int(src_style[-1])) else: new_document.add_paragraph(trg_texts) new_document.save(output_file)登录后复制In [1]word_folder = './word'files = os.listdir(word_folder) for fi in files: input_file = os.path.join(word_folder,fi) output_file = os.path.join(word_folder,'translate_' + os.path.basename(input_file)) doc_translate(input_file, output_file, 'transformer_zh-en')登录后复制
从上面的转换结果可以看出,当前Paddlehub上的中文转英文预训练模型还是有提升空间的,比如空行会被翻译为No。不过,这个问题python-docx就可以先做部分处理——当然,治本之策还是需要继续finetune模型。

'''全局内容替换请确保要替换的内容样式一致Args: doc: 文档对象 old_text: 要被替换的文本 new_text: 要替换成的文本'''def replace_text(doc, old_text, new_text): # 遍历每个段落 for p in doc.paragraphs: # 如果要搜索的内容在该段落 if old_text in p.text: # 使用 runs 替换内容但不改变样式 # 注意!runs 会根据样式分隔内容,确保被替换内容的样式一致 for run in p.runs: if old_text in run.text: run.text = run.text.replace(old_text, new_text)登录后复制In [5]
# 导入from docx import Document# 从文件创建文档对象document = Document('./word/translate_赛题介绍.docx')# 显示每段的内容replace_text(document, 'No', '')# 保存清洗后的文档document.save('word/translate_clean_赛题介绍.docx')登录后复制 相关攻略
参考指南与学习资料 若您希望在本地快速搭建并部署一个个人智能助手,OpenClaw 框架是一个理想的入门选择。为了帮助开发者更高效地上手,社区中已有丰富的学习资源与讨论可供参考,主要包括:OpenClaw 新手入门教程、核心命令行工具使用指南(openclaw -h 查看帮助)、配置文件的参数详解,
1 openclaw 工具权限报错解决方案:无法使用 exec read write webfetch 等工具的修复方法 当您在配置 openclaw 时遇到工具权限报错,提示缺少 exec、read、write、webfetch 等关键工具的使用权限,通常无需深入排查复杂的系统环境。此问题在多数
本次部署指南的核心目标非常明确:在 Linux 环境中,无论是云服务器还是本地物理机,我们都需要完整地完成 OpenClaw 智能体框架的安装与部署,并通过基础的健康检查与功能验证,确保整个系统能够成功启动并稳定运行。 一、环境要求 在开始动手安装之前,我们首先需要确认系统满足所有的基础运行环境要求
场景一:npm install 安装失败问题详解与解决方案 在进行前端开发或是安装Node js工具时,你是否经常遇到令人困扰的“npm install failed”报错?这个问题通常表现为命令行输出一串红色错误信息,最终停止在安装失败的提示上。深入分析这些报错日志,你会发现一个关键提示:缺少C+
Framework笔记本携手KDE社区:共同推进Linux桌面深度优化方案 近期,模块化笔记本领域的领导者Framework公司宣布与全球知名的开源社区KDE达成战略合作,正式成为KDE的重要赞助伙伴。这一举措不仅象征着Framework在推动开源生态发展上迈出关键一步,也标志着硬件创新厂商与顶级L
热门专题
热门推荐
速览攻略:世界圣羽翼王核心打法与全面解析 本攻略将为你完整呈现《洛克王国》世界圣羽翼王的通关秘籍,深度剖析两种高效实战打法:追求极致速度的“燃薪虫四回合速通”与稳定输出的“酷拉无限连击流”。文章将进一步解析这位翼系精灵王的技能机制、属性克制关系及其在PVE与PVP中的实战定位,帮助你彻底掌握应对其隐
速览:工程系统核心机制解析 在《异种航员2》中,工程系统是整个抵抗力量赖以运转的“战略后勤中枢”。无论是研发新武器、生产重型装甲还是制造先进飞行器,所有实体装备的产出都依赖于此。简言之,该系统的核心运作围绕着两大关键:工程师人力的高效配置与全球稀缺资源的精细化调度。工程师的数量直接决定了每个项目的建
核心速览 在《洛克王国世界》中,治愈兔是一位兼具功能性任务角色与实战辅助能力的精灵。它的价值不仅在剧情推进中体现,更在于对战里出色的治疗与防护表现。本文将为你全面解析治愈兔的精准获取位置、种族属性特点以及实战技能搭配,助你顺利捕捉并最大化其在队伍中的作用。所有关键信息将通过清晰的图文内容详细展示,确
速览 在《红色沙漠》中,挑战传说之狼这一强大的任务BOSS,需要玩家进行充分的准备并遵循完整的任务流程。整个过程环环相扣,你必须首先参与塞莱斯特家族的势力任务,通过完成任务将家族声望提升至指定等级,才能解锁【传说之狼】的专属讨伐任务,最终直面这个传说中的强大生物。 红色沙漠传说之狼怎么打 归根结底,
【宝可梦Pokopia】舒适度全解析:快速提升环境等级的核心秘诀 你是否正在探索《宝可梦Pokopia》世界,并希望有效提升宝可梦栖息地的舒适度?舒适度不仅是衡量宝可梦快乐程度的晴雨表,更是解锁游戏核心内容、加速发展的关键驱动指标。本攻略将系统性地为你揭示提升舒适度的核心途径,涵盖从装饰栖息地、建造





