Kreuzberg:本地OCR+多格式解析!Kreuzberg如何用Python暴力提取30+文档格式?程序员看完直呼内行!

嗨,大家好,我是小华同学,关注我们获得"最新、最全、最优质"开源项目和高效工作学习方法

我们经常需要从各种不同类型的文档中提取文本内容,无论是办公文档、图像还是PDF文件。而Kreuzberg这个Python库的出现,为我们提供了一个极为便捷且高效的解决方案。

一、Kreuzberg简介

Kreuzberg是一个专注于从文档中提取文本的Python库。它具有很多令人心动的特性,使得它在文本提取领域脱颖而出。

(一)特色亮点

  1. 简单便捷(Simple and Hassle - Free)

    • 它拥有简洁的API,无需复杂的配置就能正常工作。这对于开发者来说是一个巨大的优势,不需要花费大量的时间在繁琐的设置上,就能够快速地将其集成到自己的项目中。
  2. 本地处理(Local Processing)

    • 不需要进行外部API调用,也没有云依赖。这意味着在使用Kreuzberg时,不用担心网络连接问题,也不会因为云服务的限制而受到影响。同时,数据的安全性也得到了保障,因为所有的处理都在本地进行。
  3. 资源高效(Resource Efficient)

    • 它是轻量级的处理方式,不需要GPU的支持。这使得它可以在各种不同配置的设备上运行,无论是普通的笔记本电脑还是服务器,都能够轻松应对文本提取任务。
  4. 包体小巧(Small Package Size)

    • 它的依赖项经过精心挑选,占用空间极小。这对于那些对空间要求比较严格的项目来说是非常友好的,不会因为引入一个库而导致项目的体积大幅增加。
  5. 格式支持广泛(Format Support)

    • 全面支持各种文档、图像和文本格式。无论是常见的PDF、Word文档,还是各种图像格式,甚至是一些特定的研究格式,Kreuzberg都能够进行文本提取。
  6. 现代Python风格(Modern Python)

    • 采用了async/await、类型提示以及函数式优先的方法构建。这使得代码更加简洁、高效,也符合现代Python编程的最佳实践。
  7. 开源友好(Permissive OSS)

    • Kreuzberg及其依赖项都采用了宽松的开源许可证,这鼓励了更多的开发者参与到项目的改进和扩展中来。

(二)应用场景

  1. RAG(Retrieval Augmented Generation)应用

    • Kreuzberg专为RAG应用而构建,在这些应用中,本地处理且依赖最少是非常重要的。例如在一些本地的知识检索和文本生成系统中,Kreuzberg可以快速准确地从各种文档中提取文本内容,为后续的知识检索和文本生成提供基础数据。
  2. 现代异步应用(Modern Async Applications)

    • 在现代的异步应用中,Kreuzberg的异步接口能够很好地与其他异步组件协同工作。比如在一个网络爬虫项目中,需要从下载的各种文档中提取文本内容,Kreuzberg的异步接口可以提高整个系统的效率,避免阻塞等待。
  3. 无服务器函数(Serverless Functions)

    • 在无服务器函数环境中,由于资源有限且对性能要求较高,Kreuzberg的轻量级和高效的特点就能够发挥作用。它可以在无服务器函数中快速地处理文档文本提取任务,而不会占用过多的资源。
  4. 容器化应用(Dockerized Applications)

    • 对于容器化的应用,Kreuzberg的本地处理和小体积的特点非常适合。在一个容器化的文档处理系统中,可以方便地将Kreuzberg集成进去,对容器内的各种文档进行文本提取操作。

二、Kreuzberg的安装

  1. 安装Python包

    • 首先,使用pip install kreuzberg命令就可以轻松安装Kreuzberg这个Python包。
  2. 安装系统依赖项

    • 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包可能会被拆分成多个包,除了英语之外,如果需要其他语言模型,可能需要单独安装。同时,建议查阅这些库的官方文档,以获取针对自己平台的最新安装说明。

