理解unstructured的Chunking:如何将大型图书馆变成易管理的小书架

理解unstructured的Chunking:如何将大型图书馆变成易管理的小书架

    • 原文链接
    • 什么是文档分块?
    • 分块的基本步骤
      • 1. 准备材料
      • 2. 设置分块大小
      • 3. 开始分块
      • 4. 查看结果
    • 特殊情况处理
    • 基本策略(basic)和按标题分块策略(by_title)
    • 如何恢复分块后的原始元素信息
    • 总结

大家好!今天我们来聊一聊文档分块。这个概念乍一听可能有点复杂,但其实很简单,就像我们整理一个大型图书馆一样。让我们用整理图书馆的例子来了解文档分块的过程吧!

原文链接

https://docs.unstructured.io/open-source/core-functionality/chunking#basic-chunking-strategy

您说得对,我同意切蛋糕的例子可能不是最恰当的。让我们换一个更贴切的例子来解释文档分块。我会以整理一个大型图书馆的书籍为例,重新撰写这篇文章。

什么是文档分块?

想象一下,你是一个图书管理员,负责管理一个巨大的图书馆。这个图书馆里有成千上万本书,如果所有书都堆在一起,想找到某一本书会非常困难。这时候,我们会怎么做呢?对了,我们会把书按照主题分类,放在不同的书架上。文档分块就是这个意思 - 把一个很长的文档分成更小、更容易管理和理解的部分。

分块的基本步骤

1. 准备材料

就像整理图书馆需要书籍、书架和分类标签一样,分块也需要一些基本的"原料"。在代码中,这些原料就是文档的不同部分,比如标题、段落等。

elements = [
    Title("世界历史"),
    NarrativeText("这是一本关于世界历史的综合介绍。"),
]

2. 设置分块大小

我们需要决定每个书架能放多少本书。在文档分块中,我们用字符数来衡量:

max_characters = 500  # 每个"书架"最多能放500个字符
new_after_n_chars = 400  # 最好是每个"书架"放400个字符左右

3. 开始分块

现在,我们开始整理图书…哦不,是分块文档:

chunks = chunk_elements(elements, max_characters=500, new_after_n_chars=400)

4. 查看结果

就像整理好图书后,我们会检查每个书架是否合理,文档分块后我们也会检查每个块:

for chunk in chunks:
    print(chunk.text)
    print("-" * 20)

特殊情况处理

有时候,我们可能会遇到一些特殊情况,比如:

  1. 特大书籍: 有些书可能特别厚,一个普通书架放不下。这就像文档中特别长的段落,我们需要把它分成几部分。

  2. 成套书籍: 有些书是一整套的,我们希望它们放在一起。在文档中,某些部分(如表格)也需要保持完整。

  3. 相关书籍: 有时候我们会在相邻的书架上放一些相关的书,以便查阅。在文档分块中,我们称之为"重叠",让每块有一点点内容重复。

overlap = 20  # 每个"书架"有20个字符的重叠

基本策略(basic)和按标题分块策略(by_title)

两种文本分块策略:基本策略(basic)和按标题分块策略(by_title)。我来解析一下它们的主要特点:

  1. 基本策略(basic):

    • 将连续的元素组合,以最大程度地填充每个块,同时遵守指定的最大字符数(硬上限)和新块起始字符数(软上限)。
    • 单个超过硬上限的元素会被隔离,并使用文本分割拆分为多个块。
    • 表格元素总是被隔离,不与其他元素组合。过大的表格也会被分割成多个TableChunk元素。
    • 如果指定了重叠,它会应用于由分割过大元素形成的块之间,当overlap_all为True时也应用于其他块之间。
  2. 按标题分块策略(by_title):
    包含基本策略的所有行为,并额外具有以下特点:

    • 保留章节边界,可选择性地保留页面边界。
    • 检测章节标题:遇到Title元素时,会关闭前一个块并开始新块。
    • 尊重页面边界:通过multipage_sections参数控制。默认为True,意味着页面中断不会开始新块。设为False会将不同页面上的元素分到不同块中。
    • 合并小节:使用combine_text_under_n_chars参数来合并较小的节,以避免产生过小的块。默认值与max_characters相同,可以设置为0以禁用节的合并。

这两种策略的主要区别在于by_title策略更注重保留文档的结构,特别是章节和标题的完整性,而basic策略则更关注于均匀地填充每个块到指定的大小。

