开源PDF解析工具Marker深度解析

开源PDF解析工具Marker深度解析

检索增强生成(RAG)系统的第一步就是做 pdf 解析,从复杂多样的 pdf 中提取出干净准确的文本内容。现有的最优秀的开源工具有两个:Marker 和 MinerU。因为 Marker 是个人开发者做的,文档不完善,所以这里基于我个人的理解对它的代码进行解析。

深度学习模型

marker/models.py中可以看到,marker 用到了如下的深度学习模型:

def create_model_dict(device=None, dtype=None) -> dict:return {"layout_model": LayoutPredictor(device=device, dtype=dtype),"texify_model": TexifyPredictor(device=device, dtype=dtype),"recognition_model": RecognitionPredictor(device=device, dtype=dtype),"table_rec_model": TableRecPredictor(device=device, dtype=dtype),"detection_model": DetectionPredictor(device=device, dtype=dtype),"inline_detection_model": InlineDetectionPredictor(device=device, dtype=dtype),"ocr_error_model": OCRErrorPredictor(device=device, dtype=dtype)}

这些模型都来自surya,作者没有直接介绍这些模型的原理,但可推测

像检测相关的 DetectionPredictorInlineDetectionPredictor 可能用 Faster R - CNN、YOLO 系列等目标检测模型;

  • LayoutPredictor 或采用 Mask R - CNN 、LayoutLM 等进行布局分析;

  • OCRErrorPredictor 或许借助 RNN 变体或 BERT 类模型处理 OCR 错误;

  • RecognitionPredictor 可能使用 CRNN 等做字符识别;

  • TableRecPredictor 会用到基于 GNN 的模型处理表格;

  • TexifyPredictor 可能采用 Seq2Seq 或 Transformer - based 的 Seq2Seq 模型来生成 LaTeX 代码。

代码使用 PyTorch 框架,可指定设备和数据类型。

解析流程

因为其它数据类型(docx,pptx,xlsx)都可以转成pdf,所以 pdf 是 marker 处理的主要对象。从marker/converters/pdf.py可以看到处理pdf 的所有流程如下。marker 先通过以下流程,把pdf 解析为 document(抽象语法树),然后将document 渲染为json,html 或者markdown 格式。

default_processors: Tuple[BaseProcessor, ...] = (OrderProcessor,LineMergeProcessor,BlockquoteProcessor,CodeProcessor,DocumentTOCProcessor,EquationProcessor,FootnoteProcessor,IgnoreTextProcessor,LineNumbersProcessor,ListProcessor,PageHeaderProcessor,SectionHeaderProcessor,TableProcessor,LLMTableProcessor,LLMTableMergeProcessor,LLMFormProcessor,TextProcessor,LLMInlineMathLinesProcessor,LLMComplexRegionProcessor,LLMImageDescriptionProcessor,LLMEquationProcessor,LLMHandwritingProcessor,LLMMathBlockProcessor,ReferenceProcessor,DebugProcessor,)

通用格式处理

  1. OrderProcessor - 用于处理文档中元素的顺序,确保各部分内容按照正确的逻辑顺序排列,比如调整段落、列表项等的先后顺序。
  2. LineMergeProcessor - 对分割的行进行合并操作。在OCR处理或文档解析过程中,文本可能会被错误地分割成多行,该处理器会将相关的行合并成合理的段落或语句。
  3. LineNumbersProcessor - 处理文档中的行号信息。它可以识别、提取或添加行号,也可能对行号的格式和编号规则进行调整,以符合特定的输出要求。

特定元素处理

  1. BlockquoteProcessor - 专门处理文档中的块引用内容。它会识别块引用的起始和结束位置,对其进行格式化,例如添加特定的缩进或标记来区分块引用与普通文本。
  2. CodeProcessor - 处理代码块。会识别代码块的边界,对代码进行语法高亮处理(如果需要),并确保代码的格式在转换过程中保持正确,例如保留缩进、换行等。
  3. ListProcessor - 处理列表元素,包括有序列表和无序列表。它会识别列表项的格式,确保列表的编号或标记正确显示,并且处理列表嵌套等复杂情况。
  4. PageHeaderProcessor - 处理文档页面的页眉部分。可以识别页眉内容,对其进行提取、格式化或去除不必要的信息,以保证页眉内容在输出中正确显示。
  5. SectionHeaderProcessor - 处理文档中的章节标题。它会识别不同级别的章节标题,根据标题的层次结构进行相应的格式化,例如设置不同的字体大小、加粗等,以体现章节的主次关系。
  6. TableProcessor - 处理文档中的表格。会识别表格的结构,包括表头、表体、单元格等,对表格进行格式化,确保表格的布局和内容在转换后正确显示,可能还会处理表格的合并单元格等情况。

