開源PDF解析工具Marker深度解析

開源PDF解析工具Marker深度解析

檢索增強生成(RAG)系統的第一步就是做 pdf 解析,從復雜多樣的 pdf 中提取出干凈準確的文本內容。現有的最優秀的開源工具有兩個:Marker 和 MinerU。因為 Marker 是個人開發者做的,文檔不完善,所以這里基于我個人的理解對它的代碼進行解析。

深度學習模型

marker/models.py中可以看到,marker 用到了如下的深度學習模型:

def create_model_dict(device=None, dtype=None) -> dict:return {"layout_model": LayoutPredictor(device=device, dtype=dtype),"texify_model": TexifyPredictor(device=device, dtype=dtype),"recognition_model": RecognitionPredictor(device=device, dtype=dtype),"table_rec_model": TableRecPredictor(device=device, dtype=dtype),"detection_model": DetectionPredictor(device=device, dtype=dtype),"inline_detection_model": InlineDetectionPredictor(device=device, dtype=dtype),"ocr_error_model": OCRErrorPredictor(device=device, dtype=dtype)}

這些模型都來自surya,作者沒有直接介紹這些模型的原理,但可推測

像檢測相關的 DetectionPredictorInlineDetectionPredictor 可能用 Faster R - CNN、YOLO 系列等目標檢測模型;

  • LayoutPredictor 或采用 Mask R - CNN 、LayoutLM 等進行布局分析;

  • OCRErrorPredictor 或許借助 RNN 變體或 BERT 類模型處理 OCR 錯誤;

  • RecognitionPredictor 可能使用 CRNN 等做字符識別;

  • TableRecPredictor 會用到基于 GNN 的模型處理表格;

  • TexifyPredictor 可能采用 Seq2Seq 或 Transformer - based 的 Seq2Seq 模型來生成 LaTeX 代碼。

代碼使用 PyTorch 框架,可指定設備和數據類型。

解析流程

因為其它數據類型(docx,pptx,xlsx)都可以轉成pdf,所以 pdf 是 marker 處理的主要對象。從marker/converters/pdf.py可以看到處理pdf 的所有流程如下。marker 先通過以下流程,把pdf 解析為 document(抽象語法樹),然后將document 渲染為json,html 或者markdown 格式。

default_processors: Tuple[BaseProcessor, ...] = (OrderProcessor,LineMergeProcessor,BlockquoteProcessor,CodeProcessor,DocumentTOCProcessor,EquationProcessor,FootnoteProcessor,IgnoreTextProcessor,LineNumbersProcessor,ListProcessor,PageHeaderProcessor,SectionHeaderProcessor,TableProcessor,LLMTableProcessor,LLMTableMergeProcessor,LLMFormProcessor,TextProcessor,LLMInlineMathLinesProcessor,LLMComplexRegionProcessor,LLMImageDescriptionProcessor,LLMEquationProcessor,LLMHandwritingProcessor,LLMMathBlockProcessor,ReferenceProcessor,DebugProcessor,)

通用格式處理

  1. OrderProcessor - 用于處理文檔中元素的順序,確保各部分內容按照正確的邏輯順序排列,比如調整段落、列表項等的先后順序。
  2. LineMergeProcessor - 對分割的行進行合并操作。在OCR處理或文檔解析過程中,文本可能會被錯誤地分割成多行,該處理器會將相關的行合并成合理的段落或語句。
  3. LineNumbersProcessor - 處理文檔中的行號信息。它可以識別、提取或添加行號,也可能對行號的格式和編號規則進行調整,以符合特定的輸出要求。

特定元素處理

  1. BlockquoteProcessor - 專門處理文檔中的塊引用內容。它會識別塊引用的起始和結束位置,對其進行格式化,例如添加特定的縮進或標記來區分塊引用與普通文本。
  2. CodeProcessor - 處理代碼塊。會識別代碼塊的邊界,對代碼進行語法高亮處理(如果需要),并確保代碼的格式在轉換過程中保持正確,例如保留縮進、換行等。
  3. ListProcessor - 處理列表元素,包括有序列表和無序列表。它會識別列表項的格式,確保列表的編號或標記正確顯示,并且處理列表嵌套等復雜情況。
  4. PageHeaderProcessor - 處理文檔頁面的頁眉部分。可以識別頁眉內容,對其進行提取、格式化或去除不必要的信息,以保證頁眉內容在輸出中正確顯示。
  5. SectionHeaderProcessor - 處理文檔中的章節標題。它會識別不同級別的章節標題,根據標題的層次結構進行相應的格式化,例如設置不同的字體大小、加粗等,以體現章節的主次關系。
  6. TableProcessor - 處理文檔中的表格。會識別表格的結構,包括表頭、表體、單元格等,對表格進行格式化,確保表格的布局和內容在轉換后正確顯示,可能還會處理表格的合并單元格等情況。

