SpaCyはカスタムセンテンサイザーエラーでモデルをディスクに保存します

Nov 27 2020

私は同様の質問がされたことを知っています:

Spacyカスタムセンテンス分割

SpaCyでのカスタムセンテンス境界検出

それでも私の状況は少し異なります。spacy Sentencizer()から次のように継承したい:

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

doc = nlp("Text and so on. Another sentence.")モデルを更新した後に呼び出すと、分割も正常に機能します。

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

トレーニング済みモデルを次のように保存したい場合:

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

次のエラーが発生します。

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

逆に、nlp.add_pipe(nlp.create_pipe( 'sentencizer'))を使用すると、エラーは発生しません。どの時点でpunct_chars属性を設定すべきだったのだろうか。スーパークラスから継承されるべきでしたか?

クラスからSentencizerを置き換え、最初の投稿に従ってオブジェクトを実行すると、機能しますが、途中でいくつかの貴重な情報(punct_charsなど)が失われる可能性があります。

よろしくお願いします。

クリス

回答

1 SergeyBushmanov Nov 29 2020 at 20:44

次のことを行う必要があります(注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")