特定内容处理

  1. DocumentTOCProcessor - 生成文档的目录(TOC)。它会分析文档中的章节标题,根据标题的层次结构生成目录,并为每个目录项添加对应的页码或链接,方便读者快速定位文档内容。
  2. EquationProcessor - 处理文档中的数学公式。会识别公式的格式,可能会将公式转换为特定的表示形式,如LaTeX代码,以便在后续的渲染中正确显示数学内容。
  3. FootnoteProcessor - 处理文档中的脚注。它会识别脚注的引用标记和脚注内容,将脚注正确地放置在页面底部或文档末尾,并处理脚注与正文的关联。
  4. TextProcessor - 对普通文本进行处理,包括文本的清理、替换、大小写转换等操作,以确保文本的质量和一致性。
  5. ReferenceProcessor - 处理文档中的参考文献。它会识别参考文献的格式,对其进行整理和格式化,使其符合特定的引用规范,如APA、MLA等。
    基于大语言模型(LLM)的处理
  6. LLMTableProcessor - 利用大语言模型对表格进行处理。可以对表格内容进行语义分析、补充缺失信息、优化表格结构等,以提高表格处理的质量和智能化程度。
  7. LLMTableMergeProcessor - 使用大语言模型来处理表格合并的情况。当文档中有多个相关表格需要合并时,该处理器借助大语言模型的理解能力,合理地合并表格内容,确保合并后的表格逻辑清晰。
  8. LLMFormProcessor - 利用大语言模型处理文档中的表单。可以识别表单的字段、填写要求,甚至可以根据上下文对表单内容进行自动填充或验证。
  9. LLMInlineMathLinesProcessor - 借助大语言模型处理行内数学公式。它可以对行内数学公式进行更准确的识别和转换,提高公式处理的准确性和可读性。
  10. LLMComplexRegionProcessor - 处理文档中的复杂区域,这些区域可能包含多种类型的元素,如文本、图像、表格等。大语言模型可以帮助理解这些复杂区域的结构和语义,进行更合理的处理和转换。
  11. LLMImageDescriptionProcessor - 利用大语言模型为文档中的图像生成描述信息。可以根据图像的内容、上下文等生成准确的图像描述,提高文档的可访问性和信息完整性。
  12. LLMEquationProcessor - 结合大语言模型处理数学公式。与普通的 EquationProcessor 相比,它可以利用大语言模型的语义理解能力,对公式进行更深入的分析和处理,例如对公式进行解释、推导等。
  13. LLMHandwritingProcessor - 使用大语言模型处理手写内容。可以识别手写文字,将其转换为可编辑的文本,并对识别结果进行优化和纠错,提高手写内容处理的准确性。
  14. LLMMathBlockProcessor - 借助大语言模型处理独立的数学块。它可以对数学块进行更细致的分析和处理,确保数学块的内容和格式在转换后正确显示,同时可能会对数学块进行语义解释等操作。

调试相关

  1. DebugProcessor - 主要用于调试目的。它可以输出一些调试信息,帮助开发者检查文档处理过程中的中间结果、变量值等,以便发现和解决问题。 这些处理器共同作用,对PDF文档进行全面、细致的解析和处理,以实现将PDF转换为其他格式(如Markdown)的功能。

其它类型的文件处理方式:

  • 对于docx,marker使用mammoth库把docx转换成HTML,然后再用weasyprint库把HTML转成PDF。中间隔了一个HTML,效果很差,亲测不如用 wps 把docx 转pdf。

  • 对于pptx,使用python-pptx库解析pptx元素,然后转化成HTML,再用weasyprint 将 HTML 渲染为 PDF。

  • 对于xlsx,使用openpyxl库的 load_workbook 加载 XLSX 文件,将每个工作表转换为包含合并单元格处理的 HTML 表格。通过weasyprint 转成pdf。