如何恢复分块后的原始元素信息

  1. 分块过程中的信息损失:

    • 当多个文档元素被合并成一个块时,一些信息会自然丢失。
    • 例如,无法确定文本的具体来源元素,以及某些元数据(如页码和坐标)可能无法解析为单一值。
  2. 访问原始元素:

    • 可以通过 .metadata.orig_elements 字段访问组成块的原始元素。
    • 示例代码展示了如何创建一个包含标题和正文的块,然后访问其原始元素。
  3. 使用原始元素访问元数据:

    • 原始元素保留了所有原始元数据。
    • 可以用于访问那些无法可靠合并的元数据。
  4. 示例应用:

    • 获取页码集合:通过遍历原始元素,可以获取所有相关的页码。
    • 获取坐标信息:可以获取每个原始元素的坐标元数据。
    • 获取图像路径:可以从具有图像路径的原始元素中提取图像路径。

这段代码的主要目的是展示如何在分块后仍然保留和访问原始文档元素的详细信息。这对于需要精确元数据(如页码、坐标、图像路径等)的应用场景非常有用,因为这些信息在分块过程中可能会丢失或变得不明确。

通过 .metadata.orig_elements,用户可以在需要时轻松地回溯到原始文档结构和元数据,从而在保持文本分块效率的同时不损失重要的文档结构信息。

总结

通过这个整理图书馆的例子,我们了解了文档分块的基本概念。它就像把一个大图书馆变成许多有序的小书架,让每个人都能轻松找到想要的信息。同样,文档分块让我们能更容易地阅读和理解长文档。

下次当你看到一个很长的文章时,不妨想象它是一个大图书馆,然后试着把它分成小书架。这样不仅更容易理解,还能让阅读变得更有条理哦!

希望这篇文章能帮助你理解文档分块的概念。如果你有任何问题,欢迎在评论区留言。让我们一起学习,一起成长!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

上一篇博客,我们学习了在非选择下,以二项分布模拟遗传漂变的过程:【基于R语言群体遗传学】-7-遗传变异(genetic variation)-CSDN博客 那么我们之前有在代际之间去模拟,那么我们就想知道,遗传变…

LabVIEW透视变换

透视变换概述源程序在www.bjcyck.com下载 透视变换是一种几何变换,用于对图像进行扭曲,使其看起来从不同角度拍摄。这在计算机视觉和图像处理领域非常重要,例如在投影校正和图像配准中。LabVIEW提供了强大的图像处理工具,利用其V…

java生成json格式文件(包含缩进等格式)

生成json文件的同时保留原json格式&#xff0c;拥有良好的格式&#xff08;如缩进等&#xff09;&#xff0c;提供友善阅读支持。 pom.xml依赖增加&#xff1a; <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactI…

LabVIEW在图像处理中的应用

abVIEW作为一种图形化编程环境&#xff0c;不仅在数据采集和仪器控制领域表现出色&#xff0c;还在图像处理方面具有强大的功能。借助其Vision Development Module&#xff0c;LabVIEW提供了丰富的图像处理工具&#xff0c;广泛应用于工业检测、医学影像、自动化控制等多个领域…

Linux防火墙使用(firewalld与iptables)

防火墙概述 防火墙是一种由硬件和软件组合而成&#xff0c;在内部网和外部网之间、专有网和公共网之间构造的保护屏障&#xff0c;用以保护用户资料和信息安全的一种技术 防火墙作用在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题&#xff0c;从而实现…

