二、文本分割器(LangChain)
通过递归查看字符来分割文本。递归地尝试按不同的字符进行分割,以找到一个有效的字符。
·
1、RecursiveCharacterTextSplitter
(1)作用
通过递归查看字符来分割文本。
递归地尝试按不同的字符进行分割,以找到一个有效的字符。
(2)用法
RecursiveCharacterTextSplitter(
separators: Optional[list[str]] = None,
keep_separator: Union[bool, Literal["start", "end"]] = True,
is_separator_regex: bool = False,
**kwargs
)
(3)参数解释
3.1 separators: Optional[list[str]]
定义一组递归使用的分割符,从“语义较大”到“语义较小”依次尝试切割。
separators = ["\n\n", "\n", "。", " ", ""]
-
先按双换行(段落)切;
-
段落太长,再按单换行(行)切;
-
行仍太长,再按句号(句)切;
-
最后按空格或字符切。
💡 建议:
-
英文文本可用:
["\n\n", "\n", ".", " ", ""]
-
中文文本推荐:
["\n\n", "\n", "。", ",", " ", ""]
3.2 keep_separator: Union[bool, Literal["start", "end"]]
控制分割后是否保留分隔符,以及保留在开头还是结尾。
值 | 含义 | 示例 |
---|---|---|
False |
不保留分隔符 | "句子一。句子二。" → ["句子一", "句子二"] |
True |
默认保留在 结尾 | "句子一。句子二。" → ["句子一。", "句子二。"] |
"start" |
保留在分块的 开头 | "句子一。句子二。" → ["。句子一", "。句子二"] |
"end" |
明确保留在 结尾(同 True) | "句子一。句子二。" → ["句子一。", "句子二。"] |
-
语义分析或 embedding 时保留
"end"
,避免丢失句尾语义。 -
纯结构化数据(如CSV)可设为
False
。
3.3 is_separator_regex: bool = False
是否将 separators
中的分隔符当作**正则表达式(regex)**来解释。
是否将 separators 中的分隔符当作**正则表达式(regex)**来解释。
这时会用正则 \n\d+\.
来匹配“以数字开头的标题行”,可以用来按“第1章、第2章…”等标题分割技术文档。
-
如果你的文件包含章节号、时间戳、标点规律明显的结构,用正则会非常方便;
-
一般场景保持
False
即可。
3.4 **kwargs
这是通配符参数,实际会向上层 CharacterTextSplitter
传递。
主要包括下面这些(常用)
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
chunk_size |
int | 1000 | 每个文本块最大长度 |
chunk_overlap |
int | 200 | 块与块之间的重叠字符数 |
length_function |
Callable | len |
用于计算长度的函数(可用 tokenizer) |
add_start_index |
bool | False | 是否在每个chunk中添加原始文本的起始位置 |
strip_whitespace |
bool | True | 是否去除首尾空白符 |
(4)示例演示
from langchain.text_splitter import RecursiveCharacterTextSplitter
text = """第一章 发动机测试要求
发动机应在额定转速下持续运行。
第二章 数据采集规范
记录转速、扭矩、温度及油耗。
"""
splitter = RecursiveCharacterTextSplitter(
separators=[r"第.*章", "\n\n", "\n", "。", " "],
keep_separator="start",
is_separator_regex=True,
chunk_size=50,
chunk_overlap=10,
)
docs = splitter.split_text(text)
for i, d in enumerate(docs, 1):
print(f"📘 片段 {i}: {d}")
更多推荐
所有评论(0)