SpaCy:正则表达式在规则匹配器中无效
我正在尝试定义一个正则表达式,用于在我的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})
对于每一个模式来说。代码虽然长了一点,速度也稍微慢了一些,但它完全能完成任务!