废弃废弃废弃
老版本需要配置中文分词,新版本已经不需要
介绍
使用 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}")
关键配置总结
- 必须替换分词器:用 Jieba 或 HanLP 的分词函数替代默认的英文分词器,确保词语不被割裂。
- 调整分块大小:中文单块建议 150-200 词(对应 300-400 字符),小于英文(英文通常 500 字符),因为中文信息密度更高。
- 优化分隔符:将
separator设为“。”(中文句号),优先按完整句子拆分。
通过以上配置,SentenceSplitter 才能正确处理中文文本,为后续的向量嵌入和检索提供高质量的语义单元,避免因分块不当导致知识库回答混乱。