SpaCy:正则表达式模式在基于规则的匹配器中不起作用

问题描述 投票:0回答:1

我正在尝试定义一个正则表达式,用作我的 spaCy 模型中实体标尺组件中的文本模式。 目的是每当发现如下结构的单词时添加带有“COMP”标签的标记:

  • XXX-Ynnn
  • XXX Ynn 其中“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}}'}}]

但是结果是一样的,似乎无法得到任何匹配。

有人有什么建议吗?预先感谢!

python nlp spacy named-entity-recognition
1个回答
0
投票

AFAIK 在 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))
© www.soinside.com 2019 - 2024. All rights reserved.