特定內容處理

  1. DocumentTOCProcessor - 生成文檔的目錄(TOC)。它會分析文檔中的章節標題,根據標題的層次結構生成目錄,并為每個目錄項添加對應的頁碼或鏈接,方便讀者快速定位文檔內容。
  2. EquationProcessor - 處理文檔中的數學公式。會識別公式的格式,可能會將公式轉換為特定的表示形式,如LaTeX代碼,以便在后續的渲染中正確顯示數學內容。
  3. FootnoteProcessor - 處理文檔中的腳注。它會識別腳注的引用標記和腳注內容,將腳注正確地放置在頁面底部或文檔末尾,并處理腳注與正文的關聯。
  4. TextProcessor - 對普通文本進行處理,包括文本的清理、替換、大小寫轉換等操作,以確保文本的質量和一致性。
  5. ReferenceProcessor - 處理文檔中的參考文獻。它會識別參考文獻的格式,對其進行整理和格式化,使其符合特定的引用規范,如APA、MLA等。
    基于大語言模型(LLM)的處理
  6. LLMTableProcessor - 利用大語言模型對表格進行處理。可以對表格內容進行語義分析、補充缺失信息、優化表格結構等,以提高表格處理的質量和智能化程度。
  7. LLMTableMergeProcessor - 使用大語言模型來處理表格合并的情況。當文檔中有多個相關表格需要合并時,該處理器借助大語言模型的理解能力,合理地合并表格內容,確保合并后的表格邏輯清晰。
  8. LLMFormProcessor - 利用大語言模型處理文檔中的表單。可以識別表單的字段、填寫要求,甚至可以根據上下文對表單內容進行自動填充或驗證。
  9. LLMInlineMathLinesProcessor - 借助大語言模型處理行內數學公式。它可以對行內數學公式進行更準確的識別和轉換,提高公式處理的準確性和可讀性。
  10. LLMComplexRegionProcessor - 處理文檔中的復雜區域,這些區域可能包含多種類型的元素,如文本、圖像、表格等。大語言模型可以幫助理解這些復雜區域的結構和語義,進行更合理的處理和轉換。
  11. LLMImageDescriptionProcessor - 利用大語言模型為文檔中的圖像生成描述信息。可以根據圖像的內容、上下文等生成準確的圖像描述,提高文檔的可訪問性和信息完整性。
  12. LLMEquationProcessor - 結合大語言模型處理數學公式。與普通的 EquationProcessor 相比,它可以利用大語言模型的語義理解能力,對公式進行更深入的分析和處理,例如對公式進行解釋、推導等。
  13. LLMHandwritingProcessor - 使用大語言模型處理手寫內容。可以識別手寫文字,將其轉換為可編輯的文本,并對識別結果進行優化和糾錯,提高手寫內容處理的準確性。
  14. LLMMathBlockProcessor - 借助大語言模型處理獨立的數學塊。它可以對數學塊進行更細致的分析和處理,確保數學塊的內容和格式在轉換后正確顯示,同時可能會對數學塊進行語義解釋等操作。

調試相關

  1. DebugProcessor - 主要用于調試目的。它可以輸出一些調試信息,幫助開發者檢查文檔處理過程中的中間結果、變量值等,以便發現和解決問題。 這些處理器共同作用,對PDF文檔進行全面、細致的解析和處理,以實現將PDF轉換為其他格式(如Markdown)的功能。

其它類型的文件處理方式:

  • 對于docx,marker使用mammoth庫把docx轉換成HTML,然后再用weasyprint庫把HTML轉成PDF。中間隔了一個HTML,效果很差,親測不如用 wps 把docx 轉pdf。

  • 對于pptx,使用python-pptx庫解析pptx元素,然后轉化成HTML,再用weasyprint 將 HTML 渲染為 PDF。

  • 對于xlsx,使用openpyxl庫的 load_workbook 加載 XLSX 文件,將每個工作表轉換為包含合并單元格處理的 HTML 表格。通過weasyprint 轉成pdf。

Renderers

