from unstructured.partition.pdf import partition_pdf
from unstructured.chunking.title import chunk_by_title
partition_pdf
和 chunk_by_title
初看有点像,都在"分块",但是它们的本质完全不一样。
先看它们核心区别
partition_pdf | chunk_by_title | |
---|---|---|
是什么? | 把PDF文件里的东西分成"小单元"(比如标题、正文、表格、图片) | 把已经分好的小单元,按照"标题"去组合成完整段落或章节 |
输入是? | PDF 文件本身 | partition_pdf 处理后的小单元列表 |
输出是? | 小块小块的元素(title, text, table, image…),但每块可能很碎 | 章节级别的大块,一章一章连在一起 |
什么时候用? | 一开始拿到 PDF 时,想"拆开原始内容" | 后处理,用来按"标题"智能组织文本 |
举例 | 像拿一张纸撕成小碎片 | 把碎片按章节重新组装成故事书 |
更直白的类比(重点)
假设我们有一份 PDF :
第一页:大标题:机器学习入门内容:机器学习是...第二页:小标题:监督学习内容:监督学习是...第三页:小标题:无监督学习内容:无监督学习是...
partition_pdf
做的事情是:
- 机器地扫描这份 PDF,把它切成最小的独立单元:
- 一个标题是一个单元
- 一个段落是一个单元
- 一个表格是一个单元
- 一个图片是一个单元
- 它分得非常细!
- 得到的列表元素长得像:
[标题:机器学习入门]
[段落:机器学习是...]
[标题:监督学习]
[段落:监督学习是...]
[标题:无监督学习]
[段落:无监督学习是...]
注意:这里标题和正文是分开的,互相不连着!
chunk_by_title
做的事情是:
- 拿到上面这些小碎片后,按照标题出现的位置去智能组合,形成一个个逻辑完整的块。
- 比如遇到一个标题,就开始收集下面的段落,一直到下一个标题。
- 最后变成:
【第1块】机器学习入门机器学习是...
【第2块】监督学习监督学习是...
【第3块】无监督学习无监督学习是...
感觉很像一章一章的组织成册
总结成一句大白话
partition_pdf
是打碎 PDF 的锤子,
chunk_by_title
是按标题把碎片重新拼起来的胶水。
它俩是一个在"碎",一个在"组合",是配合使用的。
再用代码流程举例
from unstructured.partition.pdf import partition_pdf
from unstructured.chunking.title import chunk_by_title# 先拿到碎片(小元素)
elements = partition_pdf(filename="example.pdf")
# elements 是列表,每一项是一个小块(标题/段落/表格/图片等),彼此独立# 然后按标题组合
chunks = chunk_by_title(elements)
# chunks 是列表,每一项是按标题组织好的完整小节
直观对比一下数据结构
用 partition_pdf
后:
[Element(type="Title", text="机器学习入门"),Element(type="NarrativeText", text="机器学习是..."),Element(type="Title", text="监督学习"),Element(type="NarrativeText", text="监督学习是..."),Element(type="Title", text="无监督学习"),Element(type="NarrativeText", text="无监督学习是..."),
]
每个Element是小碎块,标题和正文是分开的。
用 chunk_by_title
后:
[Chunk(text="机器学习入门\n机器学习是..."),Chunk(text="监督学习\n监督学习是..."),Chunk(text="无监督学习\n无监督学习是..."),
]
每个Chunk是完整的一章章的内容了(标题和正文合在一起)。
为什么要这样设计?
- PDF 文件的格式五花八门,直接提取文本经常乱七八糟。
- 先 partition(打碎)是为了最大限度识别结构。
- 再 chunk(组装)是为了适配各种应用,比如做摘要、问答、索引库。
👉 否则你直接全文提取,一大坨,分不清哪里是标题哪里是正文,后续很难做高质量处理。
小结核心思想
阶段 | 目的 | 结果 |
---|---|---|
partition_pdf | 最大限度地细致识别 PDF 结构 | 生成"元素列表" |
chunk_by_title | 根据标题组织结构,便于后续处理 | 生成"章节列表" |
💪 一个超直观的小演示!
场景设定(假设有一个简单的 PDF)
PDF 内容:
第1页:【大标题】人工智能入门【正文】人工智能是计算机科学的一个分支...第2页:【小标题】机器学习【正文】机器学习是人工智能的重要子领域...第3页:【小标题】深度学习【正文】深度学习是机器学习中的一种方法...
第一步 —— partition_pdf
处理后的结果(碎片元素)
用 partition_pdf(filename="xxx.pdf")
得到的 elements
可能是这样:
elements = [Element(type="Title", text="人工智能入门"),Element(type="NarrativeText", text="人工智能是计算机科学的一个分支..."),Element(type="Title", text="机器学习"),Element(type="NarrativeText", text="机器学习是人工智能的重要子领域..."),Element(type="Title", text="深度学习"),Element(type="NarrativeText", text="深度学习是机器学习中的一种方法..."),
]
特点:
- 一个标题是一个元素
- 一个正文是一个元素
- 彼此是分开的
- 没有合并
第二步 —— chunk_by_title
把碎片重新组织
调用 chunk_by_title(elements)
后,得到的 chunks
是:
chunks = [Chunk(text="人工智能入门\n人工智能是计算机科学的一个分支..."),Chunk(text="机器学习\n机器学习是人工智能的重要子领域..."),Chunk(text="深度学习\n深度学习是机器学习中的一种方法..."),
]
特点:
- 一个 Chunk 里包含:
- 当前的标题
- 下面关联的正文
- 自动组合在一起了
- 更像一章一章的内容块了
过程动图类比(文字版)
[Title: 人工智能入门] ——→ 开始新块
[NarrativeText: 人工智能是...] ——→ 加到当前块[Title: 机器学习] ——→ 发现新标题!开始新块
[NarrativeText: 机器学习是...] ——→ 加到当前块[Title: 深度学习] ——→ 发现新标题!开始新块
[NarrativeText: 深度学习是...] ——→ 加到当前块
每遇到一个新的标题,就切断当前块,开启一个新的块。
对比一下结构变化(最直观表格版)
阶段 | 内容结构 |
---|---|
partition_pdf 后 | 一堆小碎片:标题、正文互相独立 |
chunk_by_title 后 | 每个标题带上对应正文,形成逻辑完整的小节 |
用代码跑一下:
from unstructured.partition.pdf import partition_pdf
from unstructured.chunking.title import chunk_by_title# 模拟 partition_pdf 出来的元素(实际是 Element 对象列表)
elements = [{"type": "Title", "text": "人工智能入门"},{"type": "NarrativeText", "text": "人工智能是计算机科学的一个分支..."},{"type": "Title", "text": "机器学习"},{"type": "NarrativeText", "text": "机器学习是人工智能的重要子领域..."},{"type": "Title", "text": "深度学习"},{"type": "NarrativeText", "text": "深度学习是机器学习中的一种方法..."},
]# 自己模拟 chunk_by_title 逻辑
chunks = []
current_chunk = Nonefor element in elements:if element["type"] == "Title":if current_chunk:chunks.append(current_chunk)current_chunk = element["text"] + "\n"else: # 不是标题,就是正文if current_chunk is not None:current_chunk += element["text"] + "\n"# 别忘了把最后一块也加进去
if current_chunk:chunks.append(current_chunk)# 打印结果
for i, chunk in enumerate(chunks, 1):print(f"第 {i} 块内容:\n{chunk}")
输出结果就是一章一章组织好的内容了!✅
终极总结:
partition_pdf 是把 PDF 精确切成最细单元,chunk_by_title 是让这些单元恢复成有逻辑的大块。
它们是前后搭配使用的,缺一不可。