MinerU 解析优化总结文档

46 阅读4分钟

MinerU 解析优化总结文档

1. 问题背景

在利用 MinerU (Magic-PDF) 解析包含代码截图和复杂排版的 PDF 文件时,遇到了以下两个主要问题,影响了最终 Markdown 输出的可用性:

  1. 图片未OCR解析

    • 现象:PDF 中的截图(如代码片段、命令行截图)被识别为 Image 块,直接保留了图片引用,而没有提取其中的文字内容。
    • 需求:用户希望将这些图片内容转换为可编辑的 Markdown 文本。
  2. OCR 幻觉 (Hallucination)

    • 现象:在 test.md 的特定行(如第 11 行)和 content_list.json 中,出现了大量无意义的英文单词组合(例如 "rhizosphere ohmic rolls..."),通常跟在正常文本之后或出现在空白区域。
    • 原因:OCR 模型在处理低对比度背景、噪点或特定纹理时,错误地将其“脑补”为文字。

2. 解决方案

针对上述问题,我们对核心解析逻辑 magic_pdf/pdf_parse_union_core_v2.py 进行了定制化修改。

2.1 强制图片/表格转文字

为了从被识别为图像的区域提取文字,我们修改了块处理逻辑:

  • 策略调整:在遍历页面块(Blocks)时,不再忽略 imagetable 类型的块。
  • 强制提取:对这些块调用 txt_spans_extract_v2 函数,利用 OCR 引擎强制识别其中的文本。
  • 类型转换:将识别到的内容封装为文本 Span,使其能进入后续的 Markdown 生成流程。

2.2 幻觉文本清理 (Anti-Hallucination)

为了自动识别并移除乱码,我们实现了一套基于规则的过滤机制。

A. 垃圾文本识别算法 (is_garbage)

我们定义了一个 is_garbage(text_segment) 函数,基于统计特征识别乱码:

  1. 长度阈值:忽略过短的文本(< 50 字符),避免误伤短标题。
  2. 非ASCII过滤:如果包含大量中文字符,直接放行(幻觉通常表现为英文)。
  3. 符号密度检测
    • 正常文本(尤其是代码或技术文档)通常包含标点符号(., ,, (, ), :, 等)。
    • 特征:幻觉文本通常是由纯字母组成的单词长串,符号密度极低(< 2%)。
    • 规则:如果文本很长且几乎没有标点符号,标记为垃圾文本。
B. 后处理清理循环

在生成最终结果前,增加了一个清理遍历:

  1. 全量检查:检查所有 texttitle 块中的 Span。
  2. 整体移除:如果整个 Span 被判定为垃圾文本,将其内容置空。
  3. 截断清理:针对 $ 符号后跟随乱码的情况(观察到的特定模式),分割字符串并独立检查后半部分。如果后半部分是垃圾文本,则将其截断,保留前半部分的有效内容。

3. 修改文件清单

  • 核心逻辑文件: mineru/.venv/Lib/site-packages/magic_pdf/pdf_parse_union_core_v2.py
    • 新增 is_garbageis_code_block 函数。
    • 修改 pdf_parse_union 函数,增加了图片OCR逻辑、幻觉清理循环及代码块类型转换。
  • Markdown生成逻辑: mineru/.venv/Lib/site-packages/magic_pdf/dict2md/ocr_mkcontent.py
    • 修改 ocr_mk_markdown_with_para_core_v2 函数,支持 code 类型块的 Markdown 格式化(添加代码块包裹)。
  • 辅助脚本: run_pipeline.py
    • 用于执行解析任务的入口脚本。

4. 结果验证

运行解析命令:

python run_pipeline.py --input data/test.pdf

检查输出文件 output/test/auto/test.md

  • 之前:包含大量 "excludingigroupitismile..." 等乱码。
  • 现在:乱码已被清除,保留了 "1.全局安装指定版本..." 等有效技术内容。

5. 建议

如果后续遇到类似问题,可以调整 is_garbage 中的阈值(如符号密度阈值 0.02 或长度阈值 50),以适应不同文档的特征。

6. 效果示例

为了验证修复效果,我们使用了一张包含代码和文本的测试图片进行转换和解析。

测试源文件: data/test.png (转换为 data/test.pdf 后进行解析)

test.png

优化效果说明:

  1. 图片转文字: 源图片中的 PyTorch 安装命令原本被 MinerU 忽略或仅作为图片保留。经过修改后,现在被成功 OCR 识别为可编辑文本。
  2. 代码块格式化: 识别到的 pip install 等命令,现在被自动包裹在 Markdown 代码块中,例如:
    pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f download.pytorch.org/whl/cu113/t…
  3. 幻觉消除: 解析过程中产生的无意义长串乱码(如 rhizosphere...)已被自动检测并移除,确保文档整洁。