Сохранить / загрузить Matcher с шаблонами в качестве нового компонента конвейера - PullRequest
1 голос
/ 10 января 2020

Я новичок в просторах. Пытаюсь сейчас добавить множество шаблонов в Matcher и интегрировать его с конвейером, чтобы потом я мог просто загрузить Matcher компонент из конвейера и использовать его, без повторного добавления большого количества паттерны.

Я создаю и сохраняю его со следующим кодом:

pattern = [{"LOWER": "hello"}, {"IS_PUNCT": True}, {"LOWER": "world"}],[{"LOWER": "hello"}, {"LOWER": "world"}]
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, *pattern)
nlp.add_pipe(matcher)
nlp.to_disk('mynlp')

Затем я пытаюсь загрузить свой компонент и использовать его:

from spacy.language import Language

Language.factories['Matcher'] = lambda nlp, **cfg: Matcher(nlp.vocab, **cfg)

nlp = spacy.load('mynlp')
matcher = nlp.get_pipe("Matcher")

doc = nlp("Hello, world! Hello world!", disable=["Matcher"])
matches = matcher(doc)

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

Но результат пустой список Я думаю, что шаблоны не сохранились. Есть что-то, что я неправильно понял или делаю неправильно?

1 Ответ

0 голосов
/ 24 января 2020

Компоненты конвейера работают как код, поэтому spaCy не пытается сохранить их на диск. Другие люди, использующие такую ​​модель, рискуют получить потенциально произвольный код в компонентах. Вы можете убедиться в этом, проверив len(matcher) перед сохранением и после загрузки. В мета. json в сохраненной модели есть запись конвейера Matcher, но для нее нет содержимого.

Есть несколько сообщений от разработчиков spaCy, например, https://github.com/explosion/spaCy/issues/2676#issuecomment -413274806 с руководство по добавлению необходимого кода пользовательского компонента в пакет python, который будет распространять ваш измененный конвейер.

...