legal-doc-masker/backend/docs/SENTENCE_CHUNKING_IMPROVEME...

3.9 KiB
Raw Blame History

句子分块改进文档

问题描述

在原始的NER提取过程中我们发现了一些实体被截断的问题比如

  • "丰复久信公" (应该是 "丰复久信营销科技有限公司")
  • "康达律师事" (应该是 "北京市康达律师事务所")

这些截断问题是由于原始的基于字符数量的简单分块策略导致的,该策略没有考虑实体的完整性。

解决方案

1. 句子分块策略

我们实现了基于句子的智能分块策略,主要特点:

  • 自然边界分割:使用中文句子结束符(。!?;\n和英文句子结束符.!?;)进行分割
  • 实体完整性保护:避免在实体名称中间进行分割
  • 智能长度控制基于token数量而非字符数量进行分块

2. 实体边界安全检查

实现了 _is_entity_boundary_safe() 方法来检查分割点是否安全:

def _is_entity_boundary_safe(self, text: str, position: int) -> bool:
    # 检查常见实体后缀
    entity_suffixes = ['公', '司', '所', '院', '厅', '局', '部', '会', '团', '社', '处', '室', '楼', '号']
    
    # 检查不完整的实体模式
    if text[position-2:position+1] in ['公司', '事务所', '协会', '研究院']:
        return False
    
    # 检查地址模式
    address_patterns = ['省', '市', '区', '县', '路', '街', '巷', '号', '室']
    # ...

3. 长句子智能分割

对于超过token限制的长句子实现了智能分割策略

  1. 标点符号分割:优先在逗号、分号等标点符号处分割
  2. 实体边界分割:如果标点分割不可行,在安全的实体边界处分割
  3. 强制分割:最后才使用字符级别的强制分割

实现细节

核心方法

  1. _split_text_by_sentences(): 将文本按句子分割
  2. _create_sentence_chunks(): 基于句子创建分块
  3. _split_long_sentence(): 智能分割长句子
  4. _is_entity_boundary_safe(): 检查分割点安全性

分块流程

输入文本
    ↓
按句子分割
    ↓
估算token数量
    ↓
创建句子分块
    ↓
检查实体边界
    ↓
输出最终分块

测试结果

改进前 vs 改进后

指标 改进前 改进后
截断实体数量 较多 显著减少
实体完整性 经常被破坏 得到保护
分块质量 基于字符 基于语义

测试案例

  1. "丰复久信公" 问题

    • 改进前:"丰复久信公" (截断)
    • 改进后:"北京丰复久信营销科技有限公司" (完整)
  2. 长句子处理

    • 改进前:可能在实体中间截断
    • 改进后:在句子边界或安全位置分割

配置参数

  • max_tokens: 每个分块的最大token数量 (默认: 400)
  • confidence_threshold: 实体置信度阈值 (默认: 0.95)
  • sentence_pattern: 句子分割正则表达式

使用示例

from app.core.document_handlers.extractors.ner_extractor import NERExtractor

extractor = NERExtractor()
result = extractor.extract(long_text)

# 结果中的实体将更加完整
entities = result.get("entities", [])
for entity in entities:
    print(f"{entity['text']} ({entity['type']})")

性能影响

  • 内存使用:略有增加(需要存储句子分割结果)
  • 处理速度:基本无影响(句子分割很快)
  • 准确性:显著提升(减少截断实体)

未来改进方向

  1. 更智能的实体识别:使用预训练模型识别实体边界
  2. 动态分块大小:根据文本复杂度调整分块大小
  3. 多语言支持:扩展到其他语言的分块策略
  4. 缓存优化:缓存句子分割结果以提高性能

相关文件

  • backend/app/core/document_handlers/extractors/ner_extractor.py - 主要实现
  • backend/test_improved_chunking.py - 测试脚本
  • backend/test_truncation_fix.py - 截断问题测试
  • backend/test_chunking_logic.py - 分块逻辑测试