系列文章索引
LangChain教程 - 系列文章
在自然语言处理(NLP)领域,处理长文本是一个常见且具有挑战性的任务。LangChain 框架提供了强大的文档转换器和文本拆分器,帮助开发者高效地处理和转换文档内容。
文档转换器概述
LangChain 的文档转换器主要用于将不同格式的文档转换为统一的文本格式,方便后续处理。例如,HTML、Markdown 或其他格式的文档可以通过相应的转换器转化为纯文本。
主要转换器
- Html2TextTransformer:将 HTML 格式的文档转换为纯文本,保留基本的结构和内容。
- MarkdownTextTransformer:将 Markdown 格式的文档转换为纯文本,去除 Markdown 语法,保留内容。
- BeautifulSoupTransformer:使用 BeautifulSoup 库将 HTML 转换为文本,并可排除特定的 HTML 标签。
- EmbeddingsClusteringFilter:基于聚类算法过滤,保留选取相似文本。
- EmbeddingsRedundantFilter:基于聚类算法过滤,去除相似文本。
文本拆分器概述
在处理长文本时,通常需要将其拆分为更小的块,以适应模型的输入限制。LangChain 提供了多种文本拆分器,满足不同的拆分需求。
按字符拆分
这是最简单的拆分方法,基于特定字符进行拆分,并通过字符数量来测量块的长度。例如,使用换行符或空格作为分隔符。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator="\n\n",
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
在上述示例中,CharacterTextSplitter
使用换行符作为分隔符,将文本拆分为多个块,每个块的最大长度为 1000 个字符,重叠部分为 200 个字符。
递归按字符拆分
RecursiveCharacterTextSplitter
通过递归地基于特定字符进行拆分,尽可能将语义相关的文本片段保持在一起。默认情况下,它尝试拆分的字符是 ["\n\n", "\n", " ", ""]
。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
add_start_index=True,
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
在上述示例中,RecursiveCharacterTextSplitter
会首先尝试使用 \n\n
进行拆分,如果拆分后的块仍然过大,则继续使用 \n
、空格或直接按字符拆分,直到满足块大小要求。
按 Token 拆分
对于需要精确控制拆分粒度的场景,NLTKTextSplitter
、SpacyTextSplitter
和 SentenceTransformersTokenTextSplitter
等工具可以基于 Token 进行拆分。这些拆分器使用相应的 NLP 库,将文本拆分为更小的语义单元。
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
在上述示例中,NLTKTextSplitter
使用 NLTK 库将文本拆分为 Token,然后根据指定的块大小进行拆分。
除了常规的文本拆分器,LangChain 还提供了一些适用于特殊格式文本的拆分器:
MarkdownTextSplitter
专门用于拆分 Markdown 格式的文本。Markdown 文本常常包含格式化标记(如标题、列表、代码块等),因此,MarkdownTextSplitter
会根据这些标记拆分文本,帮助你将 Markdown 文本切割成适合进一步处理的块。
from langchain.text_splitter import MarkdownTextSplitter
text_splitter = MarkdownTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
PythonCodeTextSplitter
PythonCodeTextSplitter
适用于 Python 代码的文本切分。它会根据 Python 代码的结构进行拆分,确保每个拆分块包含完整的语法单元,如函数或类定义等。这对于需要分析或处理 Python 代码的应用场景尤为重要。
from langchain.text_splitter import PythonCodeTextSplitter
text_splitter = PythonCodeTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
实际应用示例
在前面的讨论中,我们详细介绍了 LangChain 框架中的文档转换器和文本拆分器。接下来,我们将通过一个实际的示例,展示如何使用 Html2TextTransformer
将 HTML 内容转换为纯文本,并结合文本拆分器对其进行处理。
环境准备
首先,确保安装了所需的库:
pip install langchain html2text
示例代码
from langchain_community.document_transformers import Html2TextTransformer
from langchain_core.documents import Document
from langchain.text_splitter import CharacterTextSplitter
# 示例 HTML 内容
html_content = """
<html>
<head><title>示例页面</title></head>
<body>
<h1>欢迎来到 LangChain 示例</h1>
<p>这是一个用于演示 <strong>Html2TextTransformer</strong> 的示例。</p>
<a href="https://example.com">点击这里</a> 了解更多信息。
</body>
</html>
"""
# 创建 Document 对象
document = Document(page_content=html_content)
# 初始化 Html2TextTransformer
html2text = Html2TextTransformer()
# 转换 HTML 为纯文本
transformed_documents = html2text.transform_documents([document])
# 获取转换后的文本
text = transformed_documents[0].page_content
print("转换后的文本:")
print(text)
# 初始化 CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator="\n\n",
chunk_size=10,
chunk_overlap=2,
length_function=len,
)
# 使用文本拆分器拆分文本
texts = text_splitter.split_text(text)
# 输出拆分后的文本块
print("\n拆分后的文本块:")
for i, text_chunk in enumerate(texts):
print(f"块 {i+1}: {text_chunk[:100]}...") # 仅显示前100个字符
输出示例
转换后的文本:
# 欢迎来到 LangChain 示例
这是一个用于演示 **Html2TextTransformer** 的示例。
点击这里 了解更多信息。
拆分后的文本块:
块 1: # 欢迎来到 LangChain 示例...
块 2: 这是一个用于演示 **Html2TextTransformer** 的示例。...
块 3: 点击这里 了解更多信息。...
说明
-
Html2TextTransformer:该转换器将 HTML 内容转换为纯文本,去除 HTML 标签和格式信息。它确保转换后的文本简洁易读,并保持原始文档的内容。
-
CharacterTextSplitter:该拆分器根据指定的分隔符和块大小,将文本拆分为多个块,方便后续处理。例如,在处理超长的文本时,拆分器可以将文本切分成多个适合模型输入的块。
总结
通过本篇博客,我们详细介绍了 LangChain 框架中的文档转换器和文本拆分器,并通过一个实际的示例展示了如何使用 Html2TextTransformer
将 HTML 内容转换为纯文本,并结合 CharacterTextSplitter
对文本进行拆分。该组合可以有效地处理包含 HTML 内容的长文档,简化后续的文本分析和处理工作。