Renderers

marker 提供了三种格式的输出:json、html、markdown,它们的代码都在marker/renderers。这三种格式包含的信息不是相同的,以下是分析:

  • 因为 document 最容易转化为 json(都是树结构可以直接转),所以 json 包含的信息最多(比如包含了caption 的分类结果,还有目标检测bbox 框),但因为过于复杂所以一般用不上。
  • html 是可视化效果最好的,尤其是表格,marker 对表格的解析非常惊艳,不仅文本精确识别,而且能识别出复杂的表结构(比如合并单元格),这些都能用 html 很好的渲染。
  • markdown 包含的信息量最少,但是胜在简单,在 RAG 任务中适合作为下游 LLM 模型的输入。注意markdown 是从html 转换过来的而不是document,所以一些复杂结构(比如表格)会有失真。

renderers 中的代码可读性不错,可以自己修改得到想要的输出。比如我就修改过 markdown 的输出,让它包含页码、bbox、table html 等信息。

总结

marker 是一个非常优秀的基于深度学习的 pdf 解析工具,它可以在大部分场景下得到完美的解析结果,代码可读性和拓展性也很不错,很难想象这是一个人独自开发出来的。

marker 项目地址:https://github.com/VikParuchuri/marker

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM子程序调用与返回

子程序(也叫过程、函数、方法)是一个能被调用和执行并返回到调用点那条指令的代码 段。 两个问题:如何将参数传递给子程序或从子程序中传递出来?怎么从子程序返回到调用点? 指令BSR Proc_A调用子程序Proc_A。 处理器将…

算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)

一、算力经济的历史脉络与范式转移 1.1 中心化算力市场的演进困境 传统算力市场以超算中心、云计算平台为核心载体,其运营模式呈现强中心化特征。中国移动构建的"四算融合"网络虽实现百万级服务器的智能调度,但动态资源分配仍受制于集中式控…

小结: 接口类型和路由优先级

网络接口类型 1. Bridge-if&#xff08;桥接接口&#xff09; 作用&#xff1a;用于桥接网络&#xff0c;将多个接口或VLAN连接为一个广播域&#xff0c;实现二层数据转发。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 将接口加入…

mysql一些事

一.联合查询/多表查询 联合查询关键在于笛卡尔积的过程 笛卡尔坐标积的排列组合 首先它会将两个表用排列组合的方式进行排列组合。 表一 表二 进行排列组合 我们发现它的行是 两个表的行相乘&#xff0c;列是两表的列相加。 我们所看到的数据有合理的也有不合理的我们接下…

【工具】Open WebUI:本地化部署的AI交互平台

文章目录 一、Open WebUI 简介二、核心功能详解1. 多模型与多模态支持2. 本地RAG与文档集成3. 开发与定制化能力4. 安全与权限管理5. 用户体验优化 三、安装与部署指南1. 快速安装方式2. 高级配置3. 常见问题 四、实际应用场景1. 个人隐私助手2. 企业知识库3. 学术研究4. 创意工…

AutoGPT

一、简介 是一个基于openAI研发的GPT4模型的一个开源应用程序&#xff0c;根据用户指定的目标&#xff0c;自动生成所需的提示&#xff0c;并且执行需要多个步骤才能完成的项目&#xff0c;整个过程不需要人类干预和指导&#xff08;无监督学习&#xff09;&#xff0c;生成式…

[C++] 小游戏 决战苍穹

大家好&#xff0c;各位看到这个标题&#xff0c;斗破苍穹什么时候改叫决战苍穹了&#xff1f;其实&#xff0c;因为版权等一系列问题&#xff0c;斗破苍穹正式改名为决战苍穹&#xff0c;这个版本主要更新内容为解决了皇冠竞技场太过影响游戏平衡&#xff0c;并且提高了一些装…

Spring的数据库编程

本内容采用最新SpringBoot3框架版本,视频观看地址:B站视频播放 1. JdbcTemplate概述 针对数据库操作,Spring框架提供了JdbcTemplate类,JdbcTemplate是一个模板类,Spring JDBC中的更高层次的抽象类均在JdbcTemplate模板类的基础上创建。 JdbcTemplate类提供了操作数据库…

