我是spacy的新手,我已经阅读了有关基于令牌的匹配的文档。我已经使用REGEX尝试过spaCy匹配器,但没有任何结果。
当我使用re库进行匹配时,它仍然有效。
我在代码中做错了吗?
我正在尝试匹配“accès'd”一词
感谢您的帮助
# REGEX
import re
text = u"accès'd est ferme aujpourd'hui"
pattern_re = re.compile("^acc?é?e?è?s?s?'?D" , re.I)
pattern_re.match(text)
# <re.Match object; span=(0, 7), match="accès'd">
# REGEX SPACY VERSION 1
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("fr_core_news_sm")
pattern = [{'TEXT': {'REGEX' : "^acc?é?e?è?s?s?'?D"}}]
matcher = Matcher(nlp.vocab)
matcher.add('AccèsD' , None , pattern)
doc = nlp(text)
matches = matcher(doc)
for match_id, start , end in matches:
match_string = nlp.vocab.strings[match_id]
span = doc[start:end]
print(match_id, match_string, start , end , span.text)
# NOTHING
# REGEX SPACY VERSION 2
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("fr_core_news_sm")
accesd_flag = lambda text : bool(re.compile(r"^acc?é?e?è?s?s?'?D" , re.I).match(text))
IS_ACCESD = nlp.vocab.add_flag(accesd_flag)
pattern= [{IS_ACCESD : True}]
matcher = Matcher(nlp.vocab)
matcher.add('AccèsD' , None , pattern)
doc = nlp(text)
matches = matcher(doc)
for match_id, start , end in matches:
match_string = nlp.vocab.strings[match_id]
span = doc[start:end]
print(match_id, match_string, start , end , span.text)
# NOTHING
答案 0 :(得分:0)
2.1.0版引入了Regex对spacy的支持
v2.1.0之前的版本尚不支持REGEX运算符。
这可能与此有关,因为否则将不使用匹配器的REGEX
否则,我认为答案与不匹配所有上下文标记有关。然后,您应该稍微修改一下正则表达式,并使用LOWER
匹配属性来捕获两个令牌上下文。
text = u"accès'd est ferme aujpourd'hui"
pattern = [{"LOWER" : { "REGEX": "^acc?é?e?è?s?s?" }, {"LOWER": "d"}]
matcher = Matcher(nlp.vocab)
matcher.add("accesd", None, pattern)
doc = nlp(text)
matches = matcher(doc)
这是因为您使用的是re.I
标志,所以匹配器仅通过检查LOWER
属性即可以不区分大小写的方式工作