LangChain教程 - RAG - 文档转换与文本切分

系列文章索引
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 拆分

对于需要精确控制拆分粒度的场景,NLTKTextSplitterSpacyTextSplitterSentenceTransformersTokenTextSplitter 等工具可以基于 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 内容的长文档,简化后续的文本分析和处理工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值