基于jieba的RAG通用分词最佳实践

前言

在构建检索增强生成(Retrieval-Augmented Generation, RAG)系统时,文本分词和预处理是影响系统性能的关键环节之一。特别是在中文环境中,由于中文语言的特殊性(词语之间没有明显的分隔符),分词质量直接影响到后续的检索准确性和生成质量。

本文档旨在介绍一种基于 jieba 分词库的通用中文文本分词和预处理方案,专门针对 RAG 系统的应用场景进行了优化,确保能够高效、准确地对各种类型的中文文本进行分词处理,并将其应用于 RAG 系统中的向量检索等关键步骤。

通过此文档的阅读,你将收获

  1. 掌握一套完整的基于 jieba 的中文文本分词和预处理流程
  2. 理解如何结合词性标注提高分词准确性
  3. 学会设计适用于 RAG 系统的文本去噪方法
  4. 了解倒装句识别和处理技术
  5. 熟悉将分词结果转换为向量表示的方法
  6. 能够根据实际需求调整分词策略和参数配置

适用范围

本方案主要适用于以下场景:

  1. 中文 RAG 系统的文本预处理阶段
  2. 需要高质量中文分词的自然语言处理任务
  3. 对文本语义理解有较高要求的应用场景
  4. 需要结合词性信息进行文本分析的任务
  5. 面向业务文本(如操作手册、流程描述等)的处理场景

具体方案

1. 文本标准化

在进行分词之前,首先需要对原始文本进行标准化处理,包括:

  • 去除特殊字符(空格、标点符号、emoji 等)

  • 统一大小写(对于包含英文的部分)

  • 修正常见的中文错别字

    def normalize(self, text: str, options: Optional[Dict[str, Any]] = None) -> str:
    """
    标准化文本
    """
    # 合并默认选项和用户提供的选项
    config = self.default_options.copy()
    if options:
    config.update(options)

    复制代码
      result = text
      
      # 1. 去除特殊字符
      if config["remove_special_chars"]:
          result = self._remove_special_characters(result)
      
      # 2. 统一大小写
      if config["to_lower_case"]:
          result = result.lower()
      
      # 3. 修正错别字
      if config["fix_typos"]:
          result = self._fix_typographical_errors(result)
      
      return result

去噪处理

为了提高分词质量,我们需要对文本进行去噪处理,主要包括:

  • 停用词过滤:去除对语义贡献较小的虚词

  • 词性过滤:去除助词、叹词、拟声词等干扰项

  • 长度过滤:过滤掉过短的无效词汇

  • 重复词去重:消除连续重复的词汇

    def _apply_denoising_rules(self, atomic_words: List[AtomicWord], config: Dict[str, Any]) -> List[AtomicWord]:
    """
    应用去噪规则
    """
    if not atomic_words:
    return []

    复制代码
      result = atomic_words.copy()
      
      # 1. 停用词过滤
      result = self._filter_stopwords(result, config["stopwords"], config["core_word_whitelist"])
      
      # 2. 词性过滤
      result = self._filter_by_pos_type(result, config["filter_pos_types"], config["core_word_whitelist"])
      
      # 3. 长度过滤
      result = self._filter_by_length(result, config["min_word_length"], config["core_word_whitelist"])
      
      # 4. 重复词汇去重
      result = self._remove_duplicate_words(result)
      
      return result

3. 基于 jieba 的分词与词性标注

我们采用 jieba 分词库进行分词和词性标注,并将 jieba 的词性标签映射为我们自定义的标准词性类型:

复制代码
def tag(self, text: str) -> List[AtomicWord]:
    """
    对文本进行词性标注
    """
    if not isinstance(text, str) or not text:
        return []
    
    # 使用jieba.posseg进行词性标注
    tagged_words = pseg.cut(text)
    
    result = []
    for index, (word, pos) in enumerate(tagged_words, start=1):
        # 将jieba词性映射为标准词性
        standard_pos = self._pos_map.get(pos, PosType.NOUN)
        
        atomic_word = AtomicWord(
            word=word,
            pos=standard_pos,
            index=index
        )
        result.append(atomic_word)
    
    return result

jieba 提供了丰富的词性标注,我们将它们归类为以下标准类型:

  • 动词(VERB)
  • 名词(NOUN)
  • 形容词(ADJECTIVE)
  • 时间词(TIME_WORD)
  • 副词(ADVERB)
  • 以及其他辅助词性

4. 倒装句识别与处理

在某些业务场景中,文本可能存在倒装句现象,会影响语义理解和检索效果。我们采用 LLM 辅助的方式识别和重组倒装句:

复制代码
def _detect_inversion_type(self, clean_text: str) -> str:
    """
    识别倒装类型
    """
    prompt = f"""你是通用文本语序分析助手,仅基于以下规则识别文本是否为倒装句(宾语前置/状语后置/定语后置/语义倒装):
1. 仅分析去噪后的纯净业务文本,无需考虑业务场景;
2. 倒装句判定仅基于语序逻辑,不考虑词汇语义;
3. 若非倒装句,回复"非倒装";若是倒装句,回复具体倒装类型(如"宾语前置")。

待分析文本:{clean_text}
请输出判定结果(仅文字,无额外说明):"""

    result = self.llm_service.generate(prompt)
    return result.strip()

5. 原子分块生成

将处理后的文本分解为原子分块单元,每个单元包含词汇、词性等信息,并可以生成对应的向量表示:

复制代码
async def _generate_atomic_chunks(self, processed_text: str, is_inverted: bool, config: ChunkingConfig) -> List[AtomicChunk]:
    """
    生成原子分块单元
    """
    if not processed_text:
        return []
    
    # 1. 原子分词与词性标注
    atomic_words = word_segment_service.process(processed_text)
    
    # 2. 过滤残留噪声(二次校验)
    filtered_words = self._filter_residual_noise(atomic_words)
    
    # 3. 生成原子分块单元
    atomic_chunks = []
    for index, word in enumerate(filtered_words, start=1):
        chunk = AtomicChunk(
            id=self._generate_chunk_id(word.pos, index),
            word=word.word,
            pos=word.pos,
            pos_idx=index,
            is_inverted=is_inverted,
            chunk_type="baseType"
        )
        
        # 4. 如果启用向量化,使用embedding服务生成向量
        if config["enable_vectorization"]:
            chunk.vector = embedding_service.generate_embedding(word.word)
        
        atomic_chunks.append(chunk)
    
    return atomic_chunks

流程总览

词性映射关系

去噪处理规则

倒装句处理流程

成果展示

通过上述方案处理后的文本具备以下特点:

  1. 高质量分词:利用 jieba 分词库和词性标注,确保分词准确性
  2. 有效去噪:过滤掉停用词、无意义词性词汇等噪声,保留核心语义单元
  3. 倒装处理:识别并重组倒装句,使语序更加规范
  4. 结构化表示:将文本转化为结构化的原子分块单元,便于后续处理
  5. 向量表示:可选地为每个分块单元生成向量表示,支持向量检索

示例输入:

复制代码
当用户在页面上点击"提交"按钮时,系统将验证表单字段的有效性,并在发现错误时显示相应的错误消息。

处理后得到的原子分块(部分展示):

  • 用户 (n) - 名词
  • 点击 (v) - 动词
  • 提交 (v) - 动词
  • 按钮 (n) - 名词
  • 系统 (n) - 名词
  • 验证 (v) - 动词
  • 表单 (n) - 名词
  • 字段 (n) - 名词
  • 有效性 (a) - 形容词

总结

本文介绍了一套完整的基于 jieba 的 RAG 系统中文分词解决方案,具有以下优势:

  1. 全面性:涵盖了从文本标准化到原子分块生成的完整流程
  2. 灵活性:各个处理模块都可以独立配置和替换
  3. 准确性:结合词性标注和多层去噪策略,提高了分词准确性
  4. 实用性:特别针对 RAG 系统的需求进行了优化,可直接应用于生产环境
  5. 可扩展性:模块化设计使得系统易于扩展新的功能

这套方案已经在 RAG 项目中得到了验证,显著提升了检索准确性和生成质量。未来还可以进一步结合领域词典、自定义词性标注等方式进行优化,以适应更多特定领域的应用场景。

参考文档

  1. jieba 分词官方文档
  2. RAG 系统原理与实践
  3. 中文自然语言处理技术综述
  4. 词性标注在信息检索中的应用研究
相关推荐
zhengfei6111 天前
AI渗透工具——AI驱动的BAS网络安全平台
人工智能·安全·web安全
imbackneverdie1 天前
研究生如何高效完成文献综述并提炼创新点?
人工智能·ai·语言模型·自然语言处理·aigc·ai写作
zxy28472253011 天前
利用C#的BotSharp本地部署第一个大模型AI Agent示例(1)
人工智能·c#·对话·ai agent·botsharp
才不做选择1 天前
基于 YOLOv8 的部落冲突 (Clash of Clans) 目标检测系统
人工智能·python·yolo·目标检测
AI探索先锋1 天前
高效!YOLO+SAM 目标检测与图像分割融合实战
人工智能·计算机视觉·目标跟踪
byzh_rc1 天前
[机器学习-从入门到入土] 基础知识
人工智能·机器学习
无限大.1 天前
为什么游戏需要“加载时间“?——从硬盘读取到内存渲染
网络·人工智能·游戏
vibag1 天前
使用底层API构建图
人工智能·语言模型·langchain·大模型·langgraph
权泽谦1 天前
医疗预测项目:CNN + XGBoost 实战全流程
人工智能·神经网络·cnn