GLM-OCR公式编号合并算法:为什么公式和编号要合并成一个块
【免费下载链接】GLM-OCRGLM-OCR: Accurate × Fast × Comprehensive项目地址: https://gitcode.com/GitHub_Trending/gl/GLM-OCR
在使用GLM-OCR将 PDF 论文、教材转换成 Markdown 时,你是否遇到过这种尴尬:公式被完整识别了,可旁边的编号(1)却被单独拆成一截孤零零的文字,和公式隔开了几个空行?公式编号合并算法正是为解决这个痛点而生的——它把布局检测拆散的公式块与编号块重新拼回一个整体,让输出里的每个公式都带着自己的编号,干净、完整、可引用。
1️⃣ 痛点:编号为什么总被"拆散"
问题出在 GLM-OCR 的解析流程上。它先由版面检测模型(PP-DocLayoutV3)把页面切成一个个语义区域,再逐个区域做 OCR 识别。在 25 类版面标签中,公式(display_formula)和公式编号(formula_number)是两类独立的区域:
- 公式通常居中,编号靠右对齐,两个框在页面上互不重叠,检测模型不会把它们框成同一个区域;
- 每个区域独立送 OCR,编号区域识别出的就是
(1)这样短短几个字符。
结果就是:JSON 里有两条相邻记录,Markdown 里公式和编号被分成两段,像这样——
E = mc^2 (1)对于"式 (1) 表明……"这类引用,编号和公式被拆开会让后续的结构化解析、PDF 回转、公式检索全部失去关联。
2️⃣ 合并算法三步走
后处理阶段,ResultFormatter按阅读顺序扫描整页区域列表,执行 _merge_formula_numbers 方法,核心逻辑只有三步:
第一步:识别相邻的"公式 + 编号"组合。算法同时兼容两种顺序——
| 顺序 | 场景 | 处理方式 |
|---|---|---|
| 公式 → 编号 | 编号在公式下方/识别顺序靠后 | 取下一块,确认是formula_number |
| 编号 → 公式 | 编号被排在公式前面 | 当前块是编号,且下一块是formula |
为什么两种都要处理?因为版面区域是按阅读顺序(index)排序的,编号究竟排在公式前还是后,取决于检测框的位置,两种情况在真实文档中都会出现,算法必须都兜住。
第二步:清洗编号内容。借助 clean_formula_number 工具函数去掉全角或半角括号:
(1) → 1 (2.1) → 2.1 3 → 3第三步:用 LaTeX 的\tag{}把编号"挂"回公式上。编号不是简单拼接成文本,而是作为\tag{}插入公式末尾:
合并前: $$E = mc^2$$ (1) 合并后: $$E = mc^2 \tag{1}$$这是 LaTeX 显示公式的标准编号写法,任何支持 KaTeX/MathJax 的渲染器都能正确显示,Markdown 转 PDF、转网页时编号位置也完全符合排版习惯。
3️⃣ 藏在源码里的三个细节
细节一:为什么只有公式以\n$$结尾才合并?因为格式化阶段会先把所有独立公式统一包装成$$\n...\n$$的标准形式,以\n$$结尾恰好证明它是一个完整的独立公式块,避免误伤行内公式。
细节二:合并后重排 index。编号块被吸收后,剩余区域的index会重新从 0 编号,保证下游按序号取块时不出现"空洞"。
细节三:编号块若找不到相邻公式会被直接丢弃。孤立的(1)留在正文里只会制造噪声,算法选择让它消失。
这些行为都受配置开关控制,config.py 中enable_merge_formula_numbers默认为True,你也可以在 config.yaml 里关掉它做对照实验。同级的enable_merge_text_blocks(连字符断行合并)和enable_format_bullet_points(列表项补全)与公式合并算法并列,共同构成 GLM-OCR 的 Markdown 净化流水线,实现见 postprocess/result_formatter.py。
4️⃣ 合并之后:公式识别的完整闭环
合并算法是"最后一公里",它的前提是公式本身识别得准。GLM-OCR 对display_formula区域使用专门的公式识别提示词,能输出 LaTeX 格式的公式(化学结构、分式、矩阵均支持,样例见 examples/finetune);编号区域则走通用文本识别。识别、清洗、合并三步串起来,最终得到编号与公式天然绑定的干净 Markdown:
- 文档结构解析器可以直接按
$$...$$整块取出公式,\tag{}里的编号随手可查; - 论文引用"如式 (2.1) 所示"在转换后的文档中依然成立;
- 前端预览(如 apps/frontend 的 OCR 结果页)渲染公式时不再出现"编号飘走"的错位。
一句话总结:布局检测负责"看得准",公式编号合并算法负责"拼得对"——把检测模型拆开的公式与编号,用 LaTeX 原生的\tag{}机制重新缝合,是 GLM-OCR 输出质量从"能看"到"能用"的关键一步。
【免费下载链接】GLM-OCRGLM-OCR: Accurate × Fast × Comprehensive项目地址: https://gitcode.com/GitHub_Trending/gl/GLM-OCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考