文档解析与清洗:垃圾进,垃圾出
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。
一句话定义
文档解析把 PDF、扫描件、网页、Office 文档转成干净的带结构文本——它决定分块边界是否有意义、表格数字是否存活、页眉页脚噪音是否混入索引,是"垃圾进垃圾出"定律生效的第一站。
为什么重要
企业知识大多不以干净 Markdown 存在:扫描合同、双栏论文、带合并单元格的 Excel、聊天记录导出。解析丢一处,检索就永久缺一块证据——而且这种缺失是静默的(用户只会看到"模型答不上",不会知道是解析丢了)。解析质量的上限就是整个 RAG 系统的上限。
前置知识
kp-002(流水线位置)。
核心概念
- 文本层 vs 扫描层:PDF 有内嵌文本层的可直接抽取;纯扫描件必须 OCR(识别质量、版面分析、公式表格处理都是误差源)。
- 版面分析(layout analysis):识别标题、正文、表格、图片、页眉页脚、双栏顺序——PDF 的物理存储顺序 ≠ 阅读顺序,双栏文档直接顺序抽取会得到两栏交错的乱文。
- 表格抽取:目标是保留二维结构(Markdown 表 / HTML 表),而非拍平成一行文字——"营收 100"脱离表头就毫无意义。
- 结构保留:标题层级转 Markdown heading,为 kp-004 的结构感知分块提供边界信号。
- 清洗:去页眉页脚水印、去重复导航、规范化空白与编码、去 OCR 常见错字模式。
原理与机制
为什么 PDF 难:PDF 是排版指令集而非文档语义结构——"视觉上是一张表"在文件里可能是一堆绝对定位的文字行。因此 PDF 解析的本质是从渲染结果反推语义结构:主流方案(如版面检测模型 + 结构重建,或 miner/Unstructured/pymupdf 类工具组合)先做区域检测再分类(正文/表/图),表格区域走专门的表格结构识别。
处理策略分层(按投入递增):① 原生文本直接抽取(快、零成本,覆盖大头);② 版面感知解析(双栏/图文混排);③ OCR + 表格识别(扫描件,最贵最慢且误差最大)。工程要点是按文档类型路由,并对 OCR 结果做置信度标记,低置信片段降权或不入库。
清洗的红线:清洗不足则索引被页码、"第 X 页共 Y 页"、版权声明污染(这些内容高频出现,会大量命中无关查询);清洗过度则把"表 3-2"这类有价值的交叉引用信息抹掉。清洗规则必须带白名单意识。
图示
PDF(双栏+表格)
├─ 原生文本层? ──是──► 抽取 + 版面排序(先左栏后右栏)
└─ 否(扫描) ──► OCR ─► 版面分析 ─► 表格结构识别 ─► Markdown(带置信度)
输出: # 章节 / 正文段 / | 表格 | / [页眉已剔除]
实例或案例
- 财报 PDF:利润表被 naive 解析拍平成"项目金额项目金额…"的乱串,嵌入后无法命中"2023 年净利润"——必须表格结构化。
- 双栏学术论文顺序抽取导致两句不同栏的话拼接成病句,分块后语义崩坏。
- 内部 wiki 导出 HTML:导航菜单每页重复,检索时大量噪音命中——清洗去导航是第一刀。
常见误区
- 误区一:"解析就是提取纯文本"。丢掉结构与表格等于丢掉语义;标题层级和表格结构是下游分块与引用的生命线。
- 误区二:"OCR 置信度不看直接入库"。低置信错字(0 与 O、中文字形误识)会让该块永远无法被正确查询命中,且用户无从察觉;必须带置信度门限。
- 误区三:"一次性解析完就不管了"。文档源格式会变(新版 PDF 模板、新扫描仪),解析质量需要抽检监控,最好入库时保留解析质量标记。
与其他知识点的关系
自测题
- 为什么 PDF 的文本抽取顺序可能是错的?
答:PDF 存储的是排版指令与坐标而非逻辑结构,双栏/浮动元素的物理顺序不等于阅读顺序,需要版面分析重建。
- 表格为什么要保留二维结构而不是拍平?
答:单元格数值依赖行列表头才有语义("100"是哪个季度哪个指标),拍平后嵌入无法表达该关系,检索与生成都会失败。
- OCR 结果入库前应做什么?
答:按置信度过滤或降权、清洗常见错字、保留"来自扫描件"的元数据标记,避免低质块污染检索。
延伸阅读
- Unstructured / LlamaParse / MinerU 等解析工具文档。
- Zhong 等, "Image-based Table Recognition"(表格结构识别综述)。
- Adobe PDF 结构规范的背景介绍(理解"PDF 无语义"这一根源)。