PyMuPDF4LLM : 提取 PDF 数据的终结者

news/2025/1/20 7:54:19/文章来源:https://www.cnblogs.com/o-O-oO/p/18569140

你知道处理 PDF 文件时会遇到什么,尤其是那些包含复杂研究内容或者有表格、图像和额外信息的文档。对于 AI 领域的人,特别是那些在调整大型语言模型(LLM)或构建知识检索系统(比如 RAG)的人来说,提取正确的数据非常重要。然而,老实说,并不是所有的 PDF 提取工具都能做到这一点。

在我使用过的一些数据提取工具中,很多工具都“差不多”能完成任务,但总是缺少一些关键功能。要么它们无法很好地保持内容的结构,要么在提取复杂的表格和图像时表现不佳。直到我发现了 PyMuPDF4LLM,这款工具迅速成为我处理所有 PDF 文件的首选。接下来,让我们深入看看为什么 PyMuPDF4LLM 是一款如此出色的产品。

我们面临的 PDF 问题

想象一下,你正在进行一个项目,需要微调 LLM 以完成特定的任务,比如处理法律文件或科学论文。你需要在保持内容结构的同时提取文本、表格,并获取高质量的图像用于模型训练。听起来简单吧?其实并不是。

使用大多数 PDF 工具时,你要么得到的文本完全没有上下文,要么得到的图像质量太差,无法使用。更糟糕的是,有些工具会完全忽略表格或弄乱文本的排列。如果你运气好,可能会得到一些不错的文本输出,但图像和表格对于训练更全面的模型来说是至关重要的,那该怎么办呢?

这就是 PyMuPDF4LLM 的用武之地。它灵活且快速,几乎可以处理所有的数据提取任务。无论你是在构建基于 LLM 的应用,还是只想准备数据进行微调,这个工具都能满足你的需求。

为什么 PyMuPDF4LLM 如此适合 LLM 任务

多功能 Markdown 提取:无论你是提取基本文本还是对其进行结构化以进行微调,PyMuPDF4LLM 都能以易于阅读的 Markdown 格式提供所有内容。它快速、高效,并确保所有内容(文本、图像、表格和元数据)都以 LLM 可以直接使用的格式捕获。

应用灵活性:PyMuPDF4LLM 不仅适用于文本提取。你可以按页提取数据,将其保存为 RAG 任务所需的格式,或直接将其导入 LlamaIndex 等框架(用于嵌入和文档搜索)。其优点在于灵活性。

全面提取:此工具不仅可以抓取纯文本。它还提供图像提取、逐字分块、表格提取等功能。当你在各种复杂的应用程序中处理 PDF(从知识库创建到情感分析)时,这种粒度非常宝贵。

PyMuPDF4LLM 实际操作:精确提取数据

让我向你介绍一些我在自己的工作中使用 PyMuPDF4LLM 的真实示例,从基本的文本提取到更复杂的用例,如分块、表格提取等。该工具的多功能性确实令人印象深刻,使其成为许多与 LLM 相关的任务的最佳选择。

安装 PyMuPDF4LLM:

!pip install pymupdf4llm

用例 1:基本 Markdown 提取

这个很简单:你有一个 PDF,只想以干净、Markdown 友好的格式获取内容。PyMuPDF4LLM 可以提取文本,包括标题、列表和其他格式,使其易于使用。

import pymupdf4llm 
# 将 PDF 内容提取为 Markdown
md_text = pymupdf4llm.to_markdown( "input.pdf" ) 
print (md_text[: 500 ])   # 打印前 500 个字符

在此示例中,我使用 PyMuPDF4LLM 将研究论文的内容提取为 Markdown 格式。为什么选择 Markdown?它是微调模型的理想选择,因为它保留了结构和格式,这对于从 LLM 生成连贯的响应至关重要。

用例 2:提取特定页面

有时你只需要文档的一部分 — 可能只是用于训练的特定部分。使用 PyMuPDF4LLM,你可以精确定位要提取的页面,从而节省时间和资源。


import pymupdf4llm # 仅提取第 10 和 11 页
md_text = pymupdf4llm.to_markdown("bengio03a.pdf", pages=[10 , 11]) 
print (md_text[: 500 ])   # 打印前 500 个字符

