分割器概述
HTMLHeaderTextSplitter
当您希望根据文档的标题保留其分层结构时很有用。
<h1>、<h2>、<h3> 等)分割 HTML 文本,并为与任何给定块相关的每个标题添加元数据。 功能:- 在 HTML 元素级别分割文本。
- 保留文档结构中编码的富含上下文的信息。
- 可以逐个元素返回块,或将具有相同元数据的元素组合在一起。
HTMLSectionSplitter
当您希望将 HTML 文档分割成更大的部分时很有用,例如
<section>、<div> 或自定义定义的部分。- 使用 XSLT 转换来检测和分割部分。
- 内部对大段内容使用
RecursiveCharacterTextSplitter。 - 考虑字体大小来确定部分。
HTMLSemanticPreservingSplitter
**当您需要确保结构化元素不会跨块分割,从而保留上下文相关性时,这是理想选择。**
- 保留表格、列表和其他指定的 HTML 元素。
- 允许为特定的 HTML 标签使用自定义处理器。
- 确保文档的语义含义得以维护。
- 内置归一化和停用词去除
选择合适的分割器
- 在以下情况下使用
HTMLHeaderTextSplitter:您需要根据 HTML 文档的标题层级分割它,并维护有关标题的元数据。 - 在以下情况下使用
HTMLSectionSplitter:您需要将文档分割成更大、更通用的部分,可能基于自定义标签或字体大小。 - 在以下情况下使用
HTMLSemanticPreservingSplitter:您需要将文档分割成小块,同时保留表格和列表等语义元素,确保它们不被分割并保持其上下文。
| 功能 | HTMLHeaderTextSplitter | HTMLSectionSplitter | HTMLSemanticPreservingSplitter |
|---|---|---|---|
| 根据标题分割 | 是 | 是 | 是 |
| 保留语义元素(表格、列表) | 否 | 否 | 是 |
| 为标题添加元数据 | 是 | 是 | 是 |
| HTML 标签的自定义处理器 | 否 | 否 | 是 |
| 保留媒体(图像、视频) | 否 | 否 | 是 |
| 考虑字体大小 | 否 | 是 | 否 |
| 使用 XSLT 转换 | 否 | 是 | 否 |
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
HTMLSectionSplitter 在概念上类似于 HTMLHeaderTextSplitter,它是一个“结构感知”文本分割器,它在元素级别分割文本,并为任何给定块的“相关”标题添加元数据。它允许您按部分分割 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> 字段的默认处理。
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。