MinerU 解析优化总结文档
1. 问题背景
在利用 MinerU (Magic-PDF) 解析包含代码截图和复杂排版的 PDF 文件时,遇到了以下两个主要问题,影响了最终 Markdown 输出的可用性:
-
图片未OCR解析:
- 现象:PDF 中的截图(如代码片段、命令行截图)被识别为
Image块,直接保留了图片引用,而没有提取其中的文字内容。 - 需求:用户希望将这些图片内容转换为可编辑的 Markdown 文本。
- 现象:PDF 中的截图(如代码片段、命令行截图)被识别为
-
OCR 幻觉 (Hallucination):
- 现象:在
test.md的特定行(如第 11 行)和content_list.json中,出现了大量无意义的英文单词组合(例如 "rhizosphere ohmic rolls..."),通常跟在正常文本之后或出现在空白区域。 - 原因:OCR 模型在处理低对比度背景、噪点或特定纹理时,错误地将其“脑补”为文字。
- 现象:在
2. 解决方案
针对上述问题,我们对核心解析逻辑 magic_pdf/pdf_parse_union_core_v2.py 进行了定制化修改。
2.1 强制图片/表格转文字
为了从被识别为图像的区域提取文字,我们修改了块处理逻辑:
- 策略调整:在遍历页面块(Blocks)时,不再忽略
image和table类型的块。 - 强制提取:对这些块调用
txt_spans_extract_v2函数,利用 OCR 引擎强制识别其中的文本。 - 类型转换:将识别到的内容封装为文本 Span,使其能进入后续的 Markdown 生成流程。
2.2 幻觉文本清理 (Anti-Hallucination)
为了自动识别并移除乱码,我们实现了一套基于规则的过滤机制。
A. 垃圾文本识别算法 (is_garbage)
我们定义了一个 is_garbage(text_segment) 函数,基于统计特征识别乱码:
- 长度阈值:忽略过短的文本(< 50 字符),避免误伤短标题。
- 非ASCII过滤:如果包含大量中文字符,直接放行(幻觉通常表现为英文)。
- 符号密度检测:
- 正常文本(尤其是代码或技术文档)通常包含标点符号(
.,,,(,),:, 等)。 - 特征:幻觉文本通常是由纯字母组成的单词长串,符号密度极低(< 2%)。
- 规则:如果文本很长且几乎没有标点符号,标记为垃圾文本。
- 正常文本(尤其是代码或技术文档)通常包含标点符号(
B. 后处理清理循环
在生成最终结果前,增加了一个清理遍历:
- 全量检查:检查所有
text和title块中的 Span。 - 整体移除:如果整个 Span 被判定为垃圾文本,将其内容置空。
- 截断清理:针对
$符号后跟随乱码的情况(观察到的特定模式),分割字符串并独立检查后半部分。如果后半部分是垃圾文本,则将其截断,保留前半部分的有效内容。
3. 修改文件清单
- 核心逻辑文件:
mineru/.venv/Lib/site-packages/magic_pdf/pdf_parse_union_core_v2.py- 新增
is_garbage和is_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 后进行解析)
优化效果说明:
- 图片转文字: 源图片中的 PyTorch 安装命令原本被 MinerU 忽略或仅作为图片保留。经过修改后,现在被成功 OCR 识别为可编辑文本。
- 代码块格式化: 识别到的
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… - 幻觉消除: 解析过程中产生的无意义长串乱码(如
rhizosphere...)已被自动检测并移除,确保文档整洁。