web-dev-qa-db-ja.com

spaCyを使用して新しいエンティティを作成し、キーワードリストからのみ学習する方法

spaCy を使用して、種の名前のリストを持つ新しいエンティティ分類「種」を作成しようとしています。例として、彼は here を見つけることができます。

このspaCyチュートリアル (Githubコード ここ )から新しいエンティティタイプをトレーニングするためのチュートリアルを見つけました。ただし、問題は、種の名前ごとに手動で文を作成するのは非常に時間がかかるためです。

以下のようなトレーニングデータを作成しました。

TRAIN_DATA = [('Bombina',{'entities':[(0,6,'SPECIES')]}),
 ('Dermaptera',{'entities':[(0,9,'SPECIES')]}),
  .... 
]

トレーニングセットの作成方法は次のとおりです。完全な文と一致するエンティティの場所を提供する代わりに、各種の名前のみを提供し、開始インデックスと終了インデックスをプログラムで生成します。

[(0、6、 'SPECIES')]

[(0、9、 '種')]

以下のトレーニングコードは、モデルのトレーニングに使用したものです。 (上記のハイパーリンクからコピーされたコード)

nlp = spacy.blank('en')  # create blank Language class

 # Add entity recognizer to model if it's not in the pipeline 
 # nlp.create_pipe works for built-ins that are registered with spaCy 
 if 'ner' not in nlp.pipe_names: 
     ner = nlp.create_pipe('ner') 
     nlp.add_pipe(ner) 
 # otherwise, get it, so we can add labels to it 
 else: 
     ner = nlp.get_pipe('ner') 

 ner.add_label(LABEL)   # add new entity label to entity recognizer


  if model is None: 
      optimizer = nlp.begin_training() 
  else: 
      # Note that 'begin_training' initializes the models, so it'll zero out 
      # existing entity types. 
      optimizer = nlp.entity.create_optimizer() 

     # get names of other pipes to disable them during training 
     other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner'] 
     with nlp.disable_pipes(*other_pipes):  # only train NER 
         for itn in range(n_iter): 
             random.shuffle(TRAIN_DATA) 
             losses = {} 
             for text, annotations in TRAIN_DATA: 
                 nlp.update([text], [annotations], sgd=optimizer, drop=0.35,  losses=losses) 
             print(losses) 

私はNLPとspaCyが初めてなので、正しくやったかどうか教えてください。そして、私の試みがトレーニングに失敗した理由(実行したときにエラーがスローされます)。


[更新]

トレーニングモデルのみにキーワードをフィードする理由は、理想的には、モデルがそれらのキーワードを最初に学習し、キーワードを含むコンテキストを識別すると、関連するコンテキストを学習することを期待するためです。現在のモデルを強化します。

一見、正規表現のようです。しかし、より多くのデータが入力されると、モデルは継続的に学習し、最終的に元のトレーニングセットには存在しなかった新しい種の名前を特定できるようになります。


ありがとう、ケイティ

10
katie lu

テキスト内のSPECIESを検出するために名前付きエンティティ認識エンジンをトレーニングする利点は、モデルがサンプルを認識できるだけでなく、generaliseコンテキストで他の種を認識します。固定された用語セットのみを検索し、それ以上は検索したくない場合は、より単純なルールベースのアプローチが適している場合があります。この例と詳細を見つけることができます こちら

モデルでコンテキスト内のエンティティタイプを一般化し、認識したい場合は、コンテキスト内のエンティティの例をshowする必要もあります。現在、これがトレーニング例の問題です。モデルの単一の単語のみを表示し、単語を含む文は表示していません。良い結果を得るには、モデルをトレーニングするデータを、後で分析するデータにできるだけ近づける必要があります。

ラベルの付いた例がない、または少ないモデルをトレーニングする他のアプローチがありますが、spaCyモデルをトレーニングするためのトレーニングデータを収集する最も簡単な戦略は...トレーニングデータにラベルを付けることです。ただし、これを軽減するために使用できるいくつかのトリックがあります。

  • 種のリストから始めて、 MatcherまたはPhraseMatcher を使用して、ドキュメント内でそれらを見つけます。一致するたびにSpanオブジェクトを取得するため、テキスト内のスパンの開始位置と終了位置を抽出できます。これにより、簡単に多数のサンプルを簡単に作成できます。詳細については、こちらをご覧ください こちら

  • Wordベクトル を使用して、探しているエンティティに類似した用語を検索します。そのため、上記のアプローチを使用してテキストで検索できるサンプルが増えます。用語が非常に具体的であるため、spaCyの ベクトルモデル があなたの種にどのように役立つかはわかりません。そのため、種を含む生のテキストの大規模なコーパスがある場合、独自のベクターをトレーニングする必要があります。

  • ラベリングまたはデータ注釈ツールを使用します。 Brat のようなオープンソースのソリューションがあります。または、注釈とトレーニングについてもっと真剣になったら、注釈ツール Prodigy もチェックしてください。は、spaCyとシームレスに統合する最新の商用ソリューションです(免責事項:私はspaCyのメンテナーの1人です)。

14
Ines Montani