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

spaCy Matcher如何仅匹配最长模式而过滤子模式匹配结果

spaCy Matcher 重叠匹配保留最长结果解决方案

核心思路

spaCy的Matcher默认会返回所有符合规则的匹配结果,包括重叠的短子匹配。要实现仅保留最长匹配,直接使用spaCy内置的spacy.util.filter_spans工具即可,该函数会自动丢弃被更长span完全覆盖的短span,长度相同时保留位置更靠前的span,刚好匹配需求。

修改后完整代码

import spacy
from spacy.matcher import Matcher

nlp = spacy.load('pt_core_news_lg')

UN = ['km']

TEXTS = ['500 km até 543 km', 'de 568 km até 420 km até 190 km', 'de 700 km até 400 km até 100 km']

matcher = Matcher(nlp.vocab)
pattern = []

# 双段区间规则
pattern.append([{'POS': 'NUM'}, 
                {'OP': '?', 'TEXT': {'IN': UN}}, 
                {'TEXT': {'IN': ['a', 'até', '-']}}, 
                {'POS': 'NUM'}, 
                {'TEXT': {'IN': UN}}
                ]) 

# 三段区间规则
pattern.append([{'POS': 'NUM'}, 
                {'OP': '?', 'TEXT': {'IN': UN}}, 
                {'TEXT': {'IN': ['a', 'até']}}, 
                {'POS': 'NUM'}, 
                {'TEXT': {'IN': UN}},
                {'TEXT': {'IN': ['a', 'até']}}, 
                {'POS': 'NUM'}, 
                {'TEXT': {'IN': UN}}                     
                ]) 
    
matcher.add('Intervalo', pattern)

TRAINING_DATA = []

for doc in nlp.pipe(TEXTS):
    matches = matcher(doc)
    spans = [doc[start:end] for match_id, start, end in matches]
    # 新增:过滤重叠span,仅保留最长匹配
    filtered_spans = spacy.util.filter_spans(spans)
    entities = [(span.start_char, span.end_char, "Intervalo") for span in filtered_spans]
    training_example = (doc.text, {"entities": entities})
    TRAINING_DATA.append(training_example)

print(*TRAINING_DATA, sep="\n")

运行结果

('500 km até 543 km', {'entities': [(0, 17, 'Intervalo')]})
('de 568 km até 420 km até 190 km', {'entities': [(3, 31, 'Intervalo')]})
('de 700 km até 400 km até 100 km', {'entities': [(3, 31, 'Intervalo')]})

自定义筛选逻辑(可选)

如果不想依赖内置工具,也可以手动实现筛选逻辑:

  • 将所有匹配到的span按长度降序排序,长度相同则按起始位置升序排序
  • 遍历排序后的span,记录已经被覆盖的字符区间,仅保留未被覆盖的span即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:01