RAG數據處理:PDF/HTML

RAG而言用戶輸入的數據通常是各種各樣文檔,本文主要采用langchain實現PDF/HTML文檔的處理方法

PDF文檔解析

PDF文檔很常見格式,但內部結構常常較復雜:

  • 復雜的版式布局
  • 多樣的元素(段落、表格、公式、圖片等)
  • 文本流無法直接獲取
  • 特殊元素如頁眉頁腳、側邊欄

主流分為兩類:

  1. 基于規則匹配(實戰不常用,效果差)

技巧:轉md

在實際應用中,我們經常會遇到這樣的情況:

  • PDF文檔中的數學公式在導入知識庫過程中變成亂碼
  • 解析過程極慢,特別是對于包含大量公式的長文檔

幾乎所有主流大模型都原生支持Markdown格式,它們的輸出也多采用Markdown,因此我們可以考慮選擇將pdf識別前轉為md格式。現在主流方法采用MinerU(star33k)
在這里插入圖片描述
在這里插入圖片描述

常規電子版解析

pdfplumber 對中文支持較好,且在表格解析方面表現優秀,但對雙攔文本的解析能力較差;pdfminer 和 PyMuPDF 對中文支持良好,但表格解析效果較弱;PyPDF2 對英文支持較好,但中文支持較差;papermage集成了pdfminer 和其他工具,特引適合處理論文場景。開發者可以根據實際業務場景的測試結果選擇合適的工具odfplumber 或 pdfminer 都是蘭不錯的選擇。

  1. PyMuPDF (fitz):功能強大的PDF解析庫,支持文本提取、表格識別和版面分析。

  2. LangChain中的解析器

    • PyMuPDFLoader:基于PyMuPDF的封裝,可提取文本和圖片
  3. 基于機器視覺的解析工具

    • 深度學習方案:如百度飛槳的PP-Structure、上海AI實驗室的MADU
    • 商業解決方案:如PDFPlumber、LlamaIndex的LlamaParse

代碼示例

# 使用LangChain的PyMuPDFLoader
from langchain.document_loaders import PyMuPDFLoaderloader = PyMuPDFLoader("example.pdf")
documents = loader.load()# 直接使用PyMuPDF進行高級解析
import fitz  # PyMuPDF# 打開PDF
doc = fitz.open("example.pdf")# 提取所有文本(按頁)
for page_num, page in enumerate(doc):text = page.get_text()print(f"頁面 {page_num + 1}:\n{text}\n")# 提取表格
for page_num, page in enumerate(doc):tables = page.find_tables()for i, table in enumerate(tables):# 轉換為pandas DataFramedf = table.to_pandas()print(f"頁面 {page_num + 1}, 表格 {i + 1}:\n{df}\n")# 提取圖片
for page_num, page in enumerate(doc):image_list = page.get_images(full=True)for img_index, img in enumerate(image_list):xref = img[0]  # 圖片的xref(引用號)image = doc.extract_image(xref)# 可以保存圖片或進行進一步處理print(f"頁面 {page_num + 1}, 圖片 {img_index + 1}: {image['ext']}")

含圖片電子版解析

基于深度學習匹配

比規則匹配有更好的效果
Layout-parser、Pp-StructureV2、PDF-Extract-Kit、pix2text、MinerU、 marker

HTML文檔解析

HTML是網頁的標準標記語言,包含文本、圖片、視頻等多種內容,通過不同標簽組織。

常用解析工具

  1. Beautiful Soup:Python中最常用的HTML解析庫,能通過標簽和CSS選擇器精確提取內容。

  2. LangChain中的解析器

    • WebBaseLoader:結合urllib和Beautiful Soup,先下載HTML再解析
    • BSHTMLLoader:直接解析本地HTML文件

代碼示例

# 使用LangChain的WebBaseLoader解析網頁
from langchain.document_loaders import WebBaseLoaderloader = WebBaseLoader("https://example.com")
documents = loader.load()# 使用Beautiful Soup定制解析
from bs4 import BeautifulSoup
import requestsresponse = requests.get("https://example.com")
soup = BeautifulSoup(response.text, "html.parser")# 提取所有代碼塊
code_blocks = soup.find_all("div", class_="highlight")
for block in code_blocks:print(block.get_text())# 提取所有標題和段落
content = []
for heading in soup.find_all(["h1", "h2", "h3"]):content.append({"type": "heading", "text": heading.get_text()})# 獲取標題后的段落for p in heading.find_next_siblings("p"):if p.find_next(["h1", "h2", "h3"]) == p:breakcontent.append({"type": "paragraph", "text": p.get_text()})

