首页 > 解决方案 > 在 spaCy PhraseMatcher 上使用正则表达式

问题描述

我有以下代码,尝试使用 PhraseMatcher 匹配是否有速度,例如句子中的“44 mph”。

import spacy
from spacy.matcher import PhraseMatcher
import re

nlp = spacy.load('en_core_web_sm')
speed_flag = lambda text: bool(re.search(r'(?i)\d+\s?mph', text))
IS_SPEED = nlp.vocab.add_flag(speed_flag)

matcher = PhraseMatcher(nlp.vocab)
matcher.add('MPH', None, [{IS_SPEED: True}])

doc = nlp(u'Car was going 44 mpH.')
matches = matcher(doc)

print(matches)
for match_id, start, end in matches:
    span = doc[start:end]
    print(span.text)

这会返回一个空列表,但是re.compile(r'([M-m][P-p][H-h])')会返回“Mph”、“mpH”、“mPh”等的正确答案,并re.compile(r'([0-9]+)')返回我文档中的任何数字。

我在这里使用示例来构造它:language-features#regex ...另外,我([0-9]+) ?([M-m][P-p][H-h])在 python 解释器中测试了我的正则表达式模式,它确实有效。

我意识到原始示例是使用完成的,Matcher并且我正在尝试使用PhraseMatcher,不接受正确输入(即字典列表)来执行此操作。

关于如何实现这一目标的任何想法。

标签: regexpython-3.xpattern-matchingspacy

解决方案


推荐阅读