SpaCy:正则表达式在规则匹配器中无效

1 投票
2 回答
40 浏览
提问于 2025-04-14 16:54

我正在尝试定义一个正则表达式,用于在我的spaCy模型中的实体规则组件里作为文本模式。我的目标是每当找到像这样的词时,就添加带有“COMP”标签的标记:

  • XXX-Ynnn
  • XXX Ynnn 其中'XXX'是一个列表中的三字母组合,'Y'是一个字母,'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 = [{"TEXT": {"REGEX": fr'{ref}(-| ){letter}[0-9]{{3}}'}}]

但结果是一样的,似乎没有匹配到任何内容。

有没有人有什么建议?提前谢谢!

2 个回答

1

据我所知,在自然语言处理(NLP)的上下文中,三元组是指一系列的N个单词(这里是3个)。

我觉得在这个情况下,{ref}是不需要的。假设你单元格里的值是love like me-V123,如果用上{ref},你会得到整个字符串,这并不是你想要的,因为你只关心"love like me"这部分。

所以我会构建以下的正则表达式,来匹配你的情况:

  • \w+\s+\w+\s+\w+-[YVBFKS]\d{3} -> 带有“-”的正则表达式

  • \w+\s+\w+\s+\w+\s+[YVBFKS]\d{3} -> 不带“-”的正则表达式

把这些都放在一起用Python来实现,我会得到:

import re

pattern = r"\w+\s+\w+\s+\w+-[YVBFKS]\d{3}"
labeled_tokens = []

for ref in input_references.iloc[:, 0]:
    # Check if the token matches the pattern
    if re.match(pattern, ref ):
        labeled_tokens.append((ref, "COMP"))
    else:
        labeled_tokens.append((ref, None))
0

最后我得到了

print(f"Adding references for system: {ref}")
    for letter in letters:
        for nnn in range(1000):
            pattern = f"{ref}-{letter}{nnn:03d}"
            ref_patterns.append({"label": "COMP", "pattern": pattern})
            pattern = f"{ref} {letter}{nnn:03d}"
            ref_patterns.append({"label": "COMP", "pattern": pattern})

对于每一个模式来说。代码虽然长了一点,速度也稍微慢了一些,但它完全能完成任务!

撰写回答