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 是讓這些單元恢復成有邏輯的大塊。
它們是前后搭配使用的,缺一不可。