我有以下代码,尝试使用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]+)')
返回我的文档中的任何数字。
我在这里使用示例来构造它:linguistic-features#regex ...另外,我在python解释器中测试了我的正则表达式模式([0-9]+) ?([M-m][P-p][H-h])
,它确实起作用。
我意识到原来的示例是使用Matcher
完成的,并且我尝试使用PhraseMatcher,
来接受此错误输入(即,词典列表)。
关于如何实现这一目标的任何想法。