摘要
在自然语言处理领域,LangChain 框架凭借其强大功能和灵活性,成为众多开发者的首选。其中,langchain.text_splitter
作为官方文档分割器实现,为开发者提供了基本且可靠的文本分割能力。关于langchain官方文档分割器部分的介绍,可以参考我写的另一篇文章:
langchain框架-文档分割器详解(官方库)-CSDN博客
然而,除了官方实现外,LangChain 社区中还涌现出了一些非官方的文档分割器。本文将主要介绍 LangChain 框架的非官方库文档分割器,希望能帮助大家更透彻地理解 LangChain 框架中文档分割器这一重要部分,让正在使用该框架的开发者能够迅速掌握并灵活运用各类文档分割器,提升开发效率。
JSFrameworkTextSplitter
功能用途
JSFrameworkTextSplitter
主要用于分割 JavaScript 框架相关的代码文本。它会依据 JavaScript 框架的语法结构、模块划分、组件定义等特征来对代码进行分割。这样可以将复杂的 JavaScript 框架代码拆分成更易于管理和分析的小块,方便进行代码审查、代码分析、代码片段提取等操作。
使用场景
代码审查:当团队对 JavaScript 框架代码进行审查时,将代码分割成小块可以更清晰地查看每个部分的逻辑和功能。
代码分析工具:用于分析 JavaScript 框架代码的结构、依赖关系等,例如统计各个模块的代码行数、查找潜在的代码问题等。
代码学习:对于初学者来说,将大型 JavaScript 框架代码分割后,更容易理解每个部分的功能和实现方式。
代码示例
js_code = """
import React from 'react';
function MyComponent() {
return (
<div>
<h1>Hello, World!</h1>
</div>
);
}
export default MyComponent;
"""
# 创建 JSFrameworkTextSplitter 实例
js_splitter = JSFrameworkTextSplitter()
# 分割代码
chunks = js_splitter.split_text(js_code)
print("分割后的代码块:" + str(chunks))
HTMLSectionSplitter
功能用途
HTMLSectionSplitter
用于分割 HTML 文档,它会根据 HTML 文档的结构,如 <section>
、<article>
、<div>
等标签将文档分割成不同的部分。这样可以将一个大型的 HTML 文档拆分成多个独立的逻辑单元,方便对每个部分进行单独处理。
使用场景
网页内容提取:从网页中提取特定部分的内容,例如提取文章的各个章节、提取网页中的侧边栏信息等。
网页分析:分析网页的结构和内容,例如统计每个部分的字数、分析每个部分的主题等。
网页重构:在对网页进行重构时,将网页按部分分割后可以更方便地进行修改和调整。
代码示例
from bs4 import BeautifulSoup
from langchain.text_splitter import HTMLHeaderTextSplitter
html = """
<!DOCTYPE html>
<html>
<body>
<section id="section1">
<h2>Section 1</h2>
<p>This is the content of section 1.</p>
</section>
<section id="section2">
<h2>Section 2</h2>
<p>This is the content of section 2.</p>
</section>
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')
splitter = HTMLHeaderTextSplitter()
chunks = splitter.split_text(str(soup))
for chunk in chunks:
print(chunk)
HTMLSemanticPreservingSplitter
功能用途
HTMLSemanticPreservingSplitter
也是用于分割 HTML 文档,但它更注重保留 HTML 文档的语义信息。在分割过程中,会尽量保持 HTML 标签的结构和语义完整性,确保分割后的每个部分都具有明确的语义。
使用场景
- 语义搜索:在进行网页内容的语义搜索时,需要保留 HTML 文档的语义信息,以便更准确地匹配搜索结果。
- 网页内容理解:帮助机器更好地理解网页的内容和结构,例如进行网页内容的分类、聚类等操作。
- 无障碍网页开发:确保分割后的网页内容在无障碍访问时能够正确呈现,例如为视障人士提供更好的网页浏览体验。
代码示例
from langchain_text_splitters.html import HTMLSemanticPreservingSplitter
def custom_iframe_extractor(iframe_tag):
iframe_src = iframe_tag.get('src', '')
return f"[iframe:{iframe_src}]({iframe_src})"
text_splitter = HTMLSemanticPreservingSplitter(
headers_to_split_on=[("h1", "Header 1"), ("h2", "Header 2")],
max_chunk_size=500,
preserve_links=True,
preserve_images=True,
custom_handlers={"iframe": custom_iframe_extractor}
)
ExperimentalMarkdownSyntaxTextSplitter
功能用途
ExperimentalMarkdownSyntaxTextSplitter
是一个实验性的 Markdown 文本分割器,它会根据 Markdown 的语法规则,如标题、列表、代码块等对 Markdown 文本进行分割。通过这种分割方式,可以将 Markdown 文档拆分成不同的逻辑部分,方便进行内容提取、格式转换等操作。
使用场景
Markdown 文档分析:分析 Markdown 文档的结构和内容,例如统计每个章节的字数、查找特定的代码块等。
Markdown 内容提取:从 Markdown 文档中提取特定的内容,例如提取所有的标题、提取所有的代码块等。
Markdown 格式转换:在将 Markdown 文档转换为其他格式(如 HTML、PDF 等)时,先将 Markdown 文本分割成小块可以更方便地进行转换。
代码示例
from langchain.text_splitter import MarkdownHeaderTextSplitter
markdown = """
# Header 1
This is the content of header 1.
## Header 2
This is the content of header 2.
"""
splitter = MarkdownHeaderTextSplitter()
chunks = splitter.split_text(markdown)
for chunk in chunks:
print(chunk)
SemanticChunker
功能
语义理解与划分:它能够分析文本的语义结构,将文本按照不同的语义单元进行划分。例如,将一个完整的文档或段落,根据主题、概念、事件等语义要素,分割成若干个具有相对独立语义的小块。
上下文感知:在进行分块时,
SemanticChunker
会考虑文本的上下文信息,以确保分块的准确性和合理性。它不仅仅是基于简单的语法或字符规则进行分割,而是更深入地理解文本的含义,从而将相关的内容划分到同一个块中,避免将具有紧密语义联系的部分分割开。
使用场景
信息检索与提取:在信息检索系统中,帮助将文档进行语义分块后,能够更精准地匹配用户的查询需求,提高检索的准确性和召回率。对于信息提取任务,也可以方便地从不同的语义块中提取出特定类型的信息,如人物、事件、时间、地点等。
文本摘要生成:通过将文本划分为语义块,可以更有针对性地对每个块进行概括和提炼,从而生成更具代表性和准确性的文本摘要。可以根据不同语义块的重要性和相关性,选择合适的内容纳入摘要中。
机器翻译:在机器翻译中,先对源语言文本进行语义分块,有助于更好地理解句子的结构和语义,从而更准确地将每个语义块翻译成目标语言,提高翻译质量,特别是对于一些长难句和具有复杂语义结构的句子。
代码示例
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
text_splitter = SemanticChunker(OpenAIEmbeddings())
docs = text_splitter.create_documents([state_of_the_union])
print(docs[0].page_content)