Marker:高效精准的 PDF 读取转换工具
PDF 作为一种广泛使用的文件格式,承载着大量的信息和数据。然而,PDF 格式的不易编辑性,使得从中提取文本并不容易,这也使得大量的 PDF 文档难以参与到数据采集中,存在较大的数据真空。Marker 旨在提供一个高效精准的 PDF 文本提取和转换工具,使得 PDF 更容易参与到数据的流通和训练中来。
简介
Marker 是一个快速准确地把 PDF 和图片转换为 Markdown, JSON 和 HTML 的工具,代码仓库位于
https://github.com/VikParuchuri/marker 。项目使用 Python 语言编写,支持各种不同的语言,能格式化包括表格、表单、公式、链接、参考文献及代码块;能提取图像并保存至 Markdown 格式文档,能够去除页眉、页脚和其他冗余部分;可以轻松通过自定义格式与逻辑进行扩展;可选择借助大语言模型(LLM)提高准确性,并能在 GPU、CPU 或 MPS 上工作。
实现上,Marker 是一条串联深度学习模型的管道:
- 提取文本,必要时进行 OCR 识别(采用启发式算法、Surya 工具)
- 检测页面布局并确定阅读顺序(使用 Surya 工具)
- 清理每个文本块并进行格式调整(采用启发式算法、Texify 工具、Surya 工具)
- 可选择使用 LLM 大语言模型提升质量
- 合并文本块并对完整文本进行后期处理
使用
Marker 需要 Python 3.10+ 和 Pytorch,并将利用 GPU 进行模型运行。安装 Marker-PDF 库:
pip install marker-pdf
安装完成后,首先进行环境的配置。Torch 会自动检测运行的设备,也可以直接指定设备,如 TORCH_DEVICE=cuda。某些 PDF 有一些难以提取的文本,可以通过 force_ocr 强制使用 OCR 识别。
Marker 也提供了 streamlit App 版本,可以交互式地进行使用,使用以下命令安装并启动:
pip install streamlit
marker_gui
Marker 提供了直接的命令行工具进行转换,可以直接转换一个单独的文件:
marker_single /path/to/file.pdf
命令提供了包括 --output_dir,--use_llm,--force_ocr,--languages 等命令行参数,可以提供不同的功能和配置。
Marker 也能同时转换多个文件:
marker /path/to/input/folder --workers 4
可以通过 --workers 参数指定进行转换的工作者数量,可以利用更多的 CPU / GPU 资源。
除了命令行之外,Marker 还可用作为 Python 库使用,一个简单的例子如下:
from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.output import text_from_rendered
converter = PdfConverter(
artifact_dict=create_model_dict(),
)
rendered = converter("FILEPATH")
text, _, images = text_from_rendered(rendered)
通过 PdfConverter 提供主要的 PDF 转换提取功能。rendered 根据输出的格式不同而有不同的类型和属性,Markdown 格式的拥有属性包括 markdown, metadata 和 images,而 JSON 格式的则拥有 children, block_type 和 metadata。
Marker 还可以通过 ConfigParser 传递个性化的配置:
from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.config.parser import ConfigParser
config = {
"output_format": "json",
"ADDITIONAL_KEY": "VALUE"
}
config_parser = ConfigParser(config)
converter = PdfConverter(
config=config_parser.generate_config_dict(),
artifact_dict=create_model_dict(),
processor_list=config_parser.get_processors(),
renderer=config_parser.get_renderer()
)
rendered = converter("FILEPATH")
解析的每个文档中,包含1个或多个页,每个叶又包含多个块。开发者可以对这些块进行操作:
from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.schema import BlockTypes
converter = PdfConverter(
artifact_dict=create_model_dict(),
)
document = converter.build_document("FILEPATH")
forms = document.contained_blocks((BlockTypes.Form,))
针对一些特别的元素,可以使用专有的转换器进行提取,如针对表格,可以使用 TableConverter:
from marker.converters.table import TableConverter
from marker.models import create_model_dict
from marker.output import text_from_rendered
converter = TableConverter(
artifact_dict=create_model_dict(),
)
rendered = converter("FILEPATH")
text, _, images = text_from_rendered(rendered)
总结
Marker 作为一款高效精准的 PDF 转 Markdown 与 JSON 工具,为处理PDF文件中的数据和信息提供了极大的便利。通过深度学习模型的精准识别和转换,Marker不仅提高了转换速度,还确保了转换结果的准确性。
Marker 的应用方向非常广泛,可以用于学术研究、数据分析、文档编辑等多个领域。同时,Marker 作为一个开源项目,也欢迎更多的开发者加入进来,共同完善和发展这一工具。相信在不久的将来,Marker 将成为处理 PDF 文件不可或缺的重要工具之一。