Sapcy 3.0: невозможно добавить поиск по костюмам для Lemmatizer

Я использовал приведенный ниже код, чтобы добавить пользовательский Lookups к обычаю Lanuage класс:

      def create_lookups():
    lookups = Lookups()
    lookups.add_table("lemma_lookup", LOOKUP)
    lookups.add_table("lemma_rules", json_to_dict('lemma_rules.json'))
    lookups.add_table("lemma_index", json_to_dict('lemma_index.json'))
    lookups.add_table("lemma_exc", json_to_dict('lemma_exc.json'))
    return lookups


def json_to_dict(filename):
    location = os.path.realpath(
        os.path.join(os.getcwd(), os.path.dirname(__file__)))
    with open(os.path.join(location, filename)) as f_in:
        return json.load(f_in)


@CustomeLanguage.factory(
    "lemmatizer",
    assigns=["token.lemma"],
    default_config={"model": None, "mode": "lookup", "overwrite": False},
    default_score_weights={"lemma_acc": 1.0},
)
def make_lemmatizer(
        nlp: Language, model: Optional[Model], name: str, mode: str, overwrite: bool
):
    lemmatizer = Lemmatizer(nlp.vocab, model, name, mode=mode, overwrite=overwrite)
    lemmatizer.lookups = create_lookups()
    return lemmatizer


Но когда я создаю экземпляр CustomLanguage в nlp.vocab.lookups. В чем проблема и как ее решить?

1 ответ

Решение

Поисковые запросы лемматизатора больше не используются в словаре. Они хранятся в компоненте лемматизатора под nlp.get_pipe("lemmatizer").lookups вместо.

Если ваша фабрика лемматизаторов создает лемматизатор, подобный этому, любой, кто загружает модель, должен будет иметь эти файлы JSON, иначе модель не загрузится. (Таблицы поиска сохраняются в модели, но ваша make_lemmatizer метод просто не был написан с учетом этого.)

Вместо этого создайте собственный класс лемматизатора, который загружает эти таблицы в свой метод, и тогда ваш код будет выглядеть так, чтобы добавить лемматизатор и загрузить его таблицы один раз.

      nlp = spacy.blank("lg")
nlp.add_pipe("lemmatizer").initialize()
nlp.to_disk("/path/to/model")

Как только вы бежите initialize() один раз для лемматизатора таблицы сохраняются в каталоге модели, и вам не нужно запускать его снова при перезагрузке модели.

Это может выглядеть примерно так, что также позволит вам передать Lookups Возражать initialize вместо этого, если вы предпочитаете:

      class CustomLemmatizer(Lemmatizer):
    def initialize(
        self,
        get_examples: Optional[Callable[[], Iterable[Example]]] = None,
        *,
        nlp: Optional[Language] = None,
        lookups: Optional[Lookups] = None,
    ):
        if lookups is None:
            self.lookups = create_lookups()
        else:
            self.lookups = lookups
Другие вопросы по тегам