(废弃)LlamaIndex 的 SentenceSplitter 句子分割器,需要配置中文分词

废弃废弃废弃

老版本需要配置中文分词,新版本已经不需要

介绍

使用 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 才能正确处理中文文本,为后续的向量嵌入和检索提供高质量的语义单元,避免因分块不当导致知识库回答混乱。