You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SpaCy Doc中过滤自定义重叠Span,仅保留最长匹配?

解决SpaCy中Span包含关系的过滤问题

问题场景

通过正则表达式集合在SpaCy空白模型生成的Doc对象中已成功创建对应类别的Span,现需实现过滤逻辑:当Span存在包含关系(如“infra red”包含“red”)时,仅保留最长的Span。Matcher自带的重叠过滤方案无法适配该场景。

可行解决方法

核心思路是优先保留长Span,过滤被包含的短Span,具体实现步骤如下:

  1. 对Span按长度降序排序
    先把所有生成的Span按长度从长到短排序,长度相同时按起始位置升序排列,确保最长的Span先被处理。

    # 假设spans是你已生成的所有Span列表
    spans_sorted = sorted(spans, key=lambda s: (-len(s), s.start))
    
  2. 遍历筛选非包含Span
    初始化空列表保存最终结果,遍历排序后的Span,仅保留未被已选Span包含的项:

    filtered_spans = []
    for span in spans_sorted:
        # 检查当前Span是否被已保留的任意Span完全包含
        is_contained = any(
            existing.start <= span.start and existing.end >= span.end
            for existing in filtered_spans
        )
        if not is_contained:
            filtered_spans.append(span)
    
  3. 更新Doc的实体(可选)
    如果需要将过滤后的Span设为Doc的实体,直接赋值即可:

    doc.ents = filtered_spans
    

逻辑说明

  • 先处理最长Span,确保长Span被优先保留;
  • 后续短Span若完全落在已保留的长Span范围内,会被判定为“被包含”并过滤;
  • 该逻辑仅针对包含关系处理,若存在非包含的重叠Span(如“red apple”和“apple pie”),会同时保留,符合常规需求。

内容的提问来源于stack exchange,提问作者JFerro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:15:16