文章目录
- LangChain-Unstructured 基础使用:PDF 与 Markdown 处理解析
-
- 一、核心依赖与库说明
- 二、核心类与方法详解
-
- 1.UnstructuredLoader
-
- (1)类原型与核心功能
- (2)初始化参数详解
- (3)核心方法详解
-
- ① `load()`
- ② `lazy_load()`
- ③ `aload()`(异步)
- ④ `alazy_load()`(异步)
- ⑤ `load_and_split()`
- (3)使用示例
-
- 示例 1:解析本地 PDF 文件(本地引擎,带后处理)
- 示例 2:通过 URL 加载网页内容
- 示例 3:使用 API 解析扫描型 PDF(OCR 识别)
- 2. UnstructuredFileLoader
- 3. `UnstructuredPDFLoader` 与 `UnstructuredMarkdownLoader`
-
- `UnstructuredPDFLoader`(PDF 专用)
- `UnstructuredMarkdownLoader`(Markdown 专用)
- 三、PDF 解析实战示例
-
- 示例 1:高精度解析含表格的 PDF
- 示例 2:处理扫描型 PDF(OCR 识别)
- 四、Markdown 解析实战示例
-
- 示例 3:解析含复杂结构的 Markdown
- 五、进阶技巧:后处理函数与元素过滤
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 或本地引擎解析文档。是处理非结构化文档的强大工具,其核心优势在于:
使用时需根据文档类型(文本/扫描 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 适配特性)
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 适配特性)
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() 方法保留了合并元素的元数据(如最早的页码),确保溯源性。
评论前必须登录!
注册