# Devlog · 横线界定（booktabs）表格检测 — 四指标齐升

> 日期：2026-06-09 · 类型：质量改进（N4 续）· 数据驱动（compare_docling.py）· 状态：✅ 完成
> 结果：表格召回 3/6→**5/6**、TEDS 0.028→**0.101**、MHS 0.514→**0.603**、NID 0.626→**0.640**；零回归

---

## 1. 思路（用户选向）

学术 PDF 表格多为 **booktabs**：只有顶/中/底**横线**、无竖线——故有框检测（要闭合矩形）漏掉。但**宽横线本身就确认了表格区域**（散文/图无 ≥2 条堆叠宽横线夹表格文本），所以可**放松内容门控、只在确认区内推断列**——低误判。

## 2. 实现

`core::table::detect_ruled_tables`：
1. 取 `is_h` 且跨度 ≥80pt 的**宽横线**；
2. 按 x 端点相近 + 垂直邻近聚成组（一张表的若干横线）；
3. ≥2 条横线的组 → 区域 = 横线 y 上下界 × x 左右界（跳过已检出的有框区）；
4. 区内文本 `build_rows` → **稳定列推断**（聚类行内 cell 左缘，保留出现于 ≥半数行的列，过滤多值单元格造成的杂散列）；
5. ≥2 列 → 建表（单元格文本复用 `reconstruct_lines`）。

集成顺序：**有框 → 横线 → 无框**（依次互斥）。

## 3. 量化（compare_docling.py）

| 指标 | 前 | 后 |
|---|---|---|
| 表格检出召回 | 3/6 | **5/6** |
| 含表子集 TEDS | 0.028 | **0.101**（3.6×）|
| MHS（10 LTR）| 0.514 | **0.603** |
| NID（10 LTR）| 0.626 | **0.640** |

- 2305-pg9 booktabs 表 **0→1 检出**。1901/2408 检出真实网络结构表 + 实验结果表。
- **连带提 MHS/NID**：表格被正确识别后，表头（"Method"/"IIIT5K" 等全大写短串）不再被误判为标题、表内文本不再混入正文 → 标题精度与阅读顺序双升。

## 4. 验证

- **零误判**：lorem 0 表；1901 正文仍散文。bialetti 有框表仍 2（无回归）。
- 三件套文本不退化；确定性 15/15；clippy 零 warning；单测 **47**（core 29，+2 横线表）。

## 5. 已知限制

- **结构仍非精确**：多值单元格（`0.965 0.969`）合并/拆分与 Docling 不同、多级表头未建模、合并单元格未做——TEDS 0.101 远未到神经水平（Docling TableFormer 领域）。
- 列推断对极密表仍可能少列；宽横线阈值 80pt 为经验值。
- 真正复杂表结构仍属 N3 外接模型。

## 6. 本会话质量总账

| 改动 | 指标 |
|---|---|
| 无框表格 | 召回 1/6→3/6 |
| 词距 0.25→0.15em | NID 0.601→0.626 |
| 标题 编号/全大写/字重 | MHS 0.265→0.514 |
| **横线 booktabs 表格** | 召回 **3/6→5/6**、TEDS **0.028→0.101**、MHS→**0.603**、NID→**0.640** |

born-digital 与 Docling 一致度：NID **0.60→0.64**、MHS **0.27→0.60**、表格召回 **1/6→5/6**、TEDS **0.006→0.101**。速度始终领先。
