SpaCy zapisuje model na dysku z niestandardowym błędem Sentencizera

Nov 27 2020

Wiem, że zadawano podobne pytania:

Przestrzenne dzielenie zdań niestandardowych

Wykrywanie niestandardowych granic zdań w SpaCy

jednak moja sytuacja jest trochę inna. Chcę odziedziczyć po spacy Sentencizer () z:

from spacy.pipeline import Sentencizer

class MySentencizer(Sentencizer):
    def __init__(self):
        self.tok = create_mySentencizer() # returning the sentences

    def __call__(self, *args, **kwargs):
        doc = args[0]
        for tok in doc:
            # do set the boundaries with tok.is_sent_start 
        return doc

Nawet jeśli podział działa dobrze, jeśli zadzwonię doc = nlp("Text and so on. Another sentence.")po aktualizacji modelu:

  nlp = spacy.load("some_model")
  sentencizer = MySentencizer()
  nlp.add_pipe(sentencizer, before="parser")
  # update model 

kiedy chcę zapisać wytrenowany model z:

nlp.to_disk("path/to/my/model")

Otrzymuję następujący błąd:

AttributeError: 'MySentencizer' object has no attribute 'punct_chars'

Wręcz przeciwnie, jeśli używam nlp.add_pipe (nlp.create_pipe ('sentencizer')), błąd nie występuje. Zastanawiam się, w którym momencie powinienem ustawić atrybut punct_chars. Powinien zostać odziedziczony po superklasie?

Jeśli wymienię Sentencizera z klasy i zrobię obiekt zgodnie z pierwszym postem, to działa, ale mogę stracić po drodze cenne informacje np. Punct_chars?

Z góry dziękuję za pomoc.

Chris

Odpowiedzi

1 SergeyBushmanov Nov 29 2020 at 20:44

Co należy zrobić (uwaga super(MySentencizer, self).__init__()):

import spacy
from spacy.pipeline import Sentencizer

class MySentencizer(Sentencizer):
    def __init__(self):
        super(MySentencizer, self).__init__() 

    def __call__(self, *args, **kwargs):
        doc = args[0]
        for tok in doc:
            tok.is_sent_start = True if tok.orth == "." else False
        return doc

nlp = spacy.load("en_core_web_md")
sentencizer = MySentencizer()
nlp.add_pipe(sentencizer, before="parser")

nlp.to_disk("model")