SpaCy enregistre le modèle sur le disque avec une erreur Sentencizer personnalisée

Nov 27 2020

Je sais que des questions similaires ont été posées:

Fractionnement de phrases personnalisé Spacy

Détection de limite de phrase personnalisée dans SpaCy

pourtant ma situation est un peu différente. Je veux hériter du spacy Sentencizer () avec:

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

Même le fractionnement fonctionne bien si j'appelle doc = nlp("Text and so on. Another sentence.")après la mise à jour du modèle:

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

quand je veux enregistrer le modèle entraîné avec:

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

J'obtiens l'erreur suivante:

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

Au contraire, si j'utilise le nlp.add_pipe (nlp.create_pipe ('sentencizer')), l'erreur ne se produit pas. Je me demande à quel point j'aurais dû définir l'attribut punct_chars. Il aurait dû être hérité de la superclasse?

Si je remplace le Sentencizer de la classe et que je fais objet selon le premier message, cela fonctionne, mais je peux perdre des informations précieuses sur le chemin, par exemple punct_chars?

Merci d'avance pour votre aide.

Chris

Réponses

1 SergeyBushmanov Nov 29 2020 at 20:44

Ce qui suit devrait faire (note 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")