Java | Leetcode Java题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; class Solution {int[][] dirs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};public List<String> findWords(char[][] board, String[] words) {Trie trie new Trie();for (String word : words) {trie.insert(word);}Set<String> a…

Apache Seata Mac下的Seata Demo环境搭建

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Mac下的Seata Demo环境搭建&#xff08;AT模式&#xff09; 前言 最近因为工作需要&#xf…

探讨3D沉浸式在线会议系统的研发 - Meta演示的元宇宙虚拟化身多人对话场景,Web端现在也可以实现了 !

要实现一个元宇宙多人会议系统&#xff0c;关键技术有&#xff1a; 1. 3D虚拟空间的构建&#xff08;含光影特效、虚拟现实和增强现实&#xff09; 2. 3D虚拟化身的构建&#xff08;含动画、表情、语音&#xff09; 3. 多人角色管理 4. 会话控制和信息同步 5. 语音合成 6…

免费的鼠标连点器电脑版教程!官方正版!专业鼠标连点器用户分享教程!2024最新

电脑技术的不断发展&#xff0c;许多用户在日常工作和娱乐中&#xff0c;需要用到各种辅助工具来提升效率或简化操作&#xff0c;而电脑办公中&#xff0c;鼠标连点器作为一种能够模拟鼠标点击的软件&#xff0c;受到了广大用户的青睐。本文将为大家介绍一款官方正版的免费鼠标…

对接海康sdk-linux下复制jar包中resource目录的文件夹

背景 在集成海康sdk时,需要将一些组件放到项目中作为静态资源,并且海康的sdk初始化也需要加载这些静态资源,在windows下,使用一些File路径的方式是可以正确加载的,但是在linux上就会加载失败。 首先我是将海康的sdk组件放到resource下的,并且按照windows和linux设置了两…

考虑数据库粒度的设计-提升效率

目录 概要 场景 设计思路 小结 概要 公开的资料显示&#xff0c;数据库粒度是&#xff1a;“在数据库领域&#xff0c;特别是数据仓库的设计中&#xff0c;粒度是一个核心概念&#xff0c;它直接影响到数据分析的准确性和存储效率。粒度的设定涉及到数据的详细程度和精度&…

CH11_JS的多重循环

第11章&#xff1a;Javascript的多重循环 本章目标 掌握二重循环的使用 掌握二重循环的控制语句的使用 课程回顾 循环控制有那几种方式 讲解内容 1. 回顾练习 需求说明 某次程序大赛&#xff0c;AI2101班有4名学员参加&#xff0c;学员的成绩由用户输入&#xff0c;计算…

文件系统技术架构分析

一文读懂&#xff1a;什么是文件系统 &#xff0c;有哪几类&#xff1f; ▉ 什么是文件系统&#xff1f; 技术大拿眉头皱了皱&#xff0c;忍住快要爆发的情绪。解释到&#xff1a; 数据以二进制形式存储于介质&#xff0c;但高低电平含义难解。文件系统揭秘这些二进制背后的意…

【踩坑】修复pyinstaller报错 No module named pkg_resources.extern

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 报错如下&#xff1a; 修复方法&#xff1a; pip install --upgrade setuptools pippyinstaller -F -w main.py --hidden-importpkg_resources.py2_wa…

前端位置布局汇总

HTML中脱离文档流的元素有&#xff1a; position: absolute - 元素相对于最近的已定位&#xff08;非 static&#xff09;祖先元素定位。 position: fixed - 元素相对于浏览器窗口定位。 float: left 或 float: right - 元素向左或向右浮动&#xff0c;周围的内容会环绕它。 …

认识流式处理框架Apache Flink

目录 一、Apache Flink 的基础概念 1.1 Apache Flink是什么&#xff1f; 1.2 Flink的定义 二、Apache Flink 的发展史 2.1 Flink前身Stratosphere 2.2 Flink发展时间线及重大变更 三、Flink核心特性 3.1 批流一体化 3.2 同时支持高吞吐、低延迟、高性能 3.3 支持事件时…

探索Linux:开源世界的无限可能

Linux是一款开源操作系统&#xff0c;它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生&#xff0c;他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下&#xff0c;Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…

分数的表示和运算方法fractions.Fraction()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 分数的表示和运算方法 fractions.Fraction() 选择题 以下代码三次输出的结果分别是&#xff1f; from fractions import Fraction a Fraction(1, 4) print(【显示】a ,a) b Fraction(1, 2…

网络基础:BGP协议

BGP&#xff08;边界网关协议&#xff0c;Border Gateway Protocol&#xff09;是一种用于在不同自治系统&#xff08;Autonomous Systems&#xff0c;AS&#xff09;之间交换路由信息的路径向量协议。BGP是互联网的核心路由协议之一&#xff0c;负责管理和维护互联网范围内的路…

为企业知识库选模型?全球AI大模型知识库RAG场景基准测试排名

大语言模型常见基准测试 大家对于AI模型理解和推理能力的的基准测试一定非常熟悉了&#xff0c;比如MMLU&#xff08;大规模多任务语言理解&#xff09;、GPQA&#xff08;研究生级别知识问答&#xff09;、GSMSK&#xff08;研究生数学知识考察&#xff09;、MATH&#xff08…