社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

小华同学ai • 4 天前 • 72 次点击  

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



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


一、Kreuzberg简介

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



(一)特色亮点

  1. 简单便捷(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及其依赖项都采用了宽松的开源许可证,这鼓励了更多的开发者参与到项目的改进和扩展中来。



    (二)应用场景

    1. RAG(Retrieval Augmented Generation)应用
    • Kreuzberg专为RAG应用而构建,在这些应用中,本地处理且依赖最少是非常重要的。例如在一些本地的知识检索和文本生成系统中,Kreuzberg可以快速准确地从各种文档中提取文本内容,为后续的知识检索和文本生成提供基础数据。
  • 现代异步应用(Modern Async Applications)
    • 在现代的异步应用中,Kreuzberg的异步接口能够很好地与其他异步组件协同工作。比如在一个网络爬虫项目中,需要从下载的各种文档中提取文本内容,Kreuzberg的异步接口可以提高整个系统的效率,避免阻塞等待。
  • 无服务器函数(Serverless Functions)
    • 在无服务器函数环境中,由于资源有限且对性能要求较高,Kreuzberg的轻量级和高效的特点就能够发挥作用。它可以在无服务器函数中快速地处理文档文本提取任务,而不会占用过多的资源。
  • 容器化应用(Dockerized Applications)
    • 对于容器化的应用,Kreuzberg的本地处理和小体积的特点非常适合。在一个容器化的文档处理系统中,可以方便地将Kreuzberg集成进去,对容器内的各种文档进行文本提取操作。


    二、Kreuzberg的安装

    1. 安装Python包
    • 首先,使用pip install kreuzberg命令就可以轻松安装Kreuzberg这个Python包。
  • 安装系统依赖项
    • Pandoc:用于文档格式转换,最低要求的版本是Pandoc 2。
    • Tesseract OCR:用于图像和PDF的OCR(光学字符识别),最低要求的版本是Tesseract 4。
    • 在Linux(Ubuntu)系统下,可以使用sudo apt - get install pandoc tesseract - ocr命令来安装。
    • 在MacOS系统下,可以使用brew install tesseract pandoc命令来安装。
    • 在Windows系统下,可以使用 choco install - y tesseract pandoc命令来安装。
    • 需要注意的是,在大多数发行版中,tesseract - ocr包可能会被拆分成多个包,除了英语之外,如果需要其他语言模型,可能需要单独安装。同时,建议查阅这些库的官方文档,以获取针对自己平台的最新安装说明。
    • Kreuzberg需要两个系统级别的依赖项:


    三、Kreuzberg的架构

    1. 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和纯文本。


    四、支持的格式

    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也对其进行了支持。
  • 标记和文本格式(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的用法

    1. 单项目处理(Single Item Processing)
    • **extract_file()**:这是一个异步函数,用于从文件(可以接受字符串路径或者pathlib.Path类型)中提取文本。例如:

    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()**:异步函数,用于从字节(接受字节字符串)中提取文本。例如:

    from kreuzberg import extract_bytes, ExtractionResult


    asyncdef process_upload(file_content: bytes, mime_type: str) -> ExtractionResult:
        returnawait extract_bytes(
            file_content,
            mime_type=mime_type,
        )


    # 示例用法,不同文件类型
    asyncdef 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()**:异步函数,用于同时从多个文件中提取文本。例如:

    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()**:异步函数,用于同时从多个字节内容中提取文本。例如:

    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处理。例如:

    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的最大并发进程数。例如:

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


    项目地址


    https://github.com/Goldziher/kreuzberg


    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/179331
     
    72 次点击