進階技巧

對于復雜的HTML頁面,可以考慮以下策略:

  • 使用CSS選擇器精確定位元素
  • 識別并過濾導航欄、廣告等無關內容
  • 保留文檔結構(標題層級關系)
  • 特殊處理表格、代碼塊等結構化內容

基于深度學習的通用文檔解析:以DeepDoc為例

傳統的解析方法各有局限,近年來基于深度學習的文檔解析技術取得了突破性進展。DeepDoc(來自RapidocAI)是一個典型代表,它采用機器視覺方式解析文檔。

DeepDoc的工作流程

  1. 文檔轉圖像:將PDF等文檔轉換為圖像
  2. OCR文本識別:識別圖像中的文本內容
  3. 布局分析:使用專門模型識別文檔布局結構
  4. 表格識別與解析:使用TSR(Table Structure Recognition)模型解析表格
  5. 內容整合:將識別的各部分內容整合成結構化數據

代碼示例

# 使用DeepDoc進行文檔解析
from rapidocr import RapidOCR
from deepdoc import LayoutAnalyzer, TableStructureRecognizer# 初始化模型
ocr = RapidOCR()
layout_analyzer = LayoutAnalyzer()
table_recognizer = TableStructureRecognizer()# 文檔OCR
image_path = "document.png"  # 可以是PDF轉換的圖像
ocr_result = ocr.recognize(image_path)
texts, positions = ocr_result# 布局分析
layout_result = layout_analyzer.analyze(image_path)
# 識別出的布局元素:標題、段落、表格、圖片等
elements = layout_result["elements"]# 處理識別到的表格
for element in elements:if element["type"] == "table":table_image = element["image"]# 表格結構識別table_result = table_recognizer.recognize(table_image)# 表格數據可轉換為CSV或DataFrametable_data = table_result["data"]# 整合所有內容
document_content = []
for element in sorted(elements, key=lambda x: x["position"]):if element["type"] == "title":document_content.append({"type": "title", "text": element["text"]})elif element["type"] == "paragraph":document_content.append({"type": "paragraph", "text": element["text"]})elif element["type"] == "table":document_content.append({"type": "table", "data": element["table_data"]})# 其他類型元素...

DeepDoc的優勢

  • 多格式支持:可處理PDF、Word、Excel、PPT、HTML等多種格式
  • 結構保留:準確識別文檔的層次結構和布局
  • 表格處理:精確解析復雜表格,包括合并單元格
  • 圖像處理:可提取和關聯文檔中的圖像內容
  • 多語言支持:支持中英文等多種語言的文檔解析

通用文檔解析:Unstructured庫

對于需要處理多種文檔格式但又不想為每種格式單獨編寫解析代碼的場景,Unstructured庫提供了統一的解決方案。

Unstructured的工作原理

Unstructured可自動識別文件格式,并調用相應的解析器提取內容,支持多種常見文檔格式。

代碼示例

from unstructured.partition.auto import partition# 自動識別文件格式并解析
elements = partition("document.pdf")  # 也可以是docx, pptx, html等# 提取所有文本元素
text_elements = [el for el in elements if hasattr(el, "text")]
for element in text_elements:print(element.text)# 根據元素類型處理
from unstructured.partition.html import partition_html
from unstructured.chunking.title import chunk_by_title# HTML特定解析
html_elements = partition_html("document.html")# 按標題分塊
chunks = chunk_by_title(elements)
for chunk in chunks:print(f"標題: {chunk.title}")print(f"內容: {chunk.text}")

構建文檔處理管道

在實際的RAG系統中,我們通常需要構建完整的文檔處理管道,將解析、清洗、分塊等步驟串聯起來。

完整處理流程示例

