SpaCy guardar modelo en disco con error de Sentencizer personalizado
Sé que se hicieron preguntas similares:
División de oraciones personalizadas de Spacy
Detección personalizada de límites de oraciones en SpaCy
sin embargo, mi situación es un poco diferente. Quiero heredar del spacy Sentencizer () con:
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
Incluso aunque la división funciona bien si llamo doc = nlp("Text and so on. Another sentence.")
después de actualizar el modelo:
nlp = spacy.load("some_model")
sentencizer = MySentencizer()
nlp.add_pipe(sentencizer, before="parser")
# update model
cuando quiero guardar el modelo entrenado con:
nlp.to_disk("path/to/my/model")
Obtuve el siguiente error:
AttributeError: 'MySentencizer' object has no attribute 'punct_chars'
Por el contrario, si utilizo nlp.add_pipe (nlp.create_pipe ('sentencizer')), el error no ocurre. Me pregunto en qué punto debería haber configurado el atributo punct_chars. ¿Debería haber sido heredado de la superclase?
Si reemplazo el Sentencizer de la clase y me opongo de acuerdo con la primera publicación, funciona, pero puedo perder información valiosa en el camino, por ejemplo, punct_chars?
Gracias por la ayuda de antemano.
Chris
Respuestas
Debe hacer lo siguiente (nota 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")