技术背景介绍
在处理聊天应用或者问答系统时,通常需要将输入文档分块以便于嵌入和向量存储。嵌入整段文本时,嵌入过程会考虑文本的上下文以及句子和短语之间的关系,这使得向量能够反映文本的更广泛含义和主题。然而,当我们处理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—