Ну, атрибут default
- это значение, которое возвращается, когда не установлены ни getter
, ни setter
, следовательно, это то, что было возвращено (свойство или функция, если вы удалите декоратор property
). Таким образом вы можете хранить некоторую статическую информацию.
Вы хотите установить getter
, как вы это сделали в своем ответе, так как это операция, которая вызывается, когда вы хотите получить значение атрибута. setter
должно быть создано при изменении значения, например:
doc[0]._.letters = "A"
setter
было бы хорошо предоставить другое значение, чем default
, хотя я до сих пор не использовал этот подход.
Наконец, я нашел чистый способ расширения spacy
(и IMO более читабельный, чем представленный), пример расширения lemmatization
:
class Lemmatizer:
def __init__(self):
self.lemmatizer = spacy.lemmatizer.Lemmatizer(
spacy.lang.en.LEMMA_INDEX,
spacy.lang.en.LEMMA_EXC,
spacy.lang.en.LEMMA_RULES,
)
def __call__(self, token):
corrected = token._.text
if token.text == corrected:
return token.lemma_
return self.lemmatizer(corrected, token.pos_)[0]
spacy.tokens.Token.set_extension("lemma", getter=Lemmatizer(), force=True)
Как видите, единственное, что нужно использовать, - это перегруженный метод __call__
(генератор не нужен, но вы также можете использовать его, в зависимости от контекста вашей задачи).