marker 提供了三種格式的輸出:json、html、markdown,它們的代碼都在marker/renderers。這三種格式包含的信息不是相同的,以下是分析:

  • 因為 document 最容易轉化為 json(都是樹結構可以直接轉),所以 json 包含的信息最多(比如包含了caption 的分類結果,還有目標檢測bbox 框),但因為過于復雜所以一般用不上。
  • html 是可視化效果最好的,尤其是表格,marker 對表格的解析非常驚艷,不僅文本精確識別,而且能識別出復雜的表結構(比如合并單元格),這些都能用 html 很好的渲染。
  • markdown 包含的信息量最少,但是勝在簡單,在 RAG 任務中適合作為下游 LLM 模型的輸入。注意markdown 是從html 轉換過來的而不是document,所以一些復雜結構(比如表格)會有失真。

renderers 中的代碼可讀性不錯,可以自己修改得到想要的輸出。比如我就修改過 markdown 的輸出,讓它包含頁碼、bbox、table html 等信息。

總結

marker 是一個非常優秀的基于深度學習的 pdf 解析工具,它可以在大部分場景下得到完美的解析結果,代碼可讀性和拓展性也很不錯,很難想象這是一個人獨自開發出來的。

marker 項目地址:https://github.com/VikParuchuri/marker

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

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

相關文章

ARM子程序調用與返回

子程序(也叫過程、函數、方法)是一個能被調用和執行并返回到調用點那條指令的代碼 段。 兩個問題:如何將參數傳遞給子程序或從子程序中傳遞出來?怎么從子程序返回到調用點? 指令BSR Proc_A調用子程序Proc_A。 處理器將…

算力經濟模型推演:從中心化到去中心化算力市場的轉變(區塊鏈+智能合約的算力交易原型設計)

一、算力經濟的歷史脈絡與范式轉移 1.1 中心化算力市場的演進困境 傳統算力市場以超算中心、云計算平臺為核心載體,其運營模式呈現強中心化特征。中國移動構建的"四算融合"網絡雖實現百萬級服務器的智能調度,但動態資源分配仍受制于集中式控…

小結: 接口類型和路由優先級

網絡接口類型 1. Bridge-if&#xff08;橋接接口&#xff09; 作用&#xff1a;用于橋接網絡&#xff0c;將多個接口或VLAN連接為一個廣播域&#xff0c;實現二層數據轉發。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 將接口加入…

mysql一些事

一.聯合查詢/多表查詢 聯合查詢關鍵在于笛卡爾積的過程 笛卡爾坐標積的排列組合 首先它會將兩個表用排列組合的方式進行排列組合。 表一 表二 進行排列組合 我們發現它的行是 兩個表的行相乘&#xff0c;列是兩表的列相加。 我們所看到的數據有合理的也有不合理的我們接下…

【工具】Open WebUI:本地化部署的AI交互平臺

文章目錄 一、Open WebUI 簡介二、核心功能詳解1. 多模型與多模態支持2. 本地RAG與文檔集成3. 開發與定制化能力4. 安全與權限管理5. 用戶體驗優化 三、安裝與部署指南1. 快速安裝方式2. 高級配置3. 常見問題 四、實際應用場景1. 個人隱私助手2. 企業知識庫3. 學術研究4. 創意工…

AutoGPT

一、簡介 是一個基于openAI研發的GPT4模型的一個開源應用程序&#xff0c;根據用戶指定的目標&#xff0c;自動生成所需的提示&#xff0c;并且執行需要多個步驟才能完成的項目&#xff0c;整個過程不需要人類干預和指導&#xff08;無監督學習&#xff09;&#xff0c;生成式…

[C++] 小游戲 決戰蒼穹

大家好&#xff0c;各位看到這個標題&#xff0c;斗破蒼穹什么時候改叫決戰蒼穹了&#xff1f;其實&#xff0c;因為版權等一系列問題&#xff0c;斗破蒼穹正式改名為決戰蒼穹&#xff0c;這個版本主要更新內容為解決了皇冠競技場太過影響游戲平衡&#xff0c;并且提高了一些裝…

Spring的數據庫編程

本內容采用最新SpringBoot3框架版本,視頻觀看地址:B站視頻播放 1. JdbcTemplate概述 針對數據庫操作,Spring框架提供了JdbcTemplate類,JdbcTemplate是一個模板類,Spring JDBC中的更高層次的抽象類均在JdbcTemplate模板類的基礎上創建。 JdbcTemplate類提供了操作數據庫…

Debezium MySqlValueConverters詳解

Debezium MySqlValueConverters詳解 1. 類的作用與功能 1.1 核心作用 MySqlValueConverters是Debezium中負責MySQL數據類型轉換的核心類,主要功能包括: 數據類型映射:將MySQL的數據類型映射到Kafka Connect的Schema類型值轉換:將MySQL的原始值轉換為Kafka Connect可用的…

