嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
我们经常需要从各种不同类型的文档中提取文本内容,无论是办公文档、图像还是PDF文件。而Kreuzberg这个Python库的出现,为我们提供了一个极为便捷且高效的解决方案。
一、Kreuzberg简介
Kreuzberg是一个专注于从文档中提取文本的Python库。它具有很多令人心动的特性,使得它在文本提取领域脱颖而出。
(一)特色亮点
- 简单便捷(Simple and Hassle - Free)
- 它拥有简洁的API,无需复杂的配置就能正常工作。这对于开发者来说是一个巨大的优势,不需要花费大量的时间在繁琐的设置上,就能够快速地将其集成到自己的项目中。
- 不需要进行外部API调用,也没有云依赖。这意味着在使用Kreuzberg时,不用担心网络连接问题,也不会因为云服务的限制而受到影响。同时,数据的安全性也得到了保障,因为所有的处理都在本地进行。
- 它是轻量级的处理方式,不需要GPU的支持。这使得它可以在各种不同配置的设备上运行,无论是普通的笔记本电脑还是服务器,都能够轻松应对文本提取任务。
- 它的依赖项经过精心挑选,占用空间极小。这对于那些对空间要求比较严格的项目来说是非常友好的,不会因为引入一个库而导致项目的体积大幅增加。
- 全面支持各种文档、图像和文本格式。无论是常见的PDF、Word文档,还是各种图像格式,甚至是一些特定的研究格式,Kreuzberg都能够进行文本提取。
现代Python风格(Modern Python)- 采用了async/await、类型提示以及函数式优先的方法构建。这使得代码更加简洁、高效,也符合现代Python编程的最佳实践。
- Kreuzberg及其依赖项都采用了宽松的开源许可证,这鼓励了更多的开发者参与到项目的改进和扩展中来。
(二)应用场景
- RAG(Retrieval Augmented Generation)应用
- Kreuzberg专为RAG应用而构建,在这些应用中,本地处理且依赖最少是非常重要的。例如在一些本地的知识检索和文本生成系统中,Kreuzberg可以快速准确地从各种文档中提取文本内容,为后续的知识检索和文本生成提供基础数据。
现代异步应用(Modern Async Applications)- 在现代的异步应用中,Kreuzberg的异步接口能够很好地与其他异步组件协同工作。比如在一个网络爬虫项目中,需要从下载的各种文档中提取文本内容,Kreuzberg的异步接口可以提高整个系统的效率,避免阻塞等待。
无服务器函数(Serverless Functions)- 在无服务器函数环境中,由于资源有限且对性能要求较高,Kreuzberg的轻量级和高效的特点就能够发挥作用。它可以在无服务器函数中快速地处理文档文本提取任务,而不会占用过多的资源。
容器化应用(Dockerized Applications)- 对于容器化的应用,Kreuzberg的本地处理和小体积的特点非常适合。在一个容器化的文档处理系统中,可以方便地将Kreuzberg集成进去,对容器内的各种文档进行文本提取操作。
二、Kreuzberg的安装
- 首先,使用
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的架构
- 对于PDF文件,Kreuzberg采用了不同的策略。对于可搜索的PDF,它使用
pdfium2
进行文本提取;对于扫描内容,则使用Tesseract OCR。这样的组合方式能够有效地处理各种类型的PDF文件,无论是原生的可搜索PDF还是扫描得到的图像型PDF。
文档转换(Document Conversion)-
python - pptx:专门用于处理PowerPoint文件。
- html - to - markdown:用于处理HTML内容。
- calamine:用于处理Excel电子表格(支持多工作表)。
- 它具备智能编码检测功能,能够很好地处理Markdown和纯文本。
四、支持的格式
-
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可以从这种格式的文件中提取出文本内容。
- 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, 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()
的同步版本。
- **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()
的同步版本。
六、配置参数
- 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的文档进行调整。
- 处理配置(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