引言
在AI和编程领域,文本嵌入和向量存储是常见的应用场景之一。为了更好地组织和处理文本,尤其是在Markdown格式的文档中,将输入文档按特定结构进行分块处理显得尤为重要。这篇文章将介绍如何利用MarkdownHeaderTextSplitter类,通过Headers对Markdown文本进行分割,以便进行更细粒度的文本处理和分析。
主要内容
文本分割的动机
在嵌入完整段落或文档时,嵌入过程会结合上下文以及句子和短语之间的关系,从而生成更加全面的向量表示。这种方法有助于捕获文本的广义含义和主题。然而,为了保持常见上下文的完整性,按文档自身结构进行分块是一种直观的策略。
使用MarkdownHeaderTextSplitter
Markdown文本通常按Headers组织,通过使用MarkdownHeaderTextSplitter,我们可以根据指定的Headers级别对Markdown文本进行分割。例如,对于以下Markdown文本:
md = '# Foo\n\n ## Bar\n\nHi this is Jim \nHi this is Joe\n\n ## Baz\n\n Hi this is Molly'
我们可以指定如下Headers来进行分割:
[("#", "Header 1"),("##", "Header 2")]
这将依据Headers对内容进行分组或分割:
{'content': 'Hi this is Jim \nHi this is Joe', 'metadata': {'Header 1': 'Foo', 'Header 2': 'Bar'}}
{'content': 'Hi this is Molly', 'metadata': {'Header 1': 'Foo', 'Header 2': 'Baz'}}
基础用法
安装依赖
%pip install -qU langchain-text-splitters
代码示例
from langchain_text_splitters import MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n ## Bar\n\nHi this is Jim\n\nHi this is Joe\n\n ### Boo \n\n Hi this is Lance \n\n ## Baz\n\n Hi this is Molly"
headers_to_split_on = [
("#", "Header 1"),
("##", "Header 2"),
("###", "Header 3"),
]
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
print(md_header_splits)
常见问题和解决方案
-
默认去除Headers: 默认情况下,MarkdownHeaderTextSplitter将剥离Headers。可以通过设置
strip_headers=False来避免这一行为。 -
返回Markdown行作为独立文档: 通过设置
return_each_line=True,可以禁用基于Headers的行聚合。 -
限制块大小: 可以结合RecursiveCharacterTextSplitter进一步控制每个Markdown组内的块大小。
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)
总结和进一步学习资源
本文介绍了如何利用MarkdownHeaderTextSplitter对Markdown文档按Headers进行分割,以便更好地进行文本处理。这种方法不仅可以提升文本分析的效率,还为后续的嵌入和存储提供了坚实的基础。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---