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

SpaCy Entity Ruler组件Regex模式匹配失效问题求助

问题描述

我正尝试在SpaCy模型的Entity Ruler组件中定义正则表达式作为文本模式,目标是匹配到以下格式的内容时为其添加COMP标签:

  • XXX-Ynnn
  • XXX Ynnn
    其中XXX为列表中的三元组,Y为指定字母(V/B/F/K/S),nnn为三位数字组合。

我用了如下代码实现:

def add_component_patterns_re(input_references, model_ruler):
    ruler = model_ruler
    ref_patterns = []
    letters = ['V', 'B', 'F', 'K', 'S']

    print("Adding component patterns")
    for ref in input_references.iloc[:, 0]:
        # print(f"Adding references for system: {ref}")
        for letter in letters:
            pattern_text = fr'{ref}(-| ){letter}[0-9]{{3}}'
            pattern = {"TEXT": {"REGEX": fr'{ref}(-| ){letter}[0-9]{{3}}'}} 
            ref_patterns.append({"label":"COMP", "pattern":pattern})
    ruler.add_patterns(ref_patterns)

    return ref_patterns

打印添加的模式后,我认为输出列表是正确的,但就是无法匹配内容。我还尝试把pattern改成列表形式:

pattern = [{"TEXT": {"REGEX": fr'{ref}(-| ){letter}[0-9]{{3}}'}}]

结果还是不行,求解决方案。

解决方案

你的核心问题是误解了SpaCy中TEXT匹配的逻辑:TEXT是针对**单个分词单元(token)**的正则匹配,但你要匹配的格式里,空格分隔的XXX Ynnn会被分词器拆成两个独立token,就算是连字符连接的XXX-Ynnn,也可能因分词规则被拆分,导致单个TEXT的正则根本无法覆盖跨token的内容。

另外,你没有处理XXX中可能存在的正则特殊字符(比如.、*),这也会导致正则匹配失效。

修正后的代码如下:

import re

def add_component_patterns_re(input_references, model_ruler):
    ruler = model_ruler
    ref_patterns = []
    letters = ['V', 'B', 'F', 'K', 'S']
    digit_re = r'[0-9]{3}'

    print("Adding component patterns")
    for ref in input_references.iloc[:, 0]:
        # 转义XXX中的正则特殊字符,避免干扰匹配
        escaped_ref = re.escape(ref)
        # 处理XXX-Ynnn格式:单个token的情况
        single_token_re = fr'{escaped_ref}-[{"".join(letters)}]{digit_re}'
        ref_patterns.append({
            "label": "COMP",
            "pattern": [{"TEXT": {"REGEX": single_token_re}}]
        })
        # 处理XXX Ynnn格式:两个独立token的情况
        ref_patterns.append({
            "label": "COMP",
            "pattern": [
                {"TEXT": escaped_ref},
                {"TEXT": {"REGEX": fr'[{"".join(letters)}]{digit_re}'}}
            ]
        })
    
    ruler.add_patterns(ref_patterns)
    return ref_patterns

额外检查点

  1. 用nlp.tokenizer("XXX-Ynnn")和nlp.tokenizer("XXX Ynnn")测试分词结果,确认目标格式的token拆分情况,如果连字符也被拆成单独token,需要再调整模式加入连字符的匹配项。
  2. 确认input_references.iloc[:,0]中的XXX值没有多余空格或隐藏字符,避免匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:28:19