因为我们之前讲过mineru他默认是不支持多级标题的,所以文档转换成markdown之后,就都会变成1级标题。
虽然官方给出过一个解决方案:https://github.com/opendatalab/MinerU/discussions/3135
但是我实测下来他效果并不好,因为他是通过模型来判断标题的字符大小来决定标题层级的,效果并不好。我实测之后他没有都识别成1级标题了,但是都给我识别成2级标题了。。。。
所以我们需要自己想办法解决。我们遇到过类似的情况,解决办法给大家分享下。
1、如果pdf中原来带目录的话,我们可以基于他的目录做解析
2、如果pdf中不带目录,但是带书签(有些文档把书签当目录用),那么我可就可以基于书签做解析。
比如我们示例中用的智界R7的用户手册,他就是后面这种,文档打开是这样的:
可以看到他的书签就和他的标题几乎是对应的,并且也有层级结构。所以我们没有借助它来做。
首先,我们需要先导出一份书签,实测wps就可以,但是需要windows版才行,mac不支持。
(下图来自官方文档)
按照如图操作,导出标签。如下:
这里面有标题结构。
然后通过代码脚本,处理我们使用mineru基于pdf处理过的md文件:
#!/usr/bin/env python3
## -*- coding: utf-8 -*-
""
基于 XML 书签定义的目录结构,处理 Markdown 文件中的一级标题:
规则:
1.
2.
例如 INDENT
3.
""
from
import
import
import
import
import
from
from
def
解析 XML 书签文件,返回
若同一标题在书签中以不同 INDENT 多次出现,则选取出现次数最多的 INDENT;
若并列,则取最小(即更靠近顶层)的等级。
tree
root
name_indents
name
indent_str
indent
name_indents
title_level
counter
most_common_count
candidates
title_level
## 匹配一级标题:以 "# " 开头,且不是 "## "、"### " 等
H1_PATTERN
def
md_path
title_level
output_path
)
处理 Markdown 文件,按规则修改一级标题。
返回
lines
total_h1
matched
demoted
new_lines
in_code_block
code_fence_re
in_code_block
new_lines
new_lines
total_h1
title
level
level
new_line
new_lines
matched
new_lines
demoted
new_lines
f
def
parser
description
default_dir
parser
default
parser
default
default_dir
parser
default
args
out_path
base
out_path
title_level
total_h1
if
运行后,得到一个新的md文件,其中的标题就是有多级标题的了:
https://nfturbo-file.oss-cn-hangzhou.aliyuncs.com/llm/MinerU_markdown_r7-product-manual-20250123_2028781865782407168.processed.md
效果如下:
