使用MarkdownHeaderTextSplitter按标题拆分Markdown文档

技术背景介绍

在处理聊天应用或者问答系统时,通常需要将输入文档分块以便于嵌入和向量存储。嵌入整段文本时,嵌入过程会考虑文本的上下文以及句子和短语之间的关系,这使得向量能够反映文本的更广泛含义和主题。然而,当我们处理Markdown文档时,以标题为基础进行分块显得尤为直观,这也是我们使用MarkdownHeaderTextSplitter的关键动机。

核心原理解析

MarkdownHeaderTextSplitter是一种工具,它能根据指定的标题集合将Markdown文档进行分割。通过这种方式,我们能够在保留上下文一致性的情况下高效地处理Markdown文件。

代码实现演示

下面我们将演示如何使用MarkdownHeaderTextSplitter进行Markdown文本的拆分。

安装依赖

首先,确保安装了所需的Python包:

%pip install -qU langchain-text-splitters

基本使用

from langchain_text_splitters import MarkdownHeaderTextSplitter

# 定义Markdown文档
markdown_document = """
# Foo

## Bar

Hi this is Jim

Hi this is Joe

### Boo

Hi this is Lance

## Baz

Hi this is Molly
"""

# 指定需要拆分的标题
headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

# 创建MarkdownHeaderTextSplitter实例
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)

# 输出拆分后的文档列表
for doc in md_header_splits:
    print(doc)

不去除标题的使用

如果希望在输出中保留标题信息,可以设置strip_headers=False

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

for doc in md_header_splits:
    print(doc)

每行作为独立文档

通过return_each_line=True设置,可以返回每行内容作为独立文档:

markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on,
    return_each_line=True,
)
md_header_splits = markdown_splitter.split_text(markdown_document)

for doc in md_header_splits:
    print(doc)

控制块大小的分割

在每个Markdown组内,可以使用其他文本分割器如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)
for split in splits:
    print(split)

应用场景分析

此技术适用于需要对Markdown文档进行结构化处理的场景,如文档管理、知识库系统、内容推荐系统等。通过根据标题进行分割,可以更好地保留文本的主题和语境。

实践建议

  • 在使用MarkdownHeaderTextSplitter时,务必根据具体应用场景合理选择标题级别,以便获取最佳的分割效果。
  • 对于需要对内容进行进一步分析或存储的项目,结合RecursiveCharacterTextSplitter等工具,可以实现更精细的内容处理。

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值