此功能在处理大量文档时特别有用。例如,提取特定章节或部分可以轻松仅针对最相关的信息训练 LLM。
用例 3:保存 Markdown 到文件

提取数据后,PyMuPDF4LLM 能够将其保存为易于重新访问或共享的格式 。

import pymupdf4llm
import pathlib
md_text = pymupdf4llm.to_markdown("bengio03a.pdf")
pathlib.Path("output.md").write_bytes(md_text.encode())
print("Markdown saved to output.md")

将提取的数据存储在 Markdown 中便于协作或审阅,尤其是在准备 LLM 微调数据时。保存的灵活性使其非常适合逐步构建数据集。
用例 4:将数据提取为 LlamaIndex 文档

LLM 工作中比较棘手的任务之一是将 PDF 转换为与 LlamaIndex(以前称为 GPT Index)兼容的文档格式。PyMuPDF4LLM 简化了该过程。

import pymupdf4llmllama_reader = pymupdf4llm.LlamaMarkdownReader()
llama_docs = llama_reader.load_data("bengio03a.pdf")
print(f"Number of LlamaIndex documents: {len(llama_docs)}")
print(f"Content of first document: {llama_docs[0].text[:500]}")

无论你使用这些文档进行嵌入、搜索还是任何基于知识的任务,PyMuPDF4LLM 都能完成繁重的工作,确保数据结构化且易于查询。
用例 5:图像提取

提取图像和文本经常被忽视,但非常重要,尤其是对于包含图形、图表或图表的文档。
PyMuPDF4LLM 可以无缝处理它。

md_text_images = pymupdf4llm.to_markdown(doc="bengio03a.pdf",pages=[1, 11],page_chunks=True,write_images=True,image_path="images",image_format="jpg",dpi=200)
print(md_text_images[0]['images'])  #  从第一个块打印图像信息

当你处理包含大量视觉数据的技术文档或报告时,此功能非常实用。提取的图像质量非常重要,即使对于高分辨率图像也效果很好。
用例 6:使用元数据分块

对于微调任务,将 PDF 分解为具有元数据的可管理块至关重要。PyMuPDF4LLM 可让你高效地完成此操作。

md_text_chunks = pymupdf4llm.to_markdown(doc= "bengio03a.pdf" , pages=[ 0 , 1 , 2 ], page_chunks= True ) 
print (md_text_chunks[ 0 ])   # 打印第一个块

这个用例非常适合为 LLM 准备数据,其中使用元数据正确分块的文本可以显著提高模型性能。
用例 7:逐词提取

有时,你需要对提取的文本进行更多控制,尤其是对于需要精确的词级数据的情感分析或文本生成等任务。

md_text_words = pymupdf4llm.to_markdown(doc= "bengio03a.pdf" , pages=[ 1 , 2 ], page_chunks= True , write_images= True , image_path= "images" , image_format= "jpg" , dpi= 200 , extract_words= True ) 
print (md_text_words[ 0 ][ 'words' ][: 5 ])   # 从第一个块打印前 5 个单词

这种级别的提取对于 NLP 任务非常有帮助,因为词语定位和上下文非常重要。
用例 8:表格提取

最后但并非最不重要的一点是,众所周知,表格很难从 PDF 中提取而不丢失其格式。PyMuPDF4LLM 可以优雅地处理这个问题,确保表格干净且随时可用。

import pymupdf4llm 
import json md_text_tables = pymupdf4llm.to_markdown(doc= "bengio03a.pdf" , pages=[ 12 ],   # 指定包含表格的页面) 
print (md_text_tables)

表格通常包含关键数据,尤其是在技术文档中,PyMuPDF4LLM 可确保准确提取这些数据,以供下游分析。

最后

PyMuPDF4LLM 是PDF提取数据的终结者!

在多个项目中广泛使用 PyMuPDF4LLM 后,自信地说,它是 LLM 任务中最通用、最可靠的 PDF 数据提取工具。它不仅仅是获取文本或图像 — 而是以 LLM 可以轻松处理的格式获取你需要的一切。

因此,无论你是构建 RAG 系统、微调 LLM,还是只需要 PDF 的可靠提取工具,都可以尝试 PyMuPDF4LLM。它简洁、高效,而且根据我的经验,它真的很有用。

原创公众号:数据STUDIO

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

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

相关文章

【Java开发】LLM实战:使用LangChain4j构建本地RAG系统

一、引言二、基本概念2.1 什么是RAG2.2 LangChain4j简介2.3 大模型开发 vs. 传统JAVA开发三、实战经验3.1 环境搭建3.1.1 向量库(Chroma)  3.1.2 集成LangChain4j3.2 程序编写3.2.1 项目结构3.2.2 知识采集3.2.3 文档切分  3.2.4 文本向量化3.2.5 向量…

3D NAND闪存技术的架构和工艺集成概述(下)

另一种具有FG的3D NAND结构是HC-FG结构,如图8a所示。与DC-SF结构不同,水平信道堆叠在HC-FG架构中;然而,单元格没有被CG包围。因此,FG单元可以通过沟道优先工艺堆叠,类似于传统的2D平面灰阵列,并且可以以低成本实现3D结构。此外,如图8b所示,HC-FG结构与层选择晶体管(L…

3D NAND闪存技术的架构和工艺集成概述(上)

Architecture and Process Integration Overview of 3D NAND Flash Technologies 3D NAND闪存技术的架构和工艺集成概述 摘要:在过去的几十年里,NAND闪存一直是最成功的非易失性存储技术之一,由于其高可扩展性和可靠的开关特性,它在电子设备中得到了广泛的应用。为了克服平…

推荐4本书《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》,谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

【软件】解决奥林巴斯生物显微镜软件OlyVIA提示“不支持您使用的操作系统”安装中止的问题

【软件】解决奥林巴斯生物显微镜软件OlyVIA提示“不支持您使用的操作系统”安装中止的问题 零、问题 资源在文末 问题如下,从奥林巴斯生物显微镜软件官网下载地址:https://lifescience.evidentscientific.com.cn/zh/downloads/detail-iframe/?0[downloads][id]=847253920下载…

数据库如何实现事务的隔离

1.什么是事务? 简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是MyISAM 被 Inno…

【CodeForces训练记录】Codeforces Round 998 (Div. 3)

训练情况赛后反思 div3 给罚时拉满了,C题 \(k-a_i=a_i\) 的情况错掉怒罚五发,D题成结论猜猜乐了,E题看错题了,以为是边一致,实则联通就行,又被并查集背刺了 A题 斐波那契第三位可以从第一二位算出来,也可以从第四五位算出来,两个答案取大值即可 #include <bits/stdc…

【clang-format】C++代码风格自用配置文件,大括号换行风格

使用方法: 新建一个文本文件,把下面代码复制进去,再把名字改成.clang-format,然后粘贴到项目文件夹的根目录下即可,效果如下图。当然,IDE需要设置启用clang-format。clang-format文件内容 # LLVM Google BasedOnStyle: Google Language: Cpp# 强制花括号遵循 Allman 风格…

【clang-format】vscodeC++调整代码格式时让public顶格

习惯了leetcode里面public顶格写,vscode格式化代码public不顶格看着难受。 如图:只要在.clang-format文件中添加下面这行就行 # 访问修饰符偏移 AccessModifierOffset: -4 # -4就是public顶格如果是用vscode插件配置的: "C_Cpp.clang_format_style": "{Base…

基于反射实现的零GC高效率Unity组件绑定

前言 我是狗猥,上一世,我使用传统方式绑定UI上的组件,却因xLua扩展代码太多撑爆丹田沦为废人,失去了争夺主程岗位的资格,最后在测试同学的讥笑声中饮恨西北。 再次睁开眼,我穿越回到了拼UI的那一天。重生归来,这一世我要设计一个船新的绑定方式,夺回本就属于我的一切!…

XML+propties

txt文件,properties(属性)文件,XMl文件txt与properties与XML的区别当这些文件存储单个关系数据时, 普通文件 无法存储 关系数据,而properties属性文件以键值对形式存储就很方便,XML文件也可以 见图1 但储存多个用户就不行了,XML更适合, 见图2properties集合properties …

一条SQL更新语句是如何执行的?

与查询流程不同的是,更新流程中会涉及两个重要的模块: (i)redo_log模块(InnoDB中的日志模块):在 MySQL 里也有这么个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。为了解决这个问题,MyS…