分割器概述
HTMLHeaderTextSplitter
适用于需要基于标题层级保留文档结构的情况。
<h1>、<h2>、<h3> 等)分割 HTML 文本,并为每个标题块添加相关元数据。
功能特性:
- 基于 HTML 元素层级进行分割
- 保留文档结构中编码的上下文丰富信息
- 支持按元数据合并元素或逐元素返回
HTMLSectionSplitter
适用于需要将 HTML 文档分割为较大区域的情况,如
<section>、<div> 或自定义区域。- 使用 XSLT 转换检测和分割区域
- 内部通过
RecursiveCharacterTextSplitter处理大区域 - 考虑字体大小确定区域范围
HTMLSemanticPreservingSplitter
适用于需要确保结构化元素(如表、列表等)不跨块分割,以保持上下文相关性的场景。
- 保留表格、列表等指定 HTML 元素
- 支持自定义 HTML 标签处理器
- 确保文档语义完整性
- 内置标准化与停用词过滤
选择合适的分割器
- 使用
HTMLHeaderTextSplitter时:需要基于标题层级分割文档并保留标题元数据 - 使用
HTMLSectionSplitter时:需要将文档分割为较大区域,可能基于自定义标签或字体大小 - 使用
HTMLSemanticPreservingSplitter时:需要分割文档块同时保留语义元素(如表格和列表)的完整性
示例 HTML 文档
使用 HTMLHeaderTextSplitter
HTMLHeaderTextSplitter 是一个”结构-aware”的 text splitter,能够在 HTML 元素级别分割文本并为每个与给定片段相关的头部添加元数据。它可以选择逐个返回元素或合并具有相同元数据的元素,目标包括(a)尽可能保持语义相关的文本分组(b)保留文档结构中编码的富含上下文的信息。它可与其它文本分割器结合,作为分块管道的一部分使用。 这与 MarkdownHeaderTextSplitter(用于 Markdown 文件)类似。 要指定要分割的头部,在实例化HTMLHeaderTextSplitter 时指定 headers_to_split_on,示例如下。
HTMLHeaderTextSplitter 时指定 return_each_element=True:
Document 形式返回:
从 URL 或 HTML 文件进行分割
直接从 URL 读取时,将 URL 字符串传入split_text_from_url 方法。
同样,本地 HTML 文件可通过 split_text_from_file 方法传入。
限制 chunk 大小
HTMLHeaderTextSplitter(基于 HTML 头部进行分割)可与 RecursiveCharacterTextSplitter(基于字符长度限制分割)等其它分割器组合。
可通过调用第二个分割器的 .split_documents 方法实现:
局限性
不同 HTML 文档的结构差异可能较大。虽然HTMLHeaderTextSplitter 会尝试为每个片段附加所有”相关”头部,但有时可能遗漏某些头部。例如,该算法假设头部始终位于关联文本所在的节点层级(即前序兄弟节点、祖先节点及其组合)。以下新闻文章(截至本文撰写时)的结构显示:顶层标题(h1 标签)位于独立子树中,其文本元素并不在预期层级(即与文本元素”上方”的节点)。因此,“h1” 元素及其关联文本未出现在片段元数据中(但适用时仍会显示”h2”及其关联文本):
使用 HTMLSectionSplitter
与 HTMLHeaderTextSplitter 类似,HTMLSectionSplitter 是一个”结构-aware”的 text splitter,能在元素级别分割文本并为每个与片段相关的头部添加元数据。它允许通过 HTML sections 进行分割。
它可以逐个元素返回块,也可以合并具有相同元数据的元素,目标是:(a) 使相关文本在语义上(或多或少)保持分组;(b) 保留文档结构中编码的上下文丰富信息。
使用 xslt_path 提供一个绝对路径来转换HTML以使其能够基于提供的标签检测章节。默认情况下使用 converting_to_header.xslt 文件在 data_connection/document_transformers 目录中。这用于将HTML转换为更易检测章节的格式/布局。例如 span 可以根据其字体大小转换为header标签以被检测为章节。
如何分割HTML字符串:
如何约束chunk大小:
HTMLSectionSplitter 可以与其他文本分割器一起作为分块管道使用。当章节大小超过chunk大小时,内部会使用 RecursiveCharacterTextSplitter。它还会根据确定的字体大小阈值判断文本是否为章节。
使用HTMLSemanticPreservingSplitter
HTMLSemanticPreservingSplitter 是专门设计用于在保持重要元素(如表格、列表和其他HTML组件)语义结构的同时将HTML内容分割为可管理块。这确保了此类元素不会被分割到不同块中,从而避免丢失表头、列表头等 contextual relevancy。
该分割器核心设计是创建具有上下文相关性的块。通用递归分割使用 HTMLHeaderTextSplitter 可能导致表格、列表等结构化元素在中间被分割,造成显著上下文丢失并产生不良块。
HTMLSemanticPreservingSplitter 对于包含表格和列表等结构化元素的HTML内容尤其重要,尤其是在需要保持这些元素完整时。此外,其支持为特定HTML标签定义自定义处理器的能力使其成为处理复杂HTML文档的灵活工具。
IMPORTANT: max_chunk_size 不是块的最终最大大小,计算最大大小发生在保留内容不属于块时以确保不被分割。当将保留数据重新添加到块中时,块大小可能超过 max_chunk_size。这至关重要以确保维护原始文档结构
注意事项:
- 我们为代码块内容定义了自定义处理器
- 预处理时为特定HTML元素定义了拒绝列表以分解其内容
- 故意设置较小的块大小以演示元素不分割
保留表格和列表
在这个示例中,我们将演示HTMLSemanticPreservingSplitter 如何在HTML文档中保留一个表格和一个大型列表。将块大小设置为50字符以说明分割器如何确保即使超出定义的最大块大小,这些元素也不会被分割。
解释
在这个示例中,HTMLSemanticPreservingSplitter 确保整个表格和基于 <ul> 的无序列表被保留在其 respective 块中。即使块大小设置为50字符,分割器仍识别这些元素不应被分割并保持完整。
这在使用数据表格或列表时尤为重要,分割内容可能导致上下文丢失或混淆。最终 @[Document] 对象保留了这些元素的全部结构,确保信息 contextual relevance 得以维持。
使用自定义处理器
HTMLSemanticPreservingSplitter 允许为特定HTML元素定义自定义处理器。某些平台可能包含 BeautifulSoup 无法原生解析的自定义HTML标签,此时可使用自定义处理器添加格式逻辑。
这特别适用于需要特殊处理的内容,如 <iframe> 标签或特定 ‘data-’ 元素。例如,我们创建一个自定义处理器将 iframe 标签转换为类似Markdown的链接。
解释
在这个示例中,我们为iframe 标签定义了自定义处理器将其转换为Markdown样式的链接。当分割器处理HTML内容时,会使用该自定义处理器转换 iframe 标签同时保留其他元素如表格和列表。最终 @[Document] 对象展示了如何根据您提供的自定义逻辑处理iframe。
Important: 当保留链接等项时,应避免在分隔符中包含 . 或留空分隔符。 RecursiveCharacterTextSplitter 以句点为分隔符会切割链接。请使用 . 定义分隔符列表。
使用自定义处理器分析带LLM的图像
通过自定义处理器,我们可以覆盖任何元素的默认处理。一个绝佳示例是直接在分块流程中插入对文档中图像的语义分析。 由于我们的函数在发现标签时被调用,我们可以覆盖<img> 标签并关闭 preserve_images 以插入任何希望嵌入块的内容。
解释:
我们为<img> 元素编写了自定义处理器以提取特定字段,进而通过智能体进一步处理数据并将结果直接插入块中。需确保 preserve_images 设置为 False 以避免 <img> 字段的默认处理。
官方原文:src/oss/python/integrations/splitters/split_html.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。