import os
from typing import List, Dict, Any
from langchain.document_loaders import PyMuPDFLoader, WebBaseLoader, UnstructuredExcelLoader
from langchain.text_splitter import RecursiveCharacterTextSplitterdef process_document(file_path: str) -> List[Dict[str, Any]]:"""處理各種格式的文檔,返回標準化的文檔塊"""# 根據文件擴展名選擇合適的加載器ext = os.path.splitext(file_path)[1].lower()if ext == ".pdf":loader = PyMuPDFLoader(file_path)elif ext == ".html" or ext == ".htm":# 假設是本地HTML文件with open(file_path, "r", encoding="utf-8") as f:content = f.read()loader = WebBaseLoader(file_path)elif ext in [".xlsx", ".xls"]:loader = UnstructuredExcelLoader(file_path)else:# 對于其他格式,使用Unstructuredfrom langchain.document_loaders import UnstructuredFileLoaderloader = UnstructuredFileLoader(file_path)# 加載文檔documents = loader.load()# 文本清洗(去除多余空格、特殊字符等)cleaned_documents = []for doc in documents:text = doc.page_content# 基本清洗text = text.replace("\n\n", " ").replace("\t", " ")text = ' '.join(text.split())  # 規范化空格# 更新文檔doc.page_content = textcleaned_documents.append(doc)# 文本分塊text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200,separators=["\n\n", "\n", ". ", " ", ""])chunks = text_splitter.split_documents(cleaned_documents)# 轉換為標準格式processed_chunks = []for chunk in chunks:processed_chunks.append({"text": chunk.page_content,"metadata": chunk.metadata,"source": file_path,"chunk_id": f"{os.path.basename(file_path)}_{chunks.index(chunk)}"})return processed_chunks# 使用示例
pdf_chunks = process_document("example.pdf")
html_chunks = process_document("example.html")
excel_chunks = process_document("example.xlsx")# 合并所有文檔的處理結果
all_chunks = pdf_chunks + html_chunks + excel_chunks# 現在可以將這些塊用于向量化和索引

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

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

相關文章

時源芯微| KY鍵盤接口靜電浪涌防護方案

KY鍵盤接口靜電浪涌防護方案通過集成ESD保護元件、電阻和連接鍵,形成了一道有效的防護屏障。當鍵盤接口受到靜電放電或其他浪涌沖擊時,該方案能夠迅速將過電壓和過電流引導至地,從而保護后續電路免受損害。 ESD保護元件是方案中的核心部分&a…

Java 原生網絡編程(BIO | NIO | Reactor 模式)

1、基本常識 Socket 是應用層與 TCP/IP 協議族通信的中間軟件抽象層,是一組接口,使用了門面模式對應用層隱藏了傳輸層以下的實現細節。TCP 用主機的 IP 地址加上主機端口號作為 TCP 連接的端點,該端點叫做套接字 Socket。 比如三次握手&…

OpenCV透視變換

概念 OpenCV 透視變換是將圖像從一個視平面投影到另一個視平面的過程,也叫投影映射 ,屬于空間立體三維變換。它基于透視原理,通過 33 的變換矩陣作用于圖像像素坐標來實現映射轉換 ,能模擬人眼或相機鏡頭觀看三維空間物體時的透視…

STM32F103定時器1每毫秒中斷一次

定時器溢出中斷,在程序設計中經常用到。在使用TIM1和TIM8溢出中斷時,需要注意“TIM_TimeBaseStructure.TIM_RepetitionCounter0;”,它表示溢出一次,并可以設置中斷標志位。 TIM1_Interrupt_Initializtion(1000,72); //當arr1…

數據庫——SQL約束窗口函數介紹

4.SQL約束介紹 (1)主鍵約束 A、基本內容 基本內容 p r i m a r y primary primary k e y key key約束唯一表示數據庫中的每條記錄主鍵必須包含唯一的值(UNIQUE)主鍵不能包含NULL值(NOT NULL)每個表都應…

【typenum】 8 常量文件(consts.rs)

一、源碼 這段代碼通過類型級編程(type-level programming)在編譯期實現數值計算。以下是常量定義部分: // THIS IS GENERATED CODE #![allow(missing_docs)] use crate::int::{NInt, PInt}; /** Type aliases for many constants.This fil…

第8講、Multi-Head Attention 的核心機制與實現細節

🤔 為什么要有 Multi-Head Attention? 單個 Attention 機制雖然可以捕捉句子中不同詞之間的關系,但它只能關注一種角度或模式。 Multi-Head 的作用是: 多個頭 多個視角同時觀察序列的不同關系。 例如: 一個頭可能專…

百度智能云千帆攜手聯想,共創MCP生態宇宙

5月7日,2025聯想創新科技大會(Tech World)在上海世博中心舉行,本屆大會以“讓AI成為創新生產力”為主題。會上,聯想集團董事長兼CEO楊元慶展示了包括覆蓋全場景的超級智能體矩陣,包括個人超級智能體、企業超…

【OpenCV】幀差法、級聯分類器、透視變換

一、幀差法(移動目標識別): 好處:開銷小,不怎么消耗CPU的算力,對硬件要求不高,但只適合固定攝像頭 1、優點 計算效率高,硬件要求 響應速度快,實時性強 直接利用連續幀…

數據庫遷移的藝術:團隊協作中的沖突預防與解決之道

title: 數據庫遷移的藝術:團隊協作中的沖突預防與解決之道 date: 2025/05/17 00:13:50 updated: 2025/05/17 00:13:50 author: cmdragon excerpt: 在團隊協作中,數據庫遷移腳本沖突是常見問題。通過Alembic工具,可以有效地管理和解決這些沖突。沖突預防的四原則包括功能分…

Linux常用命令43——bunzip2解壓縮bz2文件

在使用Linux或macOS日常開發中,熟悉一些基本的命令有助于提高工作效率,bunzip2可解壓縮.bz2格式的壓縮文件。bunzip2實際上是bzip2的符號連接,執行bunzip2與bzip2 -d的效果相同。本篇學習記錄bunzip2命令的基本使用。 首先查看幫助文檔&#…

盲盒:拆開未知的驚喜,收藏生活的儀式感

一、什么是盲盒?—— 一場關于“未知”的浪漫冒險 盲盒,是一種充滿神秘感的消費體驗: 🎁 盒中藏驚喜——每個盲盒外觀相同,但內含隨機商品,可能是普通款、稀有款,甚至是“隱藏款”;…

Android 中使用通知(Kotlin 版)

1. 前置條件 Android Studio:確保使用最新版本(2023.3.1)目標 API:最低 API 21,兼容 Android 8.0(渠道)和 13(權限)依賴庫:使用 WorkManager 和 Notificatio…

使用大模型預測急性結石性疾病技術方案

目錄 1. 數據預處理與特征工程偽代碼 - 數據清洗與特征處理數據預處理流程圖2. 大模型構建與訓練偽代碼 - 模型訓練模型訓練流程圖3. 術前預測系統偽代碼 - 術前風險評估術前預測流程圖4. 術中實時調整系統偽代碼 - 術中風險預警術中調整流程圖5. 術后護理系統偽代碼 - 并發癥預…

每日Prompt:生成自拍照

提示詞 幫我生成一張圖片:圖片風格為「人像攝影」,請你畫一張及其平凡無奇的iPhone對鏡自拍照,主角是穿著JK風格cos服的可愛女孩,在自己精心布置的可按風格的房間內的落地鏡前用后置攝像頭隨手一拍的快照。照片開啟了閃光燈&…

動態規劃-64.最小路徑和-力扣(LetCode)

一、題目解析 從左上角到右下角使得數字總和最小且只能向下或向右移動 二、算法原理 1.狀態表示 我們需要求到達[i,j]位置時數字總和的最小值,所以dp[i][j]表示:到達[i,j]位置時,路徑數字總和的最小值。 2.狀態轉移方程 到達[i,j]之前要先…

LeetCode LCR 010 和為 K 的子數組 (Java)

兩種解法詳解:暴力枚舉與前綴和哈希表尋找和為k的子數組 在解決數組中和為k的連續子數組個數的問題時,我們可以采用不同的方法。本文將詳細解析兩種常見的解法:暴力枚舉法和前綴和結合哈希表的方法,分析它們的思路、優缺點及適用…

OpenVLA (2) 機器人環境和環境數據

文章目錄 [TOC](文章目錄) 前言1 BridgeData V21.1 概述1.2 硬件環境 2 數據集2.1 場景與結構2.2 數據結構2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 3 close question3.1 英偉達環境3.2 LIBERO 環境更適合仿真3.3 4090 運行問題 前言 按照筆者之前的行業經驗, 數…

深度學習(第3章——亞像素卷積和可形變卷積)

前言: 本章介紹了計算機識別超分領域和目標檢測領域中常常使用的兩種卷積變體,亞像素卷積(Subpixel Convolution)和可形變卷積(Deformable Convolution),并給出對應pytorch的使用。 亞像素卷積…

大模型在腰椎間盤突出癥預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景 1.2 研究目的與意義 二、腰椎間盤突出癥概述 2.1 定義與病因 2.2 癥狀與診斷方法 2.3 治療方法概述 三、大模型技術原理與應用基礎 3.1 大模型的基本原理 3.2 大模型在醫療領域的應用現狀 3.3 用于腰椎間盤突出癥預測的可行性分析 四、…