使用spaCy REGEX进行的基于令牌的匹配

时间:2019-04-06 00:50:03

标签: python regex nlp spacy

我是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

1 个答案:

答案 0 :(得分:0)

2.1.0版引入了Regex对spacy的支持

来自the website

  

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属性即可以不区分大小写的方式工作