文章

pdf翻译

记录ieeA和BabelDOC的pipeline

pdf翻译

1月初,偶然刷到了幻觉翻译,这是一个利用arxiv上latex源码进行翻译的项目,可以免费使用。幻觉翻译的格式保留太好了,翻译效果也不错,可惜作者并没有开源(作者说怕被大厂零元购),使用的模型也一般般,用起来有点膈应。我于是参考了作者发在知乎上的文章,利用opencode + antigravity中转出来的Opus完成了ieeA

相较于幻觉翻译,ieeA允许用户自定义llm、提示词、glossary和examples,支持高并发。相当于幻觉翻译的开源版本。但是,ieeA和幻觉翻译只能处理提供了latex源代码的文档,无法处理一般的pdf。

春节期间,我在使用沉浸式翻译时候,偶然发现了BabelDOC,它竟然可以无损地直接翻译pdf文件,并且还是开源的。感谢上帝,我于是对BabelDOC进行了开发,包括:增加更多不需要翻译的内容,比如figure、table、refs;保护超链接样式;llm翻译命中缓存等。

两种方法的大体思路都是 parser -> protect -> translate -> reconstruct,本文记录这两个工具的核心思路。感谢codex,codex+ superpowers就是无敌的🙏

BabelDOC

BabelDOC的核心是解析与layout对齐。具体流程是分别通过:1)pdf解析:pdfminer + pymupdf解析文档元素。对于文本,这会得到每一个字符的位置,对于图片,会得到每一个线条的位置。关于pdf的结构,可以参考b站up主的视频。总之,这一步之后会生成一份中间产物(IL,Intermedium Language);2)layout识别:调用DocLayout-YOLO模型识别layout。结构为bbox(方框,由左下和右上两个坐标确定),十个种类,包含plain_text。调用layout之后,还有fallback_line识别,这是为了防止yolo漏检;3)段落识别:对齐IL和layout,如果字符的位置在layout中,则被归位同一类。 这一步是BabelDOC的神来之笔,通过交叉验证,同时解析文档和保留格式;4)样式识别:识别引用之类的特殊格式。

layout识别样式如下:

PDF内容

ieeA

相比之下,ieeA则简单粗暴很多,只要对latex源码操作即可,处理逻辑是线性的。比不上babeldoc精巧,哎!不过也有些经验:

  1. 使用git worktree开发的经验
  2. 在匹配环境时,使用正则 + 栈计数
  3. 并发处理 + 缓存命中
本文由作者按照 CC BY 4.0 进行授权