LlamaIndex 的 SentenceSplitter 句子分割器,需要配置中文分词 作者:马育民 • 2025-08-27 15:32 • 阅读:10041 # 介绍 使用 LlamaIndex 的 `SentenceSplitter` 处理中文知识库时,**需要配置中文 NLP 工具**,否则会出现 **分词混乱**、**语义割裂** 等问题(例如将“人工智能”拆成“人工智”和“能”)。 原因是 `SentenceSplitter` 默认基于 **英文规则**(按空格和标点分词),对无天然空格的中文适配性较差。 # 为什么需要配置中文分词? `SentenceSplitter` 的核心功能是将文本拆分为有意义的“语义单元”(句子或短语),但中文与英文的语言结构差异很大: - 英文通过空格分隔单词,标点(如 `.` `,`)可直接作为分句依据; - 中文没有空格,词语边界模糊(如“学生会”可指“学生组织”或“学生开会”),需依赖分词工具识别词语边界; - 中文分句标点(如“。”“!”“?”)的使用更灵活,有时还会用逗号“,”分隔长句,默认规则可能拆分不当。 因此,必须通过中文 NLP 工具(如分词库)增强 `SentenceSplitter` 对中文的处理能力。 # 如何配置中文分词 适配 `SentenceSplitter`? 核心是为 `SentenceSplitter` 注入**中文分词逻辑**和**中文分句规则**,推荐两种方案: ### 方案 1:基于 Jieba 分词的轻量配置(适合大多数场景) Jieba 是轻量高效的中文分词工具,可直接集成到 `SentenceSplitter` 中,确保词语边界: ``` import jieba from llama_index.text_splitter import SentenceSplitter # 1. 定义中文分词函数(使用Jieba) def chinese_tokenizer(text: str) -> list[str]: """将中文文本拆分为词语列表""" return list(jieba.cut(text)) # 精确模式分词 # 2. 配置中文适配的SentenceSplitter chinese_text_splitter = SentenceSplitter( chunk_size=150, # 中文单块建议150-200词(比英文小) chunk_overlap=20, # 重叠20词,保持上下文连贯 tokenizer=chinese_tokenizer, # 注入中文分词逻辑 separator="。" # 优先按中文句号分句 ) # 测试中文分块效果 if __name__ == "__main__": chinese_text = """ 人工智能(AI)是计算机科学的一个分支,它致力于开发能够模拟人类智能的系统。 这些系统可以学习、推理、识别模式,并自主做出决策。随着技术的发展,人工智能已经广泛应用于医疗、金融、教育等多个领域, 极大地改变了人们的生活和工作方式。未来,人工智能的发展还将面临伦理、隐私等方面的挑战,需要全社会共同应对。 """ # 分块处理 chunks = chinese_text_splitter.split_text(chinese_text) # 打印分块结果 print(f"分块数量:{len(chunks)}") for i, chunk in enumerate(chunks, 1): print(f"\n块 {i}:{chunk}") ``` ### 方案 2:基于 HanLP 的深度配置(适合复杂场景) 如果需要更精准的分句(如处理古文、专业术语),可使用 HanLP 的分句功能,它能理解中文复杂句式: ``` from hanlp_restful import HanLPClient from llama_index.text_splitter import SentenceSplitter # 1. 初始化HanLP(需申请API密钥,见https://hanlp.com/) HanLP = HanLPClient( url="https://www.hanlp.com/api", auth="你的API密钥", language="zh" ) # 2. 定义基于HanLP的分句+分词函数 def hanlp_tokenizer(text: str) -> list[str]: """用HanLP分句后再分词,确保语义完整""" # 先分句 sentences = HanLP.split(text)["sentences"] # 再对每个句子分词,最后合并为词列表 all_words = [] for sent in sentences: words = HanLP.seg(sent)["tok/fine"] # 精细分词 all_words.extend(words) return all_words # 3. 配置适配中文的SentenceSplitter chinese_text_splitter = SentenceSplitter( chunk_size=200, # 可适当放大,因HanLP分句更精准 chunk_overlap=30, tokenizer=hanlp_tokenizer, separator="。" # 辅助分句 ) # 测试效果 if __name__ == "__main__": chinese_text = """ 自然语言处理(NLP)是人工智能的一个重要分支,它研究计算机与人类语言的交互。 在中文处理中,分词、词性标注和命名实体识别是基础任务。例如,"南京市长江大桥"这个短语, 正确的分词应该是"南京市/长江大桥",而不是"南京/市长/江大桥",这需要NLP工具理解语义。 """ chunks = chinese_text_splitter.split_text(chinese_text) print(f"分块数量:{len(chunks)}") for i, chunk in enumerate(chunks, 1): print(f"\n块 {i}:{chunk}") ``` ### 关键配置总结 1. **必须替换分词器**:用 Jieba 或 HanLP 的分词函数替代默认的英文分词器,确保词语不被割裂。 2. **调整分块大小**:中文单块建议 150-200 词(对应 300-400 字符),小于英文(英文通常 500 字符),因为中文信息密度更高。 3. **优化分隔符**:将 `separator` 设为“。”(中文句号),优先按完整句子拆分。 通过以上配置,`SentenceSplitter` 才能正确处理中文文本,为后续的向量嵌入和检索提供高质量的语义单元,避免因分块不当导致知识库回答混乱。 原文出处:http://malaoshi.top/show_1GW1ki1muRuD.html