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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的医疗诊断辅助系统设计

标题:基于深度学习的医疗诊断辅助系统设计 内容:1.摘要 随着医疗数据的爆炸式增长和深度学习技术的飞速发展,开发基于深度学习的医疗诊断辅助系统具有重要的现实意义。本研究的目的在于设计一个高效、准确的医疗诊断辅助系统,以辅助医生进行更精准的诊断…

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟 前言一、PWM调制技术基本原理二、仿真模型中加入PWM调制三、逆变电路MOS管添加体二极管四、模拟添加机械负载五、仿真模型与控制框图文章相关模型文件下载链接参考链接 前言 本系列文…

Curl 全面使用指南

Curl(Client URL)是一个跨平台命令行工具,支持多种协议(HTTP/HTTPS/FTP/SFTP等),用于数据传输、API调试、文件上传/下载等场景。以下从 核心功能、用户疑问解答、高级技巧 三方面系统总结,并整合…

PyTorch中“原地”赋值的思考

在开发一个PyTorch模块时,遇到了一个诡异的现象,将他描述出来就是下面这样: f[..., :p_index - 1] f[..., 1:p_index] 这个操作将f张量的部分数值进行左移,我在模型训练的时候还能正常跑,但是当我将模型部署到项目中…

什么是:云边端一体化架构

什么是云边端一体化架构 文章目录 什么是云边端一体化架构云、边、端云计算边缘计算终端设备 云边端一体化协同云边端一体化架构协同的流程云边端一体化架构协同的应用云边端一体化架构协同的价值云边端一体化架构协同未来发展趋势 云、边、端 云(Cloud&#xff09…

gephi绘图

参考: 如何在Gephi中正确的显示中文? Gephi绘制网络图初步探索 gephi 节点标签 调节_图分析与可视化-从Gephi开始

马克·雷伯特:用算法让机器人飞奔的人

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 马克雷伯特:用算法让机器人飞奔的人 一、天才的起点 在机器人领域,有一个名字如雷贯耳——马克雷伯特(Marc Raibert)。作为波士顿动力公司(Boston…

三维装配可视化界面开发笔记

三维装配可视化界面开发笔记 项目概述 这是一个基于Vue.js和Three.js的三维装配可视化系统,用于展示机械零部件的装配和拆解过程。系统支持模型加载、拆解/装配路径生成、动画展示和工艺流程图生成等功能。 技术栈 前端框架: Vue 3 (使用组合式API)构建工具: Vi…

深⼊理解指针(8)

1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢? 因为PTR_T 真的被改为了 int* 在编译器中…

neo4j暴露公网ip接口——给大模型联通知识图谱

特别鸣谢 我的领导,我的脑子,我的学习能力,感动了 1. 搭建知识图谱数据库(见上一章博客) 这里不加赘述了,请参考上一篇博客搭建 2. FastApi包装接口 这里注意:NEO4J_URI不得写http:,只能写…

AI编程新选择!VSCode + RooCode,超越Cursor​

在当今快节奏的开发环境中,AI编程助手已经成为提升开发效率的关键工具。然而,面对众多选择,开发者往往陷入纠结:如何在众多AI编程工具中找到最适合自己的方案?尤其是当VSCode搭配RooCode时,相比Cursor&…

电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)

电子病历高质量语料库的构建是一个复杂而系统的工程,涉及数据收集、清洗、标注、验证等多个环节。在项目实施过程中,"环境聆听"和"自动化文档生成"是两个关键支撑要素,前者确保项目能够适应不断变化的技术和业务环境,后者则保障项目过程的可追溯性和知…

Python协程入门指北

一、什么是协程? 协程(Coroutine)就像可以暂停执行的函数,能够在执行过程中主动让出控制权,等准备好后再继续执行。 生活小例子 想象你在咖啡店排队: 普通函数:必须一直排到取餐&#xff08…

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用

资源获取链接: mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用说明资源-CSDN文库 详细作用 数据库服务器的核心文件: 这是一个压缩包,解压后包含 MySQL 数据库服务器的可执行文件、库文件、配置文件模板等。 它用于在 Linux 系统上安装…

C++笔记-继承(下)(包含派生类的默认成员函数,菱形继承等)

一.派生类的默认成员函数 1.14个常见默认成员函数 默认成员函数,默认的意思就是指我们不写,编译器会自动为我们生成一个,那么在派生类中,这几个成员函数是如何生成的呢? 1.派生类的构造函数必须调用基类的构造函数初…

C++中指针使用详解(3)数组、指针和函数参数传递的底层 ABI实现

要深入理解 数组、指针和函数参数传递 的底层 ABI(Application Binary Interface)实现,需要从以下几个维度出发进行学习: 一、什么是 ABI? ABI 是编译器和操作系统之间的协定,规定了: 函数如何…

【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器

测试 Python 版 RustDesk 中继服务器 测试我们实现的中继服务器有几种方法,从简单到复杂依次如下: 1. 基本连接测试客户端 创建一个简单的测试客户端来验证中继服务器的基本功能: 2. 用两个测试客户端测试中继功能 要测试完整的中继功能,你需要运行两个客户端实例来模拟…

Spring Boot集成Spring Cloud 2024(不使用Feign)

本文介绍Spring Boot集成Spring Cloud 2024,且不使用Feign,而是采用Spring 6自带的HttpExchange方式进行服务调用的详细步骤: 环境准备 Spring Boot版本:推荐使用Spring Boot 3.4.1及以上版本,以更好地与Spring Clou…

vue中$set原理

Vue 中的 $set 方法(Vue.set)主要用于 向响应式对象中添加一个新的属性,并确保这个新属性是响应式的,能够触发视图更新。 📌 背景问题:为什么需要 $set? 在 Vue 2 中,直接给对象新增…

Superset二次开发之深度解读系列:1.概述

Apache Superset 是一款现代化的企业级商业智能 Web 应用程序,专为数据探索和可视化而设计。本概述介绍了 Superset 的架构、核心组件和主要功能,以帮助开发人员了解该系统的工作原理。 What is Apache Superset? Apache Superset 是一个开源数据探索…