SpaCy salvar modelo em disco com erro personalizado do Sentencizer

Nov 27 2020

Eu sei que perguntas semelhantes foram feitas:

Divisão de frase personalizada no Spacy

Detecção de limite de frase personalizada no SpaCy

no entanto, minha situação é um pouco diferente. Eu quero herdar do spacy Sentencizer () com:

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

Mesmo que a divisão funcione bem se eu chamar doc = nlp("Text and so on. Another sentence.")depois de atualizar o modelo:

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

quando quero salvar o modelo treinado com:

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

Eu obtenho o seguinte erro:

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

Ao contrário, se eu usar o nlp.add_pipe (nlp.create_pipe ('sentencizer')) o erro não ocorre. Eu me pergunto em que ponto eu deveria ter definido o atributo punct_chars. Deveria ter sido herdado da superclasse?

Se eu substituir o Sentencizer da classe e contestar de acordo com o primeiro post, funciona, mas posso perder algumas informações valiosas no caminho, por exemplo, punct_chars?

Obrigado pela ajuda antecipadamente.

Chris

Respostas

1 SergeyBushmanov Nov 29 2020 at 20:44

O seguinte deve fazer (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")