SpaCy guardar modelo en disco con error de Sentencizer personalizado

Nov 27 2020

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

1 SergeyBushmanov Nov 29 2020 at 20:44

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")