SpaCy speichert das Modell mit einem benutzerdefinierten Sentencizer-Fehler auf der Festplatte

Nov 27 2020

Ich weiß, dass ähnliche Fragen gestellt wurden:

Spacy benutzerdefinierte Satzaufteilung

Benutzerdefinierte Satzgrenzenerkennung in SpaCy

Dennoch ist meine Situation etwas anders. Ich möchte vom spacy Sentencizer () erben mit:

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

Auch das Aufteilen funktioniert einwandfrei, wenn ich doc = nlp("Text and so on. Another sentence.")nach dem Aktualisieren des Modells aufrufe:

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

wenn ich das trainierte Modell speichern möchte mit:

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

Ich erhalte folgende Fehlermeldung:

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

Im Gegensatz dazu tritt der Fehler nicht auf, wenn ich die Datei nlp.add_pipe (nlp.create_pipe ('verurteilender')) verwende. Ich frage mich, an welchem ​​Punkt ich das Attribut punct_chars hätte setzen sollen. Es sollte von der Oberklasse geerbt worden sein?

Wenn ich den Sentencizer aus der Klasse ersetze und gemäß dem ersten Beitrag ein Objekt mache, funktioniert es, aber ich kann einige wertvolle Informationen auf dem Weg verlieren, z. B. punct_chars?

Vielen Dank für Ihre Hilfe im Voraus.

Chris

Antworten

1 SergeyBushmanov Nov 29 2020 at 20:44

Folgendes sollte reichen (Hinweis 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")