partition_pdf 和chunk_by_title 的区别

from unstructured.partition.pdf import partition_pdf
from unstructured.chunking.title import chunk_by_title

partition_pdfchunk_by_title 初看有点像,都在"分块",但是它们的本质完全不一样

先看它们核心区别

partition_pdfchunk_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 = None

for 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 是让这些单元恢复成有逻辑的大块。

它们是前后搭配使用的,缺一不可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值