Debezium MySqlValueConverters详解

Debezium MySqlValueConverters详解 1. 类的作用与功能 1.1 核心作用 MySqlValueConverters是Debezium中负责MySQL数据类型转换的核心类,主要功能包括: 数据类型映射:将MySQL的数据类型映射到Kafka Connect的Schema类型值转换:将MySQL的原始值转换为Kafka Connect可用的…

进程与线程:06 操作系统之“树”

操作系统核心知识回顾与思维训练 在之前的学习中&#xff0c;我们深入探讨了CPU管理相关内容。 CPU管理内容回顾&#xff1a;我们学习了CPU直观管理方法&#xff0c;了解如何让简单程序执行&#xff0c;分析了CPU效率低下的原因及处理办法&#xff0c;即实现多程序执行。接着…

Android Studio Profiler

1.我们想要查看自己方法的调用链&#xff0c;或者分析方法耗时的情况&#xff0c;可以选择Android Studio的Profiler&#xff0c;比较方便快捷。如下&#xff1a; 2.基本的面板参数讲解&#xff1a; 3.可以通过搜索&#xff0c;查看对应的方法&#xff0c;以及方法的调用链…

33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?

在Visual Studio&#xff08;VS&#xff09;中遇到提示“以下文件中的行尾不一致。是否将行尾标准化&#xff1f;”时&#xff0c;意味着当前打开或正在编辑的文件内部存在行尾符&#xff08;EOL&#xff0c;End-Of-Line&#xff09;格式不统一的情况。以下是详细解释和应对建议…

头歌实验 库、表、数据的创建管理与备份迁移

第1关&#xff1a;创建db_ebank数据库 drop database IF EXISTS db_ebank;/********** Begin **********/ create database db_ebank; /********** End **********/show databases; 第2关&#xff1a;创建数据表并设置约束 1.任务要求 在 db_ebank 数据库中创建相应8个数据…

同城跑腿小程序帮取帮送接单抢单预约取件智能派单同城配送全开源运营版源码优创

一、源码描述 这是一套同城跑腿小程序&#xff0c;基于FastadminUniapp框架&#xff0c;全开源无加密&#xff0c;可私有化部署&#xff0c;包含用户端、骑手端和运营端&#xff08;后端&#xff09;&#xff0c;支持帮取/帮送模式&#xff0c;支持一键接单/抢单&#xff0c;主…

利用无事务方式插入数据库解决并发插入问题

一、背景 由于项目中同一个网元&#xff0c;可能会被多个不同用户操作&#xff0c;而且操作大部分都是以异步子任务形式进行执行&#xff0c;这样就会带来并发写数据问题&#xff0c;本文通过利用无事务方式插入数据库解决并发插入问题&#xff0c;算是解决问题的一种思路&…

Nuxt3还能用吗?

Nuxt3还能用吗&#xff1f; 前一段时间&#xff0c;我完成了整个产品&#xff0c;从Nuxt到Next的迁移&#xff0c;因为面临了一些在框架层面就无法解决的问题。 payload json化 在所有的的Nuxt中&#xff0c;我们都能看到有这样一个东西。 其实有这个东西也很正常&#xff0…

Dify 获取天气数据并以echarts图表显示

Dify 获取天气数据并以echarts图表显示 1. 创建一个 Chatflow2. 创建一个 HTTP 请求节点3. 创建一个代码执行节点4. 创建一个直接回复节点5. 发布并预览 1. 创建一个 Chatflow 2. 创建一个 HTTP 请求节点 请求地址&#xff1a;https://weather.cma.cn/api/climate?stationid5…

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 02.OpenGL图像管线

1. OpenGL图像管线 OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的、功能强大的图形渲染API&#xff0c;用于开发2D和3D图形应用程序。它由Khronos Group维护&#xff0c;广泛应用于游戏开发、图形设计、虚拟现实等领域。 1.0.1. OpenGL的特点&#xff…

Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62

Linux_基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.01 适用环境: Centos7 文档说明 本文…

算法基础学习|03二分

一、思路 &#xff08;1&#xff09;mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 &#xff08;2&#xff09;mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何选择模…