三、Kreuzberg的架构

  1. PDF处理(PDF Processing)

    • 对于PDF文件,Kreuzberg采用了不同的策略。对于可搜索的PDF,它使用pdfium2进行文本提取;对于扫描内容,则使用Tesseract OCR。这样的组合方式能够有效地处理各种类型的PDF文件,无论是原生的可搜索PDF还是扫描得到的图像型PDF。
  2. 文档转换(Document Conversion)

    • Pandoc:用于处理多种文档和标记格式。
    • python - pptx:专门用于处理PowerPoint文件。
    • html - to - markdown:用于处理HTML内容。
    • calamine:用于处理Excel电子表格(支持多工作表)。
  3. 文本处理(Text Processing)

    • 它具备智能编码检测功能,能够很好地处理Markdown和纯文本。

四、支持的格式

  1. 文档格式(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也对其进行了支持。
  2. 标记和文本格式(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可以从这种格式的文件中提取文本。
  3. 数据和研究格式(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可以从这种格式的文件中提取出文本内容。
  4. 图像格式(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的用法

  1. 单项目处理(Single Item Processing)

    • extract_file() :这是一个异步函数,用于从文件(可以接受字符串路径或者pathlib.Path类型)中提取文本。例如:
python 复制代码
import asyncio
from pathlib import Path
from kreuzberg import extract_file, ExtractionResult, PSMMode


async def extract_document():
    # 从PDF文件中以默认设置提取
    pdf_result: ExtractionResult = await extract_file("document.pdf")
    print(f"Content: {pdf_result.content}")


asyncio.run(extract_document())
  • extract_bytes():异步函数,用于从字节(接受字节字符串)中提取文本。例如:
python 复制代码
from kreuzberg import extract_bytes, ExtractionResult


async 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()的同步版本。
  1. 批处理(Batch Processing)

    • batch_extract_file():异步函数,用于同时从多个文件中提取文本。例如:
python 复制代码
from pathlib import Path
from kreuzberg import batch_extract_file, batch_extract_bytes, batch_extract_file_sync


async 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():异步函数,用于同时从多个字节内容中提取文本。例如:
python 复制代码
from pathlib import Path
from kreuzberg import batch_extract_file, batch_extract_bytes, batch_extract_file_sync


async 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()的同步版本。

六、配置参数

  1. OCR配置(OCR Configuration)

    • force_ocr(默认值为False) :即使对于可搜索的PDF,也强制进行OCR处理。例如:
python 复制代码
from kreuzberg import extract_file


async def process_pdf():
    # 强制对可搜索的PDF进行OCR
    result = 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的文档进行调整。
  1. 处理配置(Processing Configuration)

    • max_processes(默认值为CPU数量) :Tesseract的最大并发进程数。例如:
python 复制代码
from kreuzberg import extract_file


async 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应用、现代异步应用、无服务器函数和容器化应用等多种场景,为开发者提供了极大的便利。

项目地址

bash 复制代码
https://github.com/Goldziher/kreuzberg
相关推荐
CodeJourney.31 分钟前
Deepseek助力思维导图与流程图制作:高效出图新选择
数据库·人工智能·算法
Liudef061 小时前
Stable Diffusion模型高清算法模型类详解
人工智能·算法·ai作画·stable diffusion
柠石榴1 小时前
【练习】【二叉树】力扣热题100 102. 二叉树的层序遍历
c++·算法·leetcode·二叉树
邴越1 小时前
Leetcode 112: 路径总和
算法·leetcode·职场和发展
2301_801037731 小时前
力扣-字符串
算法·leetcode·职场和发展
冠位观测者1 小时前
【Leetcode 每日一题】1328. 破坏回文串
数据结构·算法·leetcode
一只_程序媛1 小时前
【leetcode hot 100 53】最大子数组和
算法·leetcode·职场和发展
邴越2 小时前
Leetcode 57: 插入区间
算法·leetcode·职场和发展
天若有情6732 小时前
用 C++ 实现选择题答案随机生成器:从生活灵感走向代码实践
c++·算法·生活
dorabighead2 小时前
小哆啦解题记:螺旋矩阵
算法·矩阵·力扣·大话算法