不同句子切割(文本分段 / chunking)工具或库 各自采用的策略和目标对比和分析
除了 SemanticSplitterNodeParser
,目前在 NLP 或嵌入式语义检索场景中,还有不少 句子切割(文本分段 / chunking)工具或库。它们各自采用的策略和目标不同,下面我帮你系统性地整理一下:
🔪 主流文本切割工具/方法对比
名称 | 所属库 / 项目 | 原理 | 是否语义感知 | 典型用途 |
---|---|---|---|---|
SemanticSplitterNodeParser | llama-index | 句子向量语义距离判断切分 | ✅ 是 | 精准语义检索、向量索引构建 |
SentenceSplitter | llama-index.core.node_parser | 基于句号、逗号等断句符号 + 模型标记 | ❌ 否 | 通用场景,语法结构清晰的文本 |
RecursiveCharacterTextSplitter | langchain.text_splitter | 逐层按字符 -> 句子 -> 段落等规则递归切分 | ❌ 否 | 长文档切块、token 限制处理 |
NLTK.sent_tokenize | nltk | 基于正则 + 规则的分句 | ❌ 否 | 教育、轻量 NLP |
spaCy sentence splitter | spaCy | 基于语言模型的依存关系分句 | ❌ 否 | 精准语言解析 |
TextSplitter (by Hugging Face) | 自定义 | 手工滑窗(sliding window)或 chunk+overlap | ❌ 否 | 适合入门快速处理 |
TextTiling | 传统 NLP 算法 | 主题变换检测(基于词频和句段得分) | ✅ 部分 | 文章段落识别 |
补充解释:基于语言模型的依存关系分句 和 主题变换检测(基于词频和句段得分)的 意思
🔍 一些工具的详细说明
1. SemanticSplitterNodeParser
(llama-index)
- 适合:有语义跳跃的文本(如医学、法律、技术文档)
- **特点:**利用 Sentence-BERT 等编码器生成句子向量,通过计算“语义跳变点”进行切割。
- 优点: chunk 切得更自然,适合 RAG 检索。
- **缺点:**需要计算 embedding,较慢。
2. SentenceSplitter
(llama-index)
- 适合:结构良好的文章,如新闻
- **特点:**只按照语法断句分句(如句号、问号),再按段落等切割。
- **缺点:**不考虑语义关系,不够智能。
3. RecursiveCharacterTextSplitter
(langchain)
- 适合:大模型输入有 token 限制的场景
- **特点:**先尝试句子、失败就退化为字符、按字符滑窗。
- **优势:**兼容各种输入。
- **劣势:**可能切得生硬,不智能。
4. NLTK
/ spaCy
- **属于:**传统 NLP 的分句工具
- 不具备语义智能性,但是在语法规则上很强。
✨ 对比总结(通俗理解)
工具 | 类比比喻 |
---|---|
SemanticSplitterNodeParser | 语义“激光切割刀”,判断内容突变点切得自然 |
SentenceSplitter | 剪刀,根据标点符号切 |
RecursiveCharacterTextSplitter | 电锯,先粗切,不行再细切 |
NLTK / spaCy | 剃须刀,按规则快速剃,但不懂你脸上的表情 |
✅ 如何选择?
任务 | 推荐工具 |
---|---|
语义搜索 / 向量检索 | ✅ SemanticSplitterNodeParser |
文档切块准备长文本摘要 | ✅ RecursiveCharacterTextSplitter |
教育类 NLP 学习 / 轻量文本分句 | NLTK.sent_tokenize , spaCy |
文本结构良好,不需语义感知 | SentenceSplitter |
对比几个常见的文本切割器在中文中的表现。这里我选了三个代表性切割器:
- ✅
SemanticSplitterNodeParser
(语义分割,需嵌入模型) - ✂️
SentenceSplitter
(基于标点) - 🔪
RecursiveCharacterTextSplitter
(按长度递归切)
🧪 示例文本(中文医学说明书节选)
糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。其主要表现为高血糖。长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。控制血糖水平对于糖尿病患者的健康至关重要。除了药物治疗,生活方式干预也非常关键。
🔍 三种切割方法对比
✂️ 方法 1:SentenceSplitter(按中文标点断句)
['糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。','其主要表现为高血糖。','长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。','控制血糖水平对于糖尿病患者的健康至关重要。','除了药物治疗,生活方式干预也非常关键。']
特点: 基于中文标点,句子结构清晰、可控。适合结构好的文章。
🔪 方法 2:RecursiveCharacterTextSplitter(按字符数切,chunk=30)
['糖尿病是一种由于胰岛素分泌不足或作用受损','引起的慢性代谢性疾病。其主要表现为高血糖。','长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。','控制血糖水平对于糖尿病患者的健康至关重要。','除了药物治疗,生活方式干预也非常关键。']
特点: 不考虑语义和标点,完全按照长度粗暴切分。句子可能被截断。
🧠 方法 3:SemanticSplitterNodeParser(语义判断句意突变)
['糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。其主要表现为高血糖。','长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。','控制血糖水平对于糖尿病患者的健康至关重要。除了药物治疗,生活方式干预也非常关键。']
特点:
- 用像 Sentence-BERT 这样的模型计算句子语义向量。
- 当两句语义差异较大,就在中间切开。
- 更像人在理解自然段。
✅ 总结
方法 | 优势 | 劣势 |
---|---|---|
SentenceSplitter | 快、可控、语法合理 | 无语义感知 |
RecursiveCharSplitter | 简单通用、适配 token 限制 | 切得生硬、不智能 |
SemanticSplitterNodeParser | 语义切割精准、chunk 高质量 | 慢、依赖嵌入模型 |
如果需要处理中文医疗文本用于语义检索或大模型上下文切块(如 RAG),推荐使用 SemanticSplitterNodeParser + 中文的 embedding 模型(如 shibing624/text2vec-base-chinese
)。
代码示例:
from transformers import AutoTokenizer, AutoModel
from llama_index.core.node_parser import SemanticSplitterNodeParser
from llama_index.embeddings.huggingface import HuggingFaceEmbedding# 中文医学文本示例
text = ("糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。其主要表现为高血糖。""长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。""控制血糖水平对于糖尿病患者的健康至关重要。除了药物治疗,生活方式干预也非常关键。"
)# 初始化中文 embedding 模型(shibing624/text2vec-base-chinese)
embed_model = HuggingFaceEmbedding(model_name="shibing624/text2vec-base-chinese")# 初始化语义切割器
parser = SemanticSplitterNodeParser(embed_model=embed_model, threshold=0.75)# 执行语义切割
nodes = parser.get_nodes_from_documents([text])# 展示切分结果(取出纯文本内容)
semantic_chunks = [node.text for node in nodes]
semantic_chunks
transformers
,这个库是使用 HuggingFace 模型(如 Sentence-BERT)的基础依赖。
要运行语义切割示例(如 SemanticSplitterNodeParser
结合中文 Sentence-BERT),你需要先安装以下几个 Python 库:
pip install transformers llama-index sentence-transformers
对于中文语义切割任务,除了 SemanticSplitterNodeParser
,还有这些工具可选,它们的区别和联系如下:
1. SemanticSplitterNodeParser(llama-index)
- 功能:基于句向量相似度自动寻找语义边界来切块。
- 依赖:Sentence-BERT 或其他 HuggingFace embedding 模型。
- 优点:支持跨语言,尤其适合语义密集型文档(如医学)。
- 适用:RAG(Retrieval-Augmented Generation)、向量搜索等。
2. Jieba 分词 + 按句号切割
- 方式:基于规则/词典的传统切割方法。
- 优点:轻量、速度快。
- 缺点:无法处理语义不明确、长句嵌套等问题。
- 适用:初步切割、低语义需求场景。
3. pkuseg / THULAC / HanLP(中文NLP分词工具)
- 功能:提供更高精度的中文分词、句法切割。
- 优点:学术支持强,支持专业领域(如医学)。
- 适用:更复杂的中文语义分析,但不擅长做 chunk 切分。
4. TextSplit(英文为主)
- 方式:按段落、字符数或语法结构切割。
- 优点:结构清晰,可与 LLM 结合做粗粒度预处理。
- 缺点:中文支持弱,不做向量对比。
总结类比:
工具 | 是否语义感知 | 是否支持中文 | 推荐场景 |
---|---|---|---|
SemanticSplitterNodeParser | ✅ 是 | ✅ 是 | 高质量向量检索、RAG |
| Jieba/THULAC | ❌ 否 | ✅ 是 | 快速切句、粗处理 |
| HanLP | ❌ 否(但NLP强) | ✅ 是 | 专业分词、命名实体识别 |
| TextSplit | ❌ 否 | ❌ 弱 | 英文预处理 |