маркировщик английского языка по умолчанию spacy изменяется при повторном назначении

#python #python-3.x #spacy #spacy-3

Вопрос:

Когда вы назначаете маркировщику в английской языковой модели spacy’s (v3.0.5) en_core_web_sm свой собственный маркировщик по умолчанию, он изменяет свое поведение.

Вы бы не ожидали никаких изменений, но это молчаливо терпит неудачу. Почему это так?

Код для воспроизведения:

 import spacy

text = "don't you're i'm we're he's"

# No tokenizer assignment, everything is fine
nlp = spacy.load('en_core_web_sm')
doc = nlp(text)
[t.lemma_ for t in doc]
>>> ['do', "n't", 'you', 'be', 'I', 'be', 'we', 'be', 'he', 'be']

# Default Tokenizer assignent, tokenization and therefore lemmatization fails
nlp = spacy.load('en_core_web_sm')
nlp.tokenizer = spacy.tokenizer.Tokenizer(nlp.vocab)
doc = nlp(text)
[t.lemma_ for t in doc]
>>> ["don't", "you're", "i'm", "we're", "he's"]
 

Комментарии:

1. Я думаю, вам следует использовать:tokenizer =nlp.Defaults.create_tokenizer(nlp.vocab)

2. Ошибка атрибута: объект типа ‘EnglishDefaults’ не имеет атрибута ‘create_tokenizer’ @NirElbaz

Ответ №1:

Чтобы создать настоящий маркер по умолчанию, необходимо передать все значения по умолчанию в класс маркера, а не только вокаб:

 from spacy.util import compile_prefix_regex, compile_suffix_regex, compile_infix_regex

rules = nlp.Defaults.tokenizer_exceptions
infix_re = compile_infix_regex(nlp.Defaults.infixes)
prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)

tokenizer = spacy.tokenizer.Tokenizer(
        nlp.vocab,
        rules = rules,
        prefix_search=prefix_re.search,
        suffix_search=suffix_re.search,
        infix_finditer=infix_re.finditer,
    )