進程與線程:06 操作系統之“樹”

操作系統核心知識回顧與思維訓練 在之前的學習中&#xff0c;我們深入探討了CPU管理相關內容。 CPU管理內容回顧&#xff1a;我們學習了CPU直觀管理方法&#xff0c;了解如何讓簡單程序執行&#xff0c;分析了CPU效率低下的原因及處理辦法&#xff0c;即實現多程序執行。接著…

Android Studio Profiler

1.我們想要查看自己方法的調用鏈&#xff0c;或者分析方法耗時的情況&#xff0c;可以選擇Android Studio的Profiler&#xff0c;比較方便快捷。如下&#xff1a; 2.基本的面板參數講解&#xff1a; 3.可以通過搜索&#xff0c;查看對應的方法&#xff0c;以及方法的調用鏈…

33、VS中提示“以下文件中的行尾不一致。是否將行尾標準化?“是什么意思?

在Visual Studio&#xff08;VS&#xff09;中遇到提示“以下文件中的行尾不一致。是否將行尾標準化&#xff1f;”時&#xff0c;意味著當前打開或正在編輯的文件內部存在行尾符&#xff08;EOL&#xff0c;End-Of-Line&#xff09;格式不統一的情況。以下是詳細解釋和應對建議…

頭歌實驗 庫、表、數據的創建管理與備份遷移

第1關&#xff1a;創建db_ebank數據庫 drop database IF EXISTS db_ebank;/********** Begin **********/ create database db_ebank; /********** End **********/show databases; 第2關&#xff1a;創建數據表并設置約束 1.任務要求 在 db_ebank 數據庫中創建相應8個數據…

同城跑腿小程序幫取幫送接單搶單預約取件智能派單同城配送全開源運營版源碼優創

一、源碼描述 這是一套同城跑腿小程序&#xff0c;基于FastadminUniapp框架&#xff0c;全開源無加密&#xff0c;可私有化部署&#xff0c;包含用戶端、騎手端和運營端&#xff08;后端&#xff09;&#xff0c;支持幫取/幫送模式&#xff0c;支持一鍵接單/搶單&#xff0c;主…

利用無事務方式插入數據庫解決并發插入問題

一、背景 由于項目中同一個網元&#xff0c;可能會被多個不同用戶操作&#xff0c;而且操作大部分都是以異步子任務形式進行執行&#xff0c;這樣就會帶來并發寫數據問題&#xff0c;本文通過利用無事務方式插入數據庫解決并發插入問題&#xff0c;算是解決問題的一種思路&…

Nuxt3還能用嗎?

Nuxt3還能用嗎&#xff1f; 前一段時間&#xff0c;我完成了整個產品&#xff0c;從Nuxt到Next的遷移&#xff0c;因為面臨了一些在框架層面就無法解決的問題。 payload json化 在所有的的Nuxt中&#xff0c;我們都能看到有這樣一個東西。 其實有這個東西也很正常&#xff0…

Dify 獲取天氣數據并以echarts圖表顯示

Dify 獲取天氣數據并以echarts圖表顯示 1. 創建一個 Chatflow2. 創建一個 HTTP 請求節點3. 創建一個代碼執行節點4. 創建一個直接回復節點5. 發布并預覽 1. 創建一個 Chatflow 2. 創建一個 HTTP 請求節點 請求地址&#xff1a;https://weather.cma.cn/api/climate?stationid5…

計算機圖形學編程(使用OpenGL和C++)(第2版)學習筆記 02.OpenGL圖像管線

1. OpenGL圖像管線 OpenGL&#xff08;Open Graphics Library&#xff09;是一個跨平臺的、功能強大的圖形渲染API&#xff0c;用于開發2D和3D圖形應用程序。它由Khronos Group維護&#xff0c;廣泛應用于游戲開發、圖形設計、虛擬現實等領域。 1.0.1. OpenGL的特點&#xff…

Linux架構篇、第1章_02源碼編譯安裝Apache HTTP Server 最新穩定版本是 2.4.62

Linux_基礎篇 歡迎來到Linux的世界&#xff0c;看筆記好好學多敲多打&#xff0c;每個人都是大神&#xff01; 題目&#xff1a;源碼編譯安裝Apache HTTP Server 最新穩定版本是 2.4.62 版本號: 1.0,0 作者: 老王要學習 日期: 2025.05.01 適用環境: Centos7 文檔說明 本文…

算法基礎學習|03二分

一、思路 &#xff08;1&#xff09;mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 &#xff08;2&#xff09;mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何選擇模…