Сопоставление токеновой базы с spaCy REGEX - PullRequest
1 голос
/ 06 апреля 2019

Я новичок в spacy, и я прочитал документы о сопоставлении с токеном.Я попробовал spaCy matcher, используя REGEX, но у меня нет результатов.

Когда я использую библиотеку 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 Ответ

1 голос
/ 06 апреля 2019

Поддержка regex для spacy была введена в версии 2.1.0

На веб-сайте

Версии до v2.1.0 еще не поддерживают REGEXoperator.

Это может быть связано с этим, поскольку 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

...