分割器概述
HTMLHeaderTextSplitter
当您想根据标题保留文档的层次结构时很有用。
<h1>、<h2>、<h3> 等)分割 HTML 文本,并为与任何给定块相关的每个标题添加元数据。
功能:
- 在 HTML 元素级别分割文本。
- 保留文档结构中编码的丰富上下文信息。
- 可以逐个元素返回块,或将具有相同元数据的元素组合在一起。
HTMLSectionSplitter
当您想将 HTML 文档分割成更大的部分(例如
<section>、<div> 或自定义定义的部分)时很有用。- 使用 XSLT 转换来检测和分割部分。
- 内部使用
RecursiveCharacterTextSplitter处理大部分。 - 考虑字体大小以确定部分。
HTMLSemanticPreservingSplitter
当您需要确保结构化元素不会跨块分割,保持上下文相关性时,这是理想的选择。
- 保留表格、列表和其他指定的 HTML 元素。
- 允许为特定 HTML 标签定义自定义处理程序。
- 确保文档的语义含义得到维护。
- 内置标准化和停用词移除
选择正确的分割器
- 使用
HTMLHeaderTextSplitter当:您需要根据标题层次结构分割 HTML 文档并维护有关标题的元数据。 - 使用
HTMLSectionSplitter当:您需要将文档分割成更大的、更通用的部分,可能基于自定义标签或字体大小。 - 使用
HTMLSemanticPreservingSplitter当:您需要将文档分割成块,同时保留表格和列表等语义元素,确保它们不会被分割并且它们的上下文得到维护。
| Feature | HTMLHeaderTextSplitter | HTMLSectionSplitter | HTMLSemanticPreservingSplitter |
|---|---|---|---|
| Splits based on headers | Yes | Yes | Yes |
| Preserves semantic elements (tables, lists) | No | No | Yes |
| Adds metadata for headers | Yes | Yes | Yes |
| Custom handlers for HTML tags | No | No | Yes |
| Preserves media (images, videos) | No | No | Yes |
| Considers font sizes | No | Yes | No |
| Uses XSLT transformations | No | Yes | No |
示例 HTML 文档
让我们使用以下 HTML 文档作为示例:使用 HTMLHeaderTextSplitter
HTMLHeaderTextSplitter 是一个”结构感知”文本分割器,它在 HTML 元素级别分割文本,并为与任何给定块”相关”的每个标题添加元数据。它可以逐个元素返回块,或将具有相同元数据的元素组合在一起,目标是 (a) 在语义上保持相关文本分组(或多或少)和 (b) 保留文档结构中编码的丰富上下文信息。它可以与其他文本分割器一起使用,作为分块管道的一部分。 它类似于用于 Markdown 文件的 MarkdownHeaderTextSplitter。 要指定要分割的标题,请在实例化HTMLHeaderTextSplitter 时指定 headers_to_split_on,如下所示。
HTMLHeaderTextSplitter 时指定 return_each_element=True:
Document 返回:
如何从 URL 或 HTML 文件分割:
要从 URL 直接读取,请将 URL 字符串传递给split_text_from_url 方法。
同样,本地 HTML 文件可以传递给 split_text_from_file 方法。
如何限制块大小:
HTMLHeaderTextSplitter 基于 HTML 标题进行分割,可以与另一个基于字符长度限制分割的分割器(如 RecursiveCharacterTextSplitter)组合使用。
这可以使用第二个分割器的 .split_documents 方法来完成:
限制
HTML 文档之间可能存在相当大的结构变化,虽然HTMLHeaderTextSplitter 会尝试将所有”相关”标题附加到任何给定块,但它有时可能会遗漏某些标题。例如,算法假设信息层次结构,其中标题始终位于关联文本”上方”的节点,即先前的兄弟节点、祖先节点及其组合。在以下新闻文章(截至本文档编写时)中,文档的结构使得顶级标题的文本虽然标记为 “h1”,但与我们认为它应该”位于上方”的文本元素位于不同的子树中——因此我们可以观察到 “h1” 元素及其关联文本不会出现在块元数据中(但在适用的情况下,我们确实看到 “h2” 及其关联文本):
使用 HTMLSectionSplitter
在概念上类似于 HTMLHeaderTextSplitter,HTMLSectionSplitter 是一个”结构感知”文本分割器,它在元素级别分割文本,并为与任何给定块”相关”的每个标题添加元数据。它允许您按部分分割 HTML。
它可以逐个元素返回块,或将具有相同元数据的元素组合在一起,目标是 (a) 在语义上保持相关文本分组(或多或少)和 (b) 保留文档结构中编码的丰富上下文信息。
使用 xslt_path 提供绝对路径以转换 HTML,以便它可以基于提供的标签检测部分。默认是使用 data_connection/document_transformers 目录中的 converting_to_header.xslt 文件。这是为了将 HTML 转换为更容易检测部分的格式/布局。例如,基于字体大小的 span 可以转换为标题标签以被检测为部分。
如何分割 HTML 字符串:
如何限制块大小:
HTMLSectionSplitter 可以与其他文本分割器一起使用,作为分块管道的一部分。在内部,当部分大小大于块大小时,它使用 RecursiveCharacterTextSplitter。它还考虑文本的字体大小,根据确定的字体大小阈值来确定它是否是部分。
使用 HTMLSemanticPreservingSplitter
HTMLSemanticPreservingSplitter 旨在将 HTML 内容分割成可管理的块,同时保留重要元素(如表格、列表和其他 HTML 组件)的语义结构。这确保了这些元素不会跨块分割,从而避免丢失上下文相关性,例如表格标题、列表标题等。
这个分割器的核心设计是创建上下文相关的块。使用 HTMLHeaderTextSplitter 进行一般递归分割可能会导致表格、列表和其他结构化元素在中间被分割,丢失重要上下文并创建不良块。
HTMLSemanticPreservingSplitter 对于分割包含表格和列表等结构化元素的 HTML 内容至关重要,特别是在保持这些元素完整至关重要时。此外,它为特定 HTML 标签定义自定义处理程序的能力使其成为处理复杂 HTML 文档的多功能工具。
重要:max_chunk_size 不是块的确定最大大小,最大大小的计算发生在保留内容不是块的一部分时,以确保它不会被分割。当我们将保留的数据添加回块时,块大小可能会超过 max_chunk_size。这对于确保我们维护原始文档的结构至关重要
注意事项:
- 我们定义了一个自定义处理程序来重新格式化代码块的内容
- 我们为特定的 HTML 元素定义了一个拒绝列表,以在预处理中分解它们及其内容
- 我们有意设置了一个小块大小以演示元素的不分割
保留表格和列表
在此示例中,我们将演示HTMLSemanticPreservingSplitter 如何在 HTML 文档中保留表格和大型列表。块大小将设置为 50 个字符,以说明分割器如何确保这些元素不会被分割,即使它们超过定义的最大块大小。
说明
在此示例中,HTMLSemanticPreservingSplitter 确保整个表格和无序列表(<ul>)在其各自的块中保留。即使块大小设置为 50 个字符,分割器也会识别这些元素不应被分割并保持它们完整。
这在处理数据表或列表时尤其重要,分割内容可能导致上下文丢失或混淆。生成的 Document 对象保留这些元素的完整结构,确保信息的上下文相关性得到维护。
使用自定义处理程序
HTMLSemanticPreservingSplitter 允许您为特定 HTML 元素定义自定义处理程序。某些平台具有 BeautifulSoup 无法原生解析的自定义 HTML 标签,当发生这种情况时,您可以利用自定义处理程序轻松添加格式化逻辑。
这对于需要特殊处理的元素特别有用,例如 <iframe> 标签或特定的 ‘data-’ 元素。在此示例中,我们将为 iframe 标签创建一个自定义处理程序,将它们转换为类似 Markdown 的链接。
说明
在此示例中,我们为iframe 标签定义了一个自定义处理程序,将它们转换为类似 Markdown 的链接。当分割器处理 HTML 内容时,它使用此自定义处理程序转换 iframe 标签,同时保留其他元素(如表格和列表)。生成的 Document 对象显示 iframe 如何根据您提供的自定义逻辑进行处理。
重要:当保留链接等项目时,您应该注意不要在分隔符中包含 .,或让分隔符为空。RecursiveCharacterTextSplitter 在句号处分割,这会将链接切成两半。确保您提供带有 . 的分隔符列表。
使用自定义处理程序通过 LLM 分析图像
使用自定义处理程序,我们还可以覆盖任何元素的默认处理。一个很好的例子是在文档中插入图像的语义分析,直接在分块流程中。 由于我们的函数在发现标签时被调用,我们可以覆盖<img> 标签并关闭 preserve_images 以插入我们想要嵌入块中的任何内容。
说明:
使用我们编写的自定义处理程序从 HTML 中的<img> 元素提取特定字段,我们可以使用我们的代理进一步处理数据,并将结果直接插入我们的块中。确保 preserve_images 设置为 False 很重要,否则将执行 <img> 字段的默认处理。