阅读顺序重建
概述
阅读顺序重建(Reading Order Reconstruction)是从 PDF 页面元素的空间坐标中还原人类阅读序列的算法,解决多栏布局、脚注、跨栏元素、图注关联等复杂排版下的文本顺序问题。
关键内容
问题定义
PDF 中的字符和元素仅带坐标信息,没有"先读什么后读什么"的语义。布局检测输出的内容块列表是空间无序的。阅读顺序重建需要解决四大挑战:
- 双栏/多栏论文:简单按 Y 坐标排序会导致左栏第一段跳到右栏第一段,内容完全混乱
- 跨栏元素(Span Elements):大图片、宽表格、公式、章节标题横跨多栏,打断分栏结构
- 脚注(Footnotes):物理位置在页面底部,但语义上属于正文对应位置
- 图/表的图注关系:图注物理上在图下方,但在 Markdown 中应紧跟图的引用位置
在 MinerU 流水线中的位置
阅读顺序重建是 MinerU 七层流水线的第六层,承接内容块分类与属性标注,为最终的 Markdown/JSON 生成提供有序的内容块序列(sorted_blocks)。
MinerU 三层架构算法
MinerU 的阅读顺序排序分为三个子问题:
1. 分区(Zoning):把页面划分为若干阅读区域
↓
2. 区内排序(Intra-zone Ordering):区域内的块按列排序
↓
3. 区间排序(Inter-zone Ordering):多个区域按全局逻辑排序
子问题一:分区算法
水平分割线检测:寻找跨越页面大部分宽度(> page_width × 0.7)的跨栏元素,这些块将页面分割成多个水平带(Bands)。
构建水平带(Bands):用分割线的 Y 边界划定带的范围,将普通块分配到对应的水平带内。
带内分栏检测:对每个水平带,基于 X 坐标中心分布检测是否有分栏结构。若左右两侧都有≥2 个块,判断为双栏;否则为单栏。
子问题二:列内排序
在每一列内,按 Y 坐标从小到大(从上到下)排序是基本规则。细节处理包括:
- 相邻行合并判断:同一列内,若两个 text 块的间距 < 1.5 倍行高,应合并为一个段落
- 图注与图的关联:图注(
figure_caption)应紧跟对应的图(figure),通过找 Y 方向距离最近的图进行关联,并从独立列表中移除
子问题三:全局区间排序
把所有水平带按 Y 坐标排序,每个带内的内容按列顺序展开(左列→右列)。分割线块(跨栏元素)在对应 Y 位置插入,与普通带交错排列。
多栏布局处理
部分文档(如报纸、宣传册)有三栏甚至四栏布局。MinerU 通过 KMeans 聚类算法处理: - 提取所有块的 X 中心坐标 - 尝试 1 到 max_columns 列,用惯性(inertia)判断最佳列数 - 按聚类中心 X 坐标从左到右排序,得到列顺序
脚注处理策略
脚注在 MinerU 中被降级处理:
1. DocLayout-YOLO 把脚注区域标记为 text(字号较小,Y 坐标靠下)
2. 通过字号检测识别脚注:字号比正文小 30% 以上 + 位于页面下 10% 区域
3. 脚注统一放到页面末尾,加 --- 分隔符
可视化验证
MinerU 提供阅读顺序可视化工具,用带编号的箭头显示内容块的阅读序列,在调试复杂布局(如混合单双栏的论文)时极其有用。
常见失败案例
| 失败场景 | 原因 | 解法 |
|---|---|---|
| 双栏内容混排 | 分栏检测阈值不当 | 调整 column_threshold |
| 图注被提前 | 图注与图的 Y 距离过大 | 放宽图注关联搜索范围 |
| 页眉混入正文 | 页眉未被正确标记 | 加强页眉/页脚 Y 位置过滤 |
| 跨页表格断裂 | 跨页内容无法关联 | 目前仅单页内处理(已知局限) |
| 旋转页面 | 部分扫描件有旋转 | 页面级旋转矫正(预处理) |
与传统工具的对比
传统工具(pypdf、pdfminer)直接按字符坐标排序,多栏内容完全混乱。MinerU 通过布局检测 + 分栏分析 + 阅读顺序算法,重建正确的阅读序列。
来源
- raw/assets/MinerU/minerU_01_architecture.md — MinerU 深度解析系列 · 第一篇:整体架构全景
- raw/assets/MinerU/minerU_07_reading_order.md — MinerU 深度解析系列 · 第七篇:阅读顺序排序算法
相关
- MinerU — 第六层流水线
- PDF解析 — 所属问题域
- 文档布局检测 — 前置环节
- PDF文档解析流水线 — 所属流水线
- DocLayout-YOLO — 布局检测模型,提供内容块输入
- KMeans — 多栏聚类算法