除了 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 算法 | 主题变换检测(基于词频和句段得分) | ✅ 部分 | 文章段落识别 |
补充解释:基于语言模型的依存关系分句 和 主题变换检测(基于词频和句段得分)的 意思
SemanticSplitterNodeParser
(llama-index)SentenceSplitter
(llama-index)RecursiveCharacterTextSplitter
(langchain)NLTK
/ spaCy
工具 | 类比比喻 |
---|---|
SemanticSplitterNodeParser |
语义“激光切割刀”,判断内容突变点切得自然 |
SentenceSplitter |
剪刀,根据标点符号切 |
RecursiveCharacterTextSplitter |
电锯,先粗切,不行再细切 |
NLTK / spaCy |
剃须刀,按规则快速剃,但不懂你脸上的表情 |
任务 | 推荐工具 |
---|---|
语义搜索 / 向量检索 | ✅ SemanticSplitterNodeParser |
文档切块准备长文本摘要 | ✅ RecursiveCharacterTextSplitter |
教育类 NLP 学习 / 轻量文本分句 | NLTK.sent_tokenize , spaCy |
文本结构良好,不需语义感知 | SentenceSplitter |
SemanticSplitterNodeParser
(语义分割,需嵌入模型)SentenceSplitter
(基于标点)RecursiveCharacterTextSplitter
(按长度递归切)糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。其主要表现为高血糖。长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。控制血糖水平对于糖尿病患者的健康至关重要。除了药物治疗,生活方式干预也非常关键。
['糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。',
'其主要表现为高血糖。',
'长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。',
'控制血糖水平对于糖尿病患者的健康至关重要。',
'除了药物治疗,生活方式干预也非常关键。']
特点: 基于中文标点,句子结构清晰、可控。适合结构好的文章。
['糖尿病是一种由于胰岛素分泌不足或作用受损',
'引起的慢性代谢性疾病。其主要表现为高血糖。',
'长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。',
'控制血糖水平对于糖尿病患者的健康至关重要。',
'除了药物治疗,生活方式干预也非常关键。']
特点: 不考虑语义和标点,完全按照长度粗暴切分。句子可能被截断。
['糖尿病是一种由于胰岛素分泌不足或作用受损引起的慢性代谢性疾病。其主要表现为高血糖。',
'长期高血糖可能会导致心血管疾病、肾病、视网膜病变等并发症。',
'控制血糖水平对于糖尿病患者的健康至关重要。除了药物治疗,生活方式干预也非常关键。']
特点:
方法 | 优势 | 劣势 |
---|---|---|
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
,还有这些工具可选,它们的区别和联系如下:
工具 | 是否语义感知 | 是否支持中文 | 推荐场景 |
---|---|---|---|
SemanticSplitterNodeParser | ✅ 是 | ✅ 是 | 高质量向量检索、RAG |
| Jieba/THULAC | ❌ 否 | ✅ 是 | 快速切句、粗处理 |
| HanLP | ❌ 否(但NLP强) | ✅ 是 | 专业分词、命名实体识别 |
| TextSplit | ❌ 否 | ❌ 弱 | 英文预处理 |