文章目录
LangChain-Unstructured 基础使用:PDF 与 Markdown 处理解析
LangChain-Unstructured 作为 LangChain 生态中处理非结构化文档的核心工具,提供了丰富的类和方法来解析 PDF 和 Markdown 等格式。本文将系统讲解其核心库、关键类、方法参数及实战示例,帮助你全面掌握文档解析流程。
一、核心依赖与库说明
在使用 LangChain-Unstructured 处理 PDF 和 Markdown 时,需了解以下核心依赖及其作用:
库名称 | 功能说明 | 必备性 |
---|---|---|
langchain-community |
LangChain 社区版,包含 UnstructuredFileLoader 等核心解析类 |
必需 |
unstructured |
底层文档解析引擎,支持 20+ 文档格式的结构化转换 | 必需 |
unstructured[pdf] |
unstructured 的 PDF 解析扩展,包含 pdfminer 、pypdf 等解析器 |
处理 PDF 时必需 |
unstructured[md] |
Markdown 解析扩展,支持标题、列表、代码块等元素识别 | 处理 Markdown 时必需 |
pdf2image |
将 PDF 页面转换为图像(用于复杂排版或扫描件解析) | 可选(高精度 PDF 解析时需用) |
python-multipart |
支持多部分文档解析(如包含附件的 PDF) | 可选 |
安装命令:
# 基础安装(含 PDF 和 Markdown 支持)
pip install langchain-community unstructured[pdf,md] pdf2image
二、核心类与方法详解
LangChain-Unstructured 中最核心的类是 UnstructuredFileLoader
(通用文件加载器)和衍生的 UnstructuredPDFLoader
、UnstructuredMarkdownLoader
(专用加载器)。以下详细讲解其用法。
1.UnstructuredLoader
UnstructuredLoader
是 langchain-unstructured
库中用于加载和解析非结构化文档的核心类,它提供了更灵活的文档处理能力,支持本地文件、字节流、网页 URL 等多种输入方式,并可通过 API 或本地引擎解析文档。是处理非结构化文档的强大工具,其核心优势在于:
- 多输入支持:本地文件、字节流、网页 URL 全覆盖。
- 灵活解析方式:本地解析(离线)或 API 解析(高精度,支持复杂场景)。
- 可扩展处理:通过
post_processors
自定义文本清洗逻辑。 - 适配多场景:同步/异步、惰性/非惰性加载,满足不同性能需求。
使用时需根据文档类型(文本/扫描 PDF、网页等)和场景(离线/在线、同步/异步)选择合适的参数配置,解析后的 Document
对象可直接用于文本分割、向量存储等后续步骤,为 LLM 应用(如问答、摘要)提供结构化输入。以下是其详细使用指南:
(1)类原型与核心功能
类定义
class langchain_unstructured.document_loaders.UnstructuredLoader(
file_path: str | Path | list[str] | list[Path] | None = None,
*,
file: IO[bytes] | list[IO[bytes]] | None = None,
partition_via_api: bool = False,
post_processors: list[Callable[[str], str]] | None = None,
api_key: str | None = None,
client: UnstructuredClient | None = None,
url: str | None = None,
web_url: str | None = None,
**kwargs: Any,
)[source]
核心功能
- 支持多种输入源:本地文件路径、字节流(
IO[bytes]
)、网页 URL(web_url
)。 - 可选择本地解析或通过
Unstructured API
解析(partition_via_api
控制)。 - 提供文档后处理能力(
post_processors
),如文本清洗、格式转换等。 - 输出结构化的
Document
对象,包含文本内容(page_content
)和元数据(metadata
)。
(2)初始化参数详解
参数名 | 类型 | 功能说明 | 示例值 |
---|---|---|---|
file_path |
str / Path / 列表(可选) | 本地文件路径,支持单个或多个文件(列表形式)。与 file 、web_url 互斥,三选一。 |
"./report.pdf" 或 ["./a.pdf", "./b.md"] |
file |
IO[bytes] / 列表(可选) | 字节流对象(如打开的文件句柄),支持单个或多个。用于直接处理内存中的文件数据。 | open("doc.pdf", "rb") |
web_url |
str(可选) | 网页 URL,用于加载并解析网页内容(自动提取文本和结构)。 | "https://example.com/article" |
partition_via_api |
bool(默认 False) | 是否通过 Unstructured API 解析文档(需配置 api_key )。False 则使用本地引擎解析。 |
True (使用 API)、False (本地解析) |
post_processors |
列表[Callable[[str], str]](可选) | 文本后处理函数列表,每个函数接收字符串并返回处理后的字符串(如去除多余空格、替换特殊字符)。 | [lambda x: x.strip(), lambda x: x.replace("\n", " ")] |
api_key |
str(可选) | Unstructured API 的密钥,当 partition_via_api=True 时必填。可通过环境变量 UNSTRUCTURED_API_KEY 配置。 |
"your_api_key_here" |
client |
UnstructuredClient(可选) | 自定义的 UnstructuredClient 实例,用于高级 API 配置(如超时设置、代理等)。 |
UnstructuredClient(api_key="key", timeout=30) |
url |
str(可选) | Unstructured API 的服务地址,默认使用官方地址。仅当 partition_via_api=True 时有效。 |
"https://custom-unstructured-api.com" |
**kwargs |
任意键值对 | 传递给底层解析引擎的参数,如 strategy="hi_res" (高精度解析)、ocr_languages="chi_sim" (OCR 语言)等。 |
strategy="hi_res", pdf_infer_table_structure=True |
coordinates |
bool类型 | 配置是否在元数据中保留元素的坐标信息: ①启用后,解析结果的 metadata 会包含每个元素(如标题、段落)在文档中的位置坐标(如像素坐标、页面范围); ②适用于需要定位文本在原始文档中物理位置的场景(如高亮显示、文档对比,像有表格提取解析需求则避开)。 |
True |
(3)核心方法详解
① load()
load() → list[Document]
- 功能:同步加载并解析文档,返回
Document
对象列表。 - 适用场景:中小型文件,需一次性获取所有结果。
② lazy_load()
lazy_load() → Iterator[Document]
- 功能:同步惰性加载,返回迭代器,逐次生成
Document
对象。 - 适用场景:大型文件或批量处理,减少内存占用。
③ aload()
(异步)
async aload() → list[Document]
- 功能:异步加载并解析文档,返回
Document
列表。适用于异步代码环境(如asyncio
)。
④ alazy_load()
(异步)
async alazy_load() → AsyncIterator[Document]
- 功能:异步惰性加载,返回异步迭代器,通过
async for
逐次获取Document
。
⑤ load_and_split()
load_and_split(text_splitter: TextSplitter | None = None) → list[Document]
- 功能:加载文档后按指定的
TextSplitter
拆分内容,返回拆分后的Document
片段(用于 RAG 等场景)。 - 参数:
text_splitter
为文本分割器,默认使用RecursiveCharacterTextSplitter
。
(3)使用示例
示例 1:解析本地 PDF 文件(本地引擎,带后处理)
from langchain_unstructured.document_loaders import UnstructuredLoader
# 定义后处理函数:去除空白并替换换行
def clean_text(text: str) -> str:
return text.strip().replace("\n", " ")
# 初始化加载器
loader = UnstructuredLoader(
file_path="./example.pdf",
partition_via_api=False, # 本地解析
post_processors=[clean_text], # 应用文本清洗
strategy="hi_res", # 高精度解析
pdf_infer_table_structure=True # 解析表格结构
)
# 加载文档
documents = loader.load()
# 输出结果
print(f"解析得到 {len(documents)} 个文档元素")
print(f"第一个元素类型:{documents[0].metadata['category']}")
print(f"内容预览:{documents[0].page_content[:200]}")
预期输出
解析得到 15 个文档元素
第一个元素类型:Title
内容预览:2024 年技术趋势报告 本报告总结了 2024 年人工智能、区块链等领域的核心趋势,包含市场数据和案例分析。以下为主要内容:...
结果分析
- 本地解析模式无需 API 密钥,适合离线场景。
post_processors
成功去除了文本中的多余空白和换行,使内容更整洁。strategy="hi_res"
确保了复杂排版(如表格)的准确解析,元数据category
标记了元素类型(标题、段落等)。
示例 2:通过 URL 加载网页内容
from langchain_unstructured.document_loaders import UnstructuredLoader
# 初始化加载器(解析网页)
loader = UnstructuredLoader(
web_url="https://example.com/ai-trends", # 网页 URL
partition_via_api=False # 本地解析网页
)
# 惰性加载(逐元素获取)
for doc in loader.lazy_load():
print(f"元素类型:{doc.metadata['category']}")
print(f"内容:{doc.page_content[:150]}\n---")
预期输出
元素类型:Title
内容:2024 年人工智能发展趋势
---
元素类型:NarrativeText
内容:随着大模型技术的成熟,2024 年人工智能在各行各业的应用进一步深化,尤其是在医疗、教育和制造业...
---
元素类型:ListItem
内容:- 多模态模型成为主流,跨媒体理解能力显著提升
---
结果分析
web_url
参数直接加载网页并提取结构化元素(标题、段落、列表等),元数据category
标记了元素类型。lazy_load()
逐次返回元素,适合处理长网页,避免一次性加载占用过多内存。
示例 3:使用 API 解析扫描型 PDF(OCR 识别)
from langchain_unstructured.document_loaders import UnstructuredLoader
import os
# 配置 API 密钥(也可通过环境变量设置)
os.environ["UNSTRUCTURED_API_KEY"] = "your_api_key"
# 初始化加载器(API 解析 + OCR)
loader = UnstructuredLoader(
file_path="./scan_pdf.pdf", # 扫描型 PDF(图片内容)
partition_via_api=True, # 使用 API 解析
ocr_languages="eng+chi_sim" # 支持中英双语 OCR
)
# 异步加载(适合 API 调用,避免阻塞)
import asyncio
async def main():
docs = await loader.aload()
print(f"OCR 解析结果:{docs[0].page_content[:300]}")
asyncio.run(main())
预期输出
OCR 解析结果:这是一份扫描的报告,包含中英文内容。2024 年全球 AI 市场规模预计达到 2 万亿美元,同比增长 40%。Key points: 1. 生成式 AI 商业化加速;2. 边缘 AI 设备普及...
结果分析
partition_via_api=True
启用Unstructured API
,结合 OCR 技术成功识别扫描型 PDF 中的文本。ocr_languages
指定识别语言,确保中英双语内容准确提取。- 异步方法
aload()
适合 API 调用场景,提高代码效率。
2. UnstructuredFileLoader
UnstructuredFileLoader
是 LangChain-Unstructured 中设计最通用的本地文件加载器,其核心定位是作为各类非结构化文档(包括但不限于 PDF、Markdown、Word、HTML、TXT 等本地文件)的统一解析入口。它的底层通过调用 unstructured
库的多格式解析能力,能够根据文件的后缀名自动匹配对应的解析引擎(例如对 .pdf
文件启用 PDF 解析器,对 .md
文件启用 Markdown 解析器),无需开发者手动指定文件类型。
类原型
class UnstructuredFileLoader(BaseLoader):
def __init__(
self,
file_path: Union[str, Path],
mode: str = "single",
post_processors: Optional[List[Callable[[List[Element]], List[Element]]]] = None,
**unstructured_kwargs: Any,
) -> None:
"""
参数说明:
- file_path: 文件路径(字符串或 Path 对象)
- mode: 解析模式("single" 合并为单个文档;"elements" 按元素拆分)
- post_processors: 解析后处理函数列表(如过滤空文本)
-** unstructured_kwargs: 传递给 unstructured 库的原生参数
"""
核心参数解析
参数名 | 类型 | 功能详解 | 示例值 |
---|---|---|---|
file_path |
str/Path | 待解析文件的本地路径(必填) | “./docs/report.pdf” |
mode |
str | 解析后文档的组织方式: ① “single”:所有内容合并为一个 Document 对象 ② “elements”:按元素(标题、段落等)拆分为多个 Document 对象 |
“elements” |
post_processors |
List[Callable] | 对解析后的元素列表进行处理的函数(如过滤空白、合并短文本) | [lambda els: [e for e in els if e.text.strip()]] |
strategy |
str | 解析策略(通过 unstructured_kwargs 传递):① “fast”:快速解析(优先文本提取) ② “hi_res”:高精度解析(保留复杂结构) ③ “ocr_only”:强制 OCR 识别(扫描件) |
“hi_res” |
pdf_infer_table_structure |
bool | 是否解析 PDF 表格结构(仅 PDF 有效),设为 True 时表格转为 Markdown 格式 | True |
md_start_tag /md_end_tag |
str | Markdown 解析时的起始/结束标记(用于提取文档片段) | “”, “” |
方法:load()
功能:执行解析并返回文档列表
返回值:List[Document]
(每个 Document
含 page_content
文本和 metadata
元数据)
简单使用示例
from langchain_community.document_loaders import UnstructuredFileLoader
# 初始化加载器,解析一个简单的TXT文件(通用加载器支持多格式)
loader = UnstructuredFileLoader(
file_path="./sample.txt", # 任意格式文件路径
mode="single", # 合并为单个文档
strategy="fast" # 快速解析模式
)
# 执行解析
documents = loader.load()
# 输出结果
print(f"解析得到的文档数量:{len(documents)}")
print(f"文档内容预览:{documents[0].page_content[:200]}")
print(f"文档元数据:{documents[0].metadata}")
预期运行结果
解析得到的文档数量:1
文档内容预览:这是一个示例文本文件,包含简单的段落内容。
它用于演示UnstructuredFileLoader的基本功能,
该加载器能够自动识别文件类型并提取文本。
文档元数据:{'source': './sample.txt', 'filename': 'sample.txt'}
结果分析
- 示例中使用
UnstructuredFileLoader
解析 TXT 文件,无需额外配置格式参数,体现了其“通用”特性;mode="single"
模式下,所有文本被合并为一个Document
对象,适合需要完整文本的场景;- 元数据中包含文件来源(
source
)和文件名(filename
),便于追踪文档原始位置。
3. UnstructuredPDFLoader
与 UnstructuredMarkdownLoader
是 UnstructuredLoader
的子类,预配置了对应格式的解析参数,使用更简洁。
UnstructuredPDFLoader
(PDF 专用)
UnstructuredPDFLoader
是针对 PDF 格式优化的专用加载器,继承自 UnstructuredFileLoader
。它在通用加载器的基础上,预设了 PDF 解析的专属参数和引擎(如默认启用 pdfminer
解析器),能够更精准地处理 PDF 特有的结构(如页面布局、字体样式、嵌入表格等)。对于包含复杂排版(如多列文本、跨页表格、水印)的 PDF 文档,该加载器能通过内置的格式适配逻辑减少文本错乱问题。此外,它原生支持 PDF 特有的解析参数(如 pdf_infer_table_structure
用于表格识别),无需通过 unstructured_kwargs
间接传递,提升了代码的可读性。
类原型
class UnstructuredPDFLoader(UnstructuredFileLoader):
def __init__(
self,
file_path: Union[str, Path],
mode: str = "single",
post_processors: Optional[List[Callable[[List[Element]], List[Element]]]] = None,
**unstructured_kwargs: Any,
) -> None:
super().__init__(file_path, mode, post_processors,** unstructured_kwargs)
核心参数解析(与父类一致,重点强调 PDF 适配特性)
参数名 | 类型 | 功能详解(PDF 场景下) |
---|---|---|
file_path |
str/Path | 待解析 PDF 文件的本地路径(必填),需确保文件后缀为 .pdf |
mode |
str | 解析模式: - “single”:合并所有页面内容为单个文档 - “elements”:按 PDF 中的元素(标题、表格等)拆分 |
post_processors |
List[Callable] | 针对 PDF 解析结果的后处理函数(如过滤页眉页脚、合并跨页段落) |
**unstructured_kwargs | 任意键值对 | PDF 专用解析参数: - strategy :解析策略(“hi_res” 适合复杂排版 PDF)- pdf_infer_table_structure :是否解析表格结构- page_numbers :指定解析的页码列表(如 [1,3,5] ) |
- 与通用加载器的区别:默认启用 PDF 专用解析引擎,无需额外指定文件类型。
简单使用示例
from langchain_community.document_loaders import UnstructuredPDFLoader
# 初始化PDF专用加载器,解析含标题和段落的PDF
loader = UnstructuredPDFLoader(
file_path="./report.pdf",
mode="elements", # 按元素拆分
strategy="fast" # 快速解析
)
# 执行解析
documents = loader.load()
# 输出结果
print(f"解析得到的元素数量:{len(documents)}")
# 打印第一个元素的类型和内容
print(f"第一个元素类型:{documents[0].metadata['element_type']}")
print(f"第一个元素内容:{documents[0].page_content[:150]}")
预期运行结果
解析得到的元素数量:8
第一个元素类型:Title
第一个元素内容:2024年人工智能发展报告
========================================
发布日期:2024年1月
结果分析
- 专用加载器自动识别 PDF 中的标题元素(
element_type="Title"
),体现了对 PDF 格式的针对性优化; mode="elements"
模式下,文档按语义单元拆分,便于后续按元素类型(标题/段落等)筛选内容;- 无需手动指定文件类型,加载器默认使用 PDF 解析引擎,简化了配置。
UnstructuredMarkdownLoader
(Markdown 专用)
UnstructuredMarkdownLoader
是专为 Markdown 格式设计的加载器,继承自 UnstructuredFileLoader
。它深度适配 Markdown 的语法规则,能够精准识别标题层级(#
至 ######
)、列表(有序/无序)、代码块(```包裹)、引用(>
开头)等特有元素,并在元数据中标记对应的 element_type
(如 Header
、ListItem
、Code
)。对于包含嵌套结构(如列表中嵌套代码块)的复杂 Markdown 文档,该加载器能保持元素间的层级关系,避免解析错乱。与通用加载器相比,它无需自动判断文件类型,直接调用 Markdown 专用解析逻辑,解析效率和精度更高。
类原型
class UnstructuredMarkdownLoader(UnstructuredFileLoader):
def __init__(
self,
file_path: Union[str, Path],
mode: str = "single",
post_processors: Optional[List[Callable[[List[Element]], List[Element]]]] = None,
**unstructured_kwargs: Any,
) -> None:
super().__init__(file_path, mode, post_processors,** unstructured_kwargs)
核心参数解析(与父类一致,重点强调 Markdown 适配特性)
参数名 | 类型 | 功能详解(Markdown 场景下) |
---|---|---|
file_path |
str/Path | 待解析 Markdown 文件的本地路径(必填),需确保文件后缀为 .md 或 .markdown |
mode |
str | 解析模式: ① “single”:合并所有内容为单个文档 ② “elements”:按 Markdown 元素(标题、列表等)拆分 |
post_processors |
List[Callable] | 针对 Markdown 解析结果的后处理函数(如过滤注释、合并相邻文本) |
**unstructured_kwargs | 任意键值对 | Markdown 专用解析参数: ① md_start_tag /md_end_tag :提取指定标记包裹的内容② include_headers_footers :是否包含文档首尾的注释内容 |
- 特性:自动识别 Markdown 中的标题(
#
)、列表(-
/*
)、代码块(```)等元素。
简单使用示例
from langchain_community.document_loaders import UnstructuredMarkdownLoader
# 初始化Markdown专用加载器,解析含列表的文档
loader = UnstructuredMarkdownLoader(
file_path="./guide.md",
mode="elements" # 按元素拆分
)
# 执行解析
documents = loader.load()
# 筛选列表项元素
list_items = [doc for doc in documents if doc.metadata["element_type"] == "ListItem"]
# 输出结果
print(f"解析得到的列表项数量:{len(list_items)}")
print(f"第一个列表项内容:{list_items[0].page_content}")
预期运行结果
解析得到的列表项数量:3
第一个列表项内容:- 安装依赖:`pip install langchain-community unstructured`
结果分析
- 专用加载器精准识别 Markdown 中的列表项(
element_type="ListItem"
),保留了原始格式(包括-
符号和代码块标记);- 对于技术文档等富含结构化元素的 Markdown 文件,这种针对性解析能有效分离不同类型的内容,便于后续处理(如单独提取代码块)。
三、PDF 解析实战示例
示例 1:高精度解析含表格的 PDF
解析包含标题、段落和表格的复杂 PDF,保留表格结构。
from langchain_community.document_loaders import UnstructuredPDFLoader
# 1. 初始化加载器(高精度模式 + 解析表格)
loader = UnstructuredPDFLoader(
file_path="./example_pdf.pdf",
mode="elements", # 按元素拆分
strategy="hi_res", # 高精度解析
pdf_infer_table_structure=True # 解析表格为 Markdown 格式
)
# 2. 执行解析
documents = loader.load()
# 3. 输出解析结果(筛选关键元素)
print(f"共解析出 {len(documents)} 个元素")
for doc in documents[:4]: # 打印前4个元素
print(f"\n类型:{doc.metadata['element_type']}")
print(f"页码:{doc.metadata['page_number']}")
print(f"内容:{doc.page_content[:150]}...") # 预览前150字符
预期输出(这里具体内容根据文件内容来定,下面输出仅作参考)
共解析出 12 个元素
类型:Title
页码:1
内容:2023 人工智能行业报告...
类型:NarrativeText
页码:1
内容:人工智能(AI)行业在 2023 年迎来爆发式增长,全球市场规模突破 1.5 万亿美元,同比增长 37%...
类型:Table
页码:2
内容:| 领域 | 市场规模(亿美元) | 增长率 |
|------------|------------------|--------|
| 计算机视觉 | 4200 | 45% |
| 自然语言处理 | 3800 | 52% |...
类型:ListItem
页码:3
内容:1. 技术趋势:多模态模型成为主流,跨领域融合能力显著提升...
结果分析
- 解析结果按元素类型(标题、正文、表格、列表项)拆分,元数据包含页码和类型,便于后续筛选。
- 表格被转为 Markdown 格式(
| 字段 | 值 |
),保留了原始结构,可直接用于 LLM 处理或转换为 DataFrame。
示例 2:处理扫描型 PDF(OCR 识别)
对无法直接复制文本的扫描件 PDF,使用 OCR 策略解析。
loader = UnstructuredPDFLoader(
file_path="./scan_pdf.pdf", # 扫描型 PDF(图片内容)
mode="single", # 合并为单个文档
strategy="ocr_only", # 强制 OCR 识别
ocr_languages="eng+chi_sim" # 支持英文和中文
)
documents = loader.load()
print(f"OCR 解析结果:\n{documents[0].page_content[:500]}")
预期输出
OCR 解析结果:
这是一份扫描的中文报告,包含中英文混合内容。
报告摘要:
2023 年全球 AI 专利申请量达 12 万件,其中中国占比 45%,位居全球第一。
Key Findings:
- AI 芯片性能提升 300%,成本下降 50%...
结果分析
strategy="ocr_only"
强制启用 OCR 引擎,即使 PDF 是图片也能提取文本。ocr_languages
指定识别语言(chi_sim
为简体中文),确保多语言内容准确解析。
四、Markdown 解析实战示例
示例 3:解析含复杂结构的 Markdown
解析包含标题、代码块、公式的 Markdown 文件。
from langchain_community.document_loaders import UnstructuredMarkdownLoader
# 1. 初始化加载器
loader = UnstructuredMarkdownLoader(
file_path="./example_md.md",
mode="elements", # 按元素拆分
md_start_tag="<CONTENT>", # 可选:仅解析标签内的内容
md_end_tag="</CONTENT>"
)
# 2. 执行解析
documents = loader.load()
# 3. 输出解析结果
for doc in documents[:3]:
print(f"\n类型:{doc.metadata['element_type']}")
print(f"内容:{doc.page_content[:200]}...")
预期输出
类型:Header
内容:# 机器学习工作流详解...
类型:Paragraph
内容:机器学习工作流包含数据收集、预处理、模型训练、评估四个核心阶段,各阶段需紧密配合...
类型:Code
内容:```python
# 数据预处理示例
import pandas as pd
df = pd.read_csv("data.csv")
df = df.dropna() # 去除缺失值
```...
结果分析
- Markdown 中的元素被精准识别:
Header
(标题)、Paragraph
(段落)、Code
(代码块)。- 通过
md_start_tag
和md_end_tag
可提取文档中的特定片段(如仅解析<CONTENT>
标签包裹的内容),适合处理大型文档。
五、进阶技巧:后处理函数与元素过滤
解析后的元素可能包含空白文本或冗余内容,可通过 post_processors
优化。
from langchain_community.document_loaders import UnstructuredFileLoader
# 定义后处理函数:过滤空白文本 + 合并短文本
def filter_and_merge(elements):
# 1. 过滤空白元素
filtered = [e for e in elements if e.text.strip() and len(e.text) > 50]
# 2. 合并短文本(小于200字符的相邻元素)
merged = []
current = []
for e in filtered:
if current and len(" ".join([c.text for c in current])) + len(e.text) < 200:
current.append(e)
else:
if current:
merged.append(current)
current = [e]
if current:
merged.append(current)
# 3. 转换为合并后的元素
return [merged_elem[0].merge(merged_elem[1:]) for merged_elem in merged]
# 应用后处理函数
loader = UnstructuredFileLoader(
file_path="./example.pdf",
mode="elements",
post_processors=[filter_and_merge], # 启用后处理
strategy="fast"
)
documents = loader.load()
print(f"后处理后剩余 {len(documents)} 个元素")
预期输出
后处理后剩余 8 个元素
结果分析
- 后处理函数过滤了空白文本和过短元素(<50字符),并合并了相邻的短文本,减少了元素数量,便于后续处理。
element.merge()
方法保留了合并元素的元数据(如最早的页码),确保溯源性。