嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
我们经常需要从各种不同类型的文档中提取文本内容,无论是办公文档、图像还是PDF文件。而Kreuzberg这个Python库的出现,为我们提供了一个极为便捷且高效的解决方案。
一、Kreuzberg简介
Kreuzberg是一个专注于从文档中提取文本的Python库。它具有很多令人心动的特性,使得它在文本提取领域脱颖而出。
(一)特色亮点
- 简单便捷(Simple and Hassle - Free)
-
它拥有简洁的API,无需复杂的配置就能正常工作。这对于开发者来说是一个巨大的优势,不需要花费大量的时间在繁琐的设置上,就能够快速地将其集成到自己的项目中。
-
- 本地处理(Local Processing)
-
不需要进行外部API调用,也没有云依赖。这意味着在使用Kreuzberg时,不用担心网络连接问题,也不会因为云服务的限制而受到影响。同时,数据的安全性也得到了保障,因为所有的处理都在本地进行。
-
- 资源高效(Resource Efficient)
-
它是轻量级的处理方式,不需要GPU的支持。这使得它可以在各种不同配置的设备上运行,无论是普通的笔记本电脑还是服务器,都能够轻松应对文本提取任务。
-
- 包体小巧(Small Package Size)
-
它的依赖项经过精心挑选,占用空间极小。这对于那些对空间要求比较严格的项目来说是非常友好的,不会因为引入一个库而导致项目的体积大幅增加。
-
- 格式支持广泛(Format Support)
-
全面支持各种文档、图像和文本格式。无论是常见的PDF、Word文档,还是各种图像格式,甚至是一些特定的研究格式,Kreuzberg都能够进行文本提取。
-
- 现代Python风格(Modern Python)
-
采用了async/await、类型提示以及函数式优先的方法构建。这使得代码更加简洁、高效,也符合现代Python编程的最佳实践。
-
- 开源友好(Permissive OSS)
-
Kreuzberg及其依赖项都采用了宽松的开源许可证,这鼓励了更多的开发者参与到项目的改进和扩展中来。
-
(二)应用场景
- RAG(Retrieval Augmented Generation)应用
-
Kreuzberg专为RAG应用而构建,在这些应用中,本地处理且依赖最少是非常重要的。例如在一些本地的知识检索和文本生成系统中,Kreuzberg可以快速准确地从各种文档中提取文本内容,为后续的知识检索和文本生成提供基础数据。
-
- 现代异步应用(Modern Async Applications)
-
在现代的异步应用中,Kreuzberg的异步接口能够很好地与其他异步组件协同工作。比如在一个网络爬虫项目中,需要从下载的各种文档中提取文本内容,Kreuzberg的异步接口可以提高整个系统的效率,避免阻塞等待。
-
- 无服务器函数(Serverless Functions)
-
在无服务器函数环境中,由于资源有限且对性能要求较高,Kreuzberg的轻量级和高效的特点就能够发挥作用。它可以在无服务器函数中快速地处理文档文本提取任务,而不会占用过多的资源。
-
- 容器化应用(Dockerized Applications)
-
对于容器化的应用,Kreuzberg的本地处理和小体积的特点非常适合。在一个容器化的文档处理系统中,可以方便地将Kreuzberg集成进去,对容器内的各种文档进行文本提取操作。
-
二、Kreuzberg的安装
- 安装Python包
-
首先,使用
pip install kreuzberg
命令就可以轻松安装Kreuzberg这个Python包。
-
- 安装系统依赖项
- Kreuzberg需要两个系统级别的依赖项:
- Pandoc:用于文档格式转换,最低要求的版本是Pandoc 2。
-
在Linux(Ubuntu)系统下,可以使用
sudo apt - get install pandoc tesseract - ocr
命令来安装。 -
在MacOS系统下,可以使用
brew install tesseract pandoc
命令来安装。 -
在Windows系统下,可以使用
choco install - y tesseract pandoc
命令来安装。
-
- Tesseract OCR:用于图像和PDF的OCR(光学字符识别),最低要求的版本是Tesseract 4。
-
需要注意的是,在大多数发行版中,tesseract - ocr包可能会被拆分成多个包,除了英语之外,如果需要其他语言模型,可能需要单独安装。同时,建议查阅这些库的官方文档,以获取针对自己平台的最新安装说明。
-
- Pandoc:用于文档格式转换,最低要求的版本是Pandoc 2。
- Kreuzberg需要两个系统级别的依赖项:
三、Kreuzberg的架构
- PDF处理(PDF Processing)
-
对于PDF文件,Kreuzberg采用了不同的策略。对于可搜索的PDF,它使用
pdfium2
进行文本提取;对于扫描内容,则使用Tesseract OCR。这样的组合方式能够有效地处理各种类型的PDF文件,无论是原生的可搜索PDF还是扫描得到的图像型PDF。
-
- 文档转换(Document Conversion)
-
Pandoc:用于处理多种文档和标记格式。
-
python - pptx:专门用于处理PowerPoint文件。
-
html - to - markdown:用于处理HTML内容。
-
calamine:用于处理Excel电子表格(支持多工作表)。
-
- 文本处理(Text Processing)
-
它具备智能编码检测功能,能够很好地处理Markdown和纯文本。
-
四、支持的格式
- 文档格式(Document Formats)
-
PDF(.pdf,包括可搜索和扫描类型):这是最常见的文档格式之一,无论是可直接提取文本的PDF还是需要OCR识别的扫描版PDF,Kreuzberg都能处理。
-
Microsoft Word(.docx):在办公场景中广泛使用的Word文档,Kreuzberg可以从中提取出文本内容。
-
PowerPoint演示文稿(.pptx):对于PPT文件,Kreuzberg能够提取其中的文本信息,这对于需要对PPT内容进行分析或者转换的场景非常有用。
-
OpenDocument Text(.odt):一种开源的文档格式,Kreuzberg同样支持对其进行文本提取。
-
Rich Text Format(.rtf):这种格式在一些早期的文档编辑中比较常见,Kreuzberg也可以对其进行处理。
-
EPUB(.epub):电子图书的常见格式,Kreuzberg能够从EPUB文件中提取出文本内容,方便对电子书内容进行分析或者转换。
-
DocBook XML(.dbk,.xml):在文档编写和发布领域中使用的一种XML格式,Kreuzberg支持对其进行文本提取。
-
FictionBook(.fb2):主要用于电子小说的格式,Kreuzberg可以从这种格式的文件中提取文本。
-
LaTeX(.tex,.latex):在学术和科研领域广泛使用的排版系统,Kreuzberg能够从LaTeX文件中提取出文本内容。
-
Typst(.typ):一种新兴的标记语言,Kreuzberg也对其进行了支持。
-
- 标记和文本格式(Markup and Text Formats)
-
HTML(.html,.htm):网页的基本格式,Kreuzberg可以从HTML文件中提取出其中的文本内容,这对于网页内容的分析和处理非常有用。
-
纯文本(.txt)和Markdown(.md,.markdown):这是最基本的文本格式,Kreuzberg能够很好地处理它们,无论是简单的纯文本文件还是带有标记的Markdown文件。
-
reStructuredText(.rst):一种轻量级的标记语言,Kreuzberg支持对其进行文本提取。
-
Org - mode(.org):在Emacs等编辑器中广泛使用的一种模式,Kreuzberg可以从这种模式的文件中提取文本。
-
DokuWiki(.txt):一种用于维基的文本格式,Kreuzberg能够从其中提取文本。
-
Pod(.pod):一种文档格式,Kreuzberg支持对其进行文本提取。
-
Troff/Man(.1,.2等):在Unix系统中用于编写手册页的格式,Kreuzberg可以从这种格式的文件中提取文本。
-
- 数据和研究格式(Data and Research Formats)
-
电子表格(.xlsx,.xls,.xlsm,.xlsb,.xlam,.xla,.ods):无论是微软的Excel格式还是开源的ODS格式,Kreuzberg都能够从其中提取出文本内容,这对于数据分析和处理非常有用。
-
CSV(.csv)和TSV(.tsv)文件:这是常见的数据存储格式,Kreuzberg可以从这些文件中提取出文本内容。
-
OPML文件(.opml):一种用于大纲的格式,Kreuzberg支持对其进行文本提取。
-
Jupyter Notebooks(.ipynb):在数据科学和机器学习领域广泛使用的笔记本格式,Kreuzberg能够从Jupyter笔记本中提取出文本内容。
-
BibTeX(.bib)和BibLaTeX(.bib):在学术文献管理中使用的格式,Kreuzberg可以从这些格式的文件中提取出文本内容。
-
CSL - JSON(.json):一种用于文献引用样式的JSON格式,Kreuzberg支持对其进行文本提取。
-
EndNote和JATS XML(.xml):在文献管理和学术出版领域使用的XML格式,Kreuzberg支持对其进行文本提取。
-
RIS(.ris):一种用于文献引用的格式,Kreuzberg可以从这种格式的文件中提取出文本内容。
-
- 图像格式(Image Formats)
-
JPEG(.jpg,.jpeg,.pjpeg):最常见的图像格式之一,Kreuzberg可以对JPEG图像进行OCR识别并提取出文本内容。
-
PNG(.png):另一种常见的图像格式,Kreuzberg同样可以对其进行处理。
-
TIFF(.tiff,.tif):在一些专业领域如印刷和摄影中使用的图像格式,Kreuzberg能够对TIFF图像进行OCR识别。
-
BMP(.bmp):一种简单的图像格式,Kreuzberg可以对BMP图像进行OCR识别。
-
GIF(.gif):动画图像格式,Kreuzberg能够对GIF图像进行OCR识别并提取文本内容。
-
JPEG 2000家族(.jp2,.jpm,.jpx,.mj2):JPEG的升级版格式,Kreuzberg也可以对其进行处理。
-
WebP(.webp):一种新兴的图像格式,Kreuzberg支持对其进行OCR识别。
-
便携式anymap格式(.pbm,.pgm,.ppm,.pnm):这些不太常见的图像格式,Kreuzberg同样可以进行OCR识别并提取文本内容。
-
五、Kreuzberg的用法
- 单项目处理(Single Item Processing)
-
**extract_file()**:这是一个异步函数,用于从文件(可以接受字符串路径或者
pathlib.Path
类型)中提取文本。例如:
-
import asyncio
from pathlib import Path
from kreuzberg import extract_file, ExtractionResult, PSMModeasync def extract_document():# 从PDF文件中以默认设置提取pdf_result: ExtractionResult = await extract_file("document.pdf")print(f"Content: {pdf_result.content}")asyncio.run(extract_document())
-
**extract_bytes()**:异步函数,用于从字节(接受字节字符串)中提取文本。例如:
from kreuzberg import extract_bytes, ExtractionResultasync def process_upload(file_content: bytes, mime_type: str) -> ExtractionResult:return await extract_bytes(file_content,mime_type=mime_type,)# 示例用法,不同文件类型
async def handle_uploads(docx_bytes: bytes, pdf_bytes: bytes, image_bytes: bytes):# 处理PDF上传pdf_result = await process_upload(pdf_bytes, mime_type="application/pdf")print(f"PDF content: {pdf_result.content}")print(f"PDF metadata: {pdf_result.metadata}")# 处理图像上传(将使用OCR)img_result = await process_upload(image_bytes, mime_type="image/jpeg")print(f"Image text: {img_result.content}")# 处理Word文档上传docx_result = await process_upload(docx_bytes,mime_type="application/vnd.openxmlformats - officedocument.wordprocessingml.document")print(f"Word content: {docx_result.content}")asyncio.run(handle_uploads(b"", b"", b""))
-
**extract_file_sync()**:是
extract_file()
的同步版本。 -
**extract_bytes_sync()**:是
extract_bytes()
的同步版本。
- 批处理(Batch Processing)
-
**batch_extract_file()**:异步函数,用于同时从多个文件中提取文本。例如:
-
from pathlib import Path
from kreuzberg import batch_extract_file, batch_extract_bytes, batch_extract_file_syncasync def process_documents(file_paths: list[Path]) -> None:# 从多个文件中提取results = await batch_extract_file(file_paths)for path, result in zip(file_paths, results):print(f"File {path}: {result.content[:100]}...")asyncio.run(process_documents([Path("file1"), Path("file2")]))
-
**batch_extract_bytes()**:异步函数,用于同时从多个字节内容中提取文本。例如:
from pathlib import Path
from kreuzberg import batch_extract_file, batch_extract_bytes, batch_extract_file_syncasync def process_uploads(contents: list[tuple[bytes, str]]) -> None:# 每个项目是(内容,MIME类型)的元组results = await batch_extract_bytes(contents)for (_, mime_type), result in zip(contents, results):print(f"Upload {mime_type}: {result.content[:100]}...")asyncio.run(process_uploads([(b"", "type1"), (b"", "type2")]))
-
**batch_extract_file_sync()**:是
batch_extract_file()
的同步版本。 -
**batch_extract_bytes_sync()**:是
batch_extract_bytes()
的同步版本。
六、配置参数
- OCR配置(OCR Configuration)
-
force_ocr(默认值为False):即使对于可搜索的PDF,也强制进行OCR处理。例如:
-
from kreuzberg import extract_fileasync def process_pdf():# 强制对可搜索的PDF进行OCRresult = await extract_file("document.pdf", force_ocr = True)print(result.content)asyncio.run(process_pdf())
-
language(默认值为eng):指定Tesseract OCR的语言模型。这会影响不同语言文档的文本识别准确性。例如,
eng
代表英语,deu
代表德语,eng+deu
代表英语和德语。需要注意的是,语言的顺序会影响处理时间,第一个语言是主要语言,第二个语言是次要语言等。 -
psm(Page Segmentation Mode,默认值为PSM.AUTO):控制Tesseract如何分析页面布局。在大多数情况下,不需要将其更改为其他值,但如果有特殊需求,可以根据Tesseract的文档进行调整。
- 处理配置(Processing Configuration)
-
max_processes(默认值为CPU数量):Tesseract的最大并发进程数。例如:
-
from kreuzberg import extract_fileasync def process_pdf():# 控制OCR并发数result = await extract_file("large_document.pdf",max_processes = 4)print(result.content)asyncio.run(process_pdf())
总结
Kreuzberg是一个功能强大的Python库,专为从各种文档中提取文本而设计,支持PDF、图像、办公文档等多种格式。它以简单便捷、本地处理、资源高效等特性脱颖而出,无需复杂配置即可快速集成到项目中。Kreuzberg适用于RAG应用、现代异步应用、无服务器函数和容器化应用等多种场景,为开发者提供了极大的便利。
项目地址
https://github.com/Goldziher/kreuzberg