web-dev-qa-db-ja.com

より多くの名前付きエンティティタイプを認識するようにStanford NERシステムをトレーニングすることは可能ですか?

私は現在いくつかのNLPライブラリを使用しています(スタンフォードおよびnltk)スタンフォードデモの部分を見ましたが、それを使用してより多くのエンティティタイプを識別することができるかどうか尋ねたいだけです。

そのため、現在、スタンフォードNERシステム(デモが示すように)はエンティティを個人(名前)、組織、または場所として認識できます。しかし、認められている組織は、大学またはいくつかの大きな組織に限定されています。私の入力が "Apple"または "Square"の場合、会社として認識できるように、そのAPIを使用してより多くのエンティティタイプのプログラムを記述できるかどうか疑問に思っています。

独自のトレーニングデータセットを作成する必要がありますか?

さらに、エンティティとそれらの間の関係を抽出したい場合は、スタンフォード依存関係パーサーを使用する必要があると感じます。つまり、最初に名前付きエンティティと「名詞」としてタグ付けされた他の部分を抽出し、それらの間の関係を見つけます。

私は正しいですか。

ありがとう。

27
JudyJiang

はい、独自のトレーニングセットが必要です。事前トレーニング済みのスタンフォードモデルは、「スタンフォード」という単語を名前付きエンティティとしてのみ認識します。これは、その単語を含むデータ(または使用する機能セットに応じて非常に類似した単語ですが、それが何であるかわかりません)でトレーニングされているためです。名前付きエンティティとしてマークされています。

より多くのデータを取得したら、それを この質問 およびStanfordチュートリアルで説明されている正しい形式で配置する必要があります。

12
mbatchkarov

データの独自のコーパスを簡単にトレーニングできます。

スタンフォードNERでFAQ最初の質問は、NERの独自のモデルをトレーニングする方法です

リンクは http://nlp.stanford.edu/software/crf-faq.shtml です。

たとえば、次のようなトレーニングデータを与えることができます。

製品OBJ
O
Microsoft ORG

同様に、独自のトレーニングデータを作成してモデルを作成し、それを使用して目的の出力を取得できます

9
Rohan Amrute

カスタムNERモデルをトレーニングしたいようです。

以下は、完全なコードを含む詳細なチュートリアルです。

https://dataturks.com/blog/stanford-core-nlp-ner-training-Java-example.php?s=so

トレーニングデータ形式

トレーニングデータは、各行が1つのWordラベルペアであるテキストファイルとして渡されます。行内の各Wordには「Word\tLABEL」のような形式でラベルを付ける必要があります。Wordとラベル名はタブ「\ t」で区切られます。テキスト文の場合、それを単語に分解し、トレーニングファイルの各単語に1行追加する必要があります。次の行の開始をマークするには、トレーニングファイルに空の行を追加します。

以下は、入力トレーニングファイルのサンプルです。

hp  Brand
spectre ModelName
x360    ModelName

home    Category
theater Category
system  0

horizon ModelName
zero    ModelName
dawn    ModelName
ps4 0

ドメインに応じて、このようなデータセットを自動または手動で構築できます。このようなデータセットを手動で作成するのは非常に骨が折れる場合があり、NER注釈ツールなどのツールはプロセスをはるかに簡単にするのに役立ちます。

列車モデル

public void trainAndWrite(String modelOutPath, String prop, String trainingFilepath) {
   Properties props = StringUtils.propFileToProperties(prop);
   props.setProperty("serializeTo", modelOutPath);

   //if input use that, else use from properties file.
   if (trainingFilepath != null) {
       props.setProperty("trainFile", trainingFilepath);
   }

   SeqClassifierFlags flags = new SeqClassifierFlags(props);
   CRFClassifier<CoreLabel> crf = new CRFClassifier<>(flags);
   crf.train();

   crf.serializeClassifier(modelOutPath);
}

モデルを使用してタグを生成します:

public void doTagging(CRFClassifier model, String input) {
    input = input.trim();
    System.out.println(input + "=>"  +  model.classifyToString(input));
}  

お役に立てれば。

5
user439521