2011-08-05 6 views
9

[OK]を、私はOpenNLPOpenNLPでNamed Entity Recognizerの識別子を訓練する方法は?

FileReader fileReader = new FileReader("train.txt"); 
ObjectStream fileStream = new PlainTextByLineStream(fileReader); 
ObjectStream sampleStream = new NameSampleDataStream(fileStream); 
TokenNameFinderModel model = NameFinderME.train("pt-br", "train", sampleStream, Collections.<String, Object>emptyMap()); 
nfm = new NameFinderME(model); 

私は何かが欠けている場合の何か間違ったことをやっている場合、私は知らないからNER識別子を訓練するために、次のコードを持っているが、分類が動作していません。私はtrain.txtが間違っていると思います。

エラーは、すべてのトークンが1つのタイプに分類されるというエラーが発生します。

私のtrain.txtデータは、次の例のようなものですが、エントリのバリエーションと量が非常に多くなっています。もう一つのことは、私は、時間ごとのテキストから単語ごとに単語を分類し、すべてのトークンではないことです。

<START:distance> 8000m <END> 
<START:temperature> 100ºC <END> 
<START:weight> 50kg <END> 
<START:name> Renato <END> 

誰かが私が間違っていることを示すことができますか?

+0

OpenNLPのどのバージョンを使用していますか教えてください。私はOpenNLP 1.5.1を使用しているので、temparatue、距離と重量のモデルファイルはありません。 –

+0

@ raj.singh私はOpenNLPを使用していません。私は私の目的のために自分の分類子を今コーディングしています。 –

+0

こんにちは@Renato Dinhani、私は同じ問題を抱えています。どうすればあなたのアプリケーションでこれを解決できますか?私はtrain.txt例外:java.security.NoSuchAlgorithmException –

答えて

22

あなたのトレーニングデータは正常ではありません。

あなたはセンテンス内のコンテキスト内のすべてのエンティティを置く必要があります。

At an altitude of <START:distance> 8000m <END> the temperature of boiling water is less than <START:temperature> 100ºC <END> . 
The climber <START:name> Renato <END> is carrying <START:weight> 50kg <END> of equipment. 

あなたのトレーニングデータは、現実世界の文章から派生した場合、より良い結果を持っていて、分類されている文章の同じスタイルを持っています。たとえば、ニュースを処理する場合は、新聞コーパスを使用して訓練する必要があります。

また、あなたのモデルを構築するには何千もの文章が必要です!多分あなたは百人でブートストラップし、貧しいモデルを使ってコーパスを改善し、モデルを再び訓練することができます。

もちろん、文のすべてのトークンを分類する必要があります。そうでなければ、エンティティのタイプを決定するコンテキストはありません。

+0

こんにちはwcolen、私は同じ問題を抱えています、あなたは私にいくつかのリンクや例文列車を与えることができますか? –

+1

@ Riddhish.Chaudhari、ここの例をご覧ください:http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/test/resources/opennlp/tools/sentdetect/Sentences.txt?view=markup 。 1行に1文、新しい段落に空白行が必要です。 – wcolen