RAG基建之PDF解析的“流水線”魔法之旅

將PDF文件和掃描圖像等非結構化文檔轉換為結構化或半結構化格式是人工智能的關鍵部分。然而,由于PDF的復雜性和PDF解析任務的復雜性,這一過程顯得神秘莫測。
在RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”與“陷阱”中,我們介紹了PDF解析的主要任務,對現有方法進行了分類,并簡要介紹了每種方法。RAG基建之PDF解析的“無OCR”魔法之旅中介紹了端到端方法。

本篇咱們來聊聊PDF解析的“流水線”大冒險!想象一下,PDF文件就像一座神秘的迷宮,里面藏著各種文字、表格、公式和圖片。我們的任務就是把這些亂七八糟的東西整理得井井有條,變成結構化的數據。聽起來是不是有點像在迷宮里找寶藏?

基于流水線的方法將PDF解析任務視為一系列模型或算法的流水線,如下所示。在這里插入圖片描述

基于流水線的方法可以分為以下五個步驟:

  1. 預處理原始PDF文件:修復模糊或傾斜等問題。此步驟包括圖像增強、圖像方向校正等。
  2. 進行布局分析:主要包括視覺結構分析和語義結構分析。前者識別文檔的結構并勾勒出相似區域,后者為這些區域標注特定的文檔類型,如文本、標題、列表、表格、圖表等。此步驟還涉及分析頁面的閱讀順序。
  3. 分別處理布局分析中識別的不同區域:此過程包括理解表格、識別文本以及識別公式、流程圖和特殊符號等其他組件。
  4. 整合之前的結果:恢復頁面結構。
  5. 輸出結構化或半結構化信息:如Markdown、JSON或HTML。

PDF解析的“流水線”方法四大天王:

    1. Marker:輕量級“寶藏獵人”
      Marker是個輕量級的工具,速度快得像閃電俠,但它也有點小毛病。比如,它不太擅長處理表格,尤其是表格標題,簡直像是迷路的小羊羔。不過,它對付公式倒是有一套,尤其是那些復雜的數學公式,Marker能用Texify模型把它們變成漂亮的LaTeX格式。可惜的是,它只懂英語,日語和印地語對它來說就像外星語。
    1. Papermage:科學文檔的“多面手”
      Papermage是個專門對付科學文檔的“多面手”。它不僅能把文檔拆分成各種元素(文字、圖表、表格等),還能靈活處理跨頁、跨列的復雜內容。它的設計非常模塊化,開發者可以輕松添加新功能,就像給樂高積木加新零件一樣簡單。不過,它目前還沒有并行處理的能力,解析速度有點慢,像是在用老式打字機敲代碼。
    1. Unstructured:全能型“迷宮大師”
      Unstructured是個全能型選手,布局分析做得非常細致。它不僅能識別文字和表格,還能處理復雜的文檔結構。它的自定義能力也很強,開發者可以根據需要調整中間結果,就像在迷宮里隨時調整路線一樣靈活。不過,它在公式識別上表現一般,像是迷宮里的一塊“絆腳石”。

接下來,本文將討論幾種具有代表性的基于流水線的PDF解析框架,并分享從中獲得的見解。

文章目錄

    • Marker
      • 整體流程
      • 從Marker中獲得的見解
      • Marker的缺點
    • PaperMage
      • 組件
      • 基礎數據類
      • 整體流程和代碼分析
      • 句子分割
      • 布局結構分析
      • 邏輯結構分析
      • 關于Papermage的見解和討論
    • Unstructured
      • 關于布局分析
      • 關于自定義
      • 關于表格檢測和識別
      • 關于公式檢測和識別
    • MinerU:基于管道的開源文檔解析框架
      • MinerU 工作流程:
      • MinerU所使用的主要模型和算法
      • 評論
    • 結論

Marker

Marker 是一個用于深度學習模型的流水線。它能夠將PDF、EPUB和MOBI文檔轉換為Markdown格式。

整體流程

Marker的整體流程分為以下四個步驟:
在這里插入圖片描述

步驟1:使用PyMuPDF和OCR將頁面劃分為塊并提取文本。對應代碼如下:

def convert_single_pdf(fname: str,model_lst: List,max_pages=None,metadata: Optional[Dict]=None,parallel_factor: int = 1
) -> Tuple[str, Dict]:......doc = pymupdf.open(fname, filetype=filetype)if filetype != "pdf":conv = doc.convert_to_pdf()doc = pymupdf.open("pdf", conv)blocks, toc, ocr_stats = get_text_blocks(doc,tess_lang,spell_lang,max_pages=max_pages,parallel=int(parallel_factor * settings.OCR_PARALLEL_WORKERS))

步驟2:使用布局分割器對塊進行分類,并使用列檢測器對塊進行排序。對應代碼如下:

def convert_single_pdf(fname: str,model_lst: List,max_pages=None,metadata: Optional[Dict]=None,parallel_factor: int = 1
) -> Tuple[str, Dict]:......# 從列表中解包模型texify_model, layoutlm_model, order_model, edit_model = model_lstblock_types = detect_document_block_types(doc,blocks,layoutlm_model,batch_size=int(settings.LAYOUT_BATCH_SIZE * parallel_factor))# 查找頁眉和頁腳bad_span_ids = filter_header_footer(blocks)out_meta["block_stats"] = {"header_footer": len(bad_span_ids)}annotate_spans(blocks, block_types)# 如果設置了調試標志,則轉儲調試數據dump_bbox_debug_data(doc, blocks)blocks = order_blocks(doc,blocks,order_model,batch_size=int(settings.ORDERER_BATCH_SIZE * parallel_factor))......

步驟3:過濾頁眉和頁腳,修復代碼和表格塊,并應用Texify模型處理公式。對應代碼如下:

def convert_single_pdf(fname: str,model_lst: List,max_pages=None,metadata: Optional[Dict]=None,parallel_factor: int = 1
) -> Tuple[str, Dict]:......# 修復代碼塊code_block_count = identify_code_blocks(blocks)out_meta["block_stats"]["code"] = code_block_countindent_blocks(blocks)# 修復表格塊merge_table_blocks(blocks)table_count = create_new_tables(blocks)out_meta["block_stats"]["table"] = table_countfor page in blocks:for block in page.blocks:block.filter_spans(bad_span_ids)block.filter_bad_span_types()filtered, eq_stats = replace_equations(doc,blocks,block_types,texify_model,batch_size=int(settings.TEXIFY_BATCH_SIZE * parallel_factor))out_meta["block_stats"]["equations"] = eq_stats......

步驟4:使用編輯器模型對文本進行后處理。對應代碼如下:

def convert_single_pdf(fname: str,model_lst: List,max_pages=None,metadata: Optional[Dict]=None,parallel_factor: int = 1
) -> Tuple[str, Dict]:......# 復制以避免更改原始數據merged_lines = merge_spans(filtered)text_blocks = merge_lines(merged_lines, filtered)text_blocks = filter_common_titles(text_blocks)full_text = get_full_text(text_blocks)# 處理空塊的連接full_text = re.sub(r'\n{3,}', '\n\n', full_text)full_text = re.sub(r'(\n\s){3,}', '\n\n', full_text)# 將項目符號字符替換為 -full_text = replace_bullets(full_text)# 使用編輯器模型對文本進行后處理full_text, edit_stats = edit_full_text(full_text,edit_model,batch_size=settings.EDITOR_BATCH_SIZE * parallel_factor)out_meta["postprocess_stats"] = {"edit": edit_stats}return full_text, out_meta

從Marker中獲得的見解

到目前為止,我們已經介紹了Marker的整體流程。現在,讓我們討論從Marker中獲得的見解。

見解1:布局分析可以分為多個子任務。第一個子任務涉及調用PyMuPDF API獲取頁面塊。

def ocr_entire_page(page, lang: str, spellchecker: Optional[SpellChecker] = None) -> List[Block]:if settings.OCR_ENGINE == "tesseract":return ocr_entire_page_tess(page, lang, spellchecker)elif settings.OCR_ENGINE == "ocrmypdf":return ocr_entire_page_ocrmp(page, lang, spellchecker)else:raise ValueError(f"未知的OCR引擎 {settings.OCR_ENGINE}")def ocr_entire_page_tess(page, lang: str, spellchecker: Optional[SpellChecker] = None) -> List[Block]:try:full_tp = page.get_textpage_ocr(flags=settings.TEXT_FLAGS, dpi=settings.OCR_DPI, full=True, language=lang)blocks = page.get_text("dict", sort=True, flags=settings.TEXT_FLAGS

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75996.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】GDB調試指南

一、GDB基礎 1. 啟動調試 gdb ./your_program # 啟動調試 gdb --args ./prog arg1 # 帶參數啟動 gdb -p <pid> # 附加到正在運行的進程 2. 斷點管理 b main # 在main函數設斷點 b file.c:20 # 在file.c第20行設斷點 b *0x4005a…

Android面試總結之Glide源碼級理解

當你的圖片列表在低端機上白屏3秒、高端機因內存浪費導致FPS腰斬時&#xff0c;根源往往藏在Glide的內存分配僵化、磁盤混存、網絡加載無優先級三大致命缺陷中。 本文從阿里P8級緩存改造方案出發&#xff0c;結合Glide源碼實現動態內存擴容、磁盤冷熱分區、智能預加載等黑科技&…

驅動開發系列49 - 搭建 Vulkan 驅動調試環境(編譯 mesa 3D)- Ubuntu24.04

一:搭建Vulkan運行環境 安裝vulkan依賴包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…

深度學習——圖像余弦相似度

計算機視覺是研究圖像的學問&#xff0c;在圖像的最終評價時&#xff0c;往往需要用到一些圖像相似度的度量指標&#xff0c;因此&#xff0c;在本文中我們將詳細地介紹原生和調用第三方庫的計算圖像余弦相似度的方法。 使用原生numpy實現 import numpy as npdef image_cosin…

項目代碼第8講【數據庫基礎知識】:SQL(DDL、DML、DQL、DCL);函數(聚合、字符串、數值、日期、流程);約束;多表查詢;事務

黑馬程序員 MySQL數據庫入門到精通&#xff0c;從mysql安裝到mysql高級、mysql優化全囊括_嗶哩嗶哩_bilibili 一、數據庫相關概念 1、主流的關系型數據庫都支持SQL語言——SQL語言可以操作所有的關系型數據庫 像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的…

如何在阿里云linux主機上部署Node.Js

在阿里云的Linux服務器上搭建Node.js編程環境可以通過以下步驟完成。這里以常見的 Ubuntu/CentOS 系統為例&#xff0c;提供兩種安裝方式&#xff08;包管理器、NVM多版本管理&#xff09;&#xff1a; 一、通過包管理器安裝&#xff08;適合快速安裝指定版本&#xff09; 1. …

Python爬蟲:開啟數據抓取的奇幻之旅(一)

目錄 一、爬蟲初印象&#xff1a;揭開神秘面紗? 二、工欲善其事&#xff1a;前期準備? &#xff08;一&#xff09;Python 環境搭建? 1.下載 Python 安裝包&#xff1a;? 2.運行安裝程序&#xff1a;? 3.配置環境變量&#xff08;若自動添加失敗&#xff09;&#x…

機器學習——集成學習框架(GBDT、XGBoost、LightGBM、CatBoost)、調參方法

一、集成學習框架 對訓練樣本較少的結構化數據領域&#xff0c;Boosting算法仍然是常用項 XGBoost、CatBoost和LightGBM都是以決策樹為基礎的集成學習框架 三個學習框架的發展是&#xff1a;XGBoost是在GBDT的基礎上優化而來&#xff0c;CatBoost和LightGBM是在XGBoost的基礎上…

第十五章:Python的Pandas庫詳解及常見用法

在數據分析領域&#xff0c;Python的Pandas庫是一個不可或缺的工具。它提供了高效的數據結構和數據分析工具&#xff0c;使得數據處理變得簡單而直觀。本文將詳細介紹Pandas庫的基本功能、常見用法&#xff0c;并通過示例代碼演示如何使用Pandas進行數據處理。最后&#xff0c;…

【Python桌面應用】PySide6 界面開發完全指南

文章目錄 1. 引言2. PySide6 簡介與安裝2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安裝PySide62.4 開發環境配置建議 3. Qt 設計原理3.1 Qt對象模型3.2 信號與槽機制3.3 Qt坐標系統3.4 Qt樣式表(QSS) 4. 創建第一個應用4.1 基本應用結構4.2 主窗口與應用生命周期4.3 使用面向…

用 pytorch 從零開始創建大語言模型(三):編碼注意力機制

從零開始創建大語言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;編碼注意力機制 3 編碼注意力機制3.1 建模長序列的問題3.2 使用注意力機制捕捉數據依賴關系3.3 通過自注意力關注輸入的不同部分3.3.1 一個沒有可訓練權重的簡化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的兩大核心設計思想是 IOC&#xff08;控制反轉&#xff09; 和 AOP&#xff08;面向切面編程&#xff09;。它們共同解決了代碼耦合度高、重復邏輯冗余等問題。 IOC&#xff08;控制反轉&#xff09; 1.核心概念 控制反轉&#xff08;Inversion of Control…

STM32_HAL開發環境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安裝Keil(MDK-ARM)【集成開發環境IDE】 我們會在Keil(MDK-ARM)上去編寫代碼、編譯代碼、燒寫代碼、調試代碼。 Keil(MDK-ARM)的安裝方法&#xff1a; 教學視頻的第02分03秒開始看。 安裝過程中請修改一下下面兩個路徑&#xff0c;避免占用C盤空間。 Core就是Keil(MDK-ARM)的…

python 第三方庫 - dotenv讀取配置文件

.env 文件是一種用于存儲環境變量的配置文件&#xff0c;常用于項目的運行環境設置。環境變量是操作系統層面的一些變量&#xff0c;它們可以被應用程序訪問和使用&#xff0c;通常包含敏感信息或特定于環境的配置&#xff0c;如數據庫連接信息、API 密鑰、調試模式等。 安裝p…

用python壓縮圖片大小

下載庫 cmd開命令或者PyCharm執行都行 pip install pillow2. 然后就是代碼 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""壓縮圖片大小。參數:- input_path: 輸入圖片路徑- output_path: 輸出圖片路徑- qu…

【自用記錄】本地關聯GitHub以及遇到的問題

最近終于又想起GitHub&#xff0c;想上傳代碼和項目到倉庫里。 由于很早之前有在本地連接過GitHub&#xff08;但沒怎么用&#xff09;&#xff0c;現在需要重新搞起&#xff08;操作忘得差不多&#xff09;。 在看教程實操的過程中遇到了一些小問題&#xff0c;遂記錄一下。 前…

在一個scss文件中定義變量,在另一個scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 從零開始研發GPS接收機連載——19、自制GPS接收機的春運之旅 許久未曾更新這個系列&#xff0c;并非我平日里對這事兒沒了興致&#xff0c;不再愿意折騰。實則是受限于自身條…

智能駕駛功能LCC車道保持居中

畫龍現象就是LCC常見bug LDW車道偏離預警 LKA車道保持 聲音其實就是蜂鳴器 有些車是40 有些是60

Java全棧面試寶典:線程機制與Spring依賴注入深度解析

目錄 一、Java線程核心機制 &#x1f525; 問題3&#xff1a;start()與run()的底層執行差異 線程啟動流程圖解 核心差異對照表 代碼驗證示例 &#x1f525; 問題4&#xff1a;Thread與Runnable的六大維度對比 類關系UML圖 最佳實踐代碼 &#x1f525; 問題5&#xff1…