web-dev-qa-db-ja.com

opennlpで独自のモデルをトレーニングする

独自のモデルopenNLPを作成するのは難しいと感じています。モデルの所有方法を教えてもらえますか?トレーニングはどのように行われるべきか。

入力は何で、出力モデルファイルはどこに保存されますか。

22
user1482228

https://opennlp.Apache.org/docs/1.5.3/manual/opennlp.html

このWebサイトは非常に便利で、コードで表示され、OpenNLPアプリケーションを使用して、エンティティの抽出や品詞など、さまざまなタイプのモデルをトレーニングします。

ここでいくつかのコード例を紹介できますが、このページは非常にわかりやすく使用されています。

理論的に:

基本的に、トレーニングしたいものをリストしたファイルを作成します

例えば。

スポーツ[空白]これはフットボール、ラグビーなどに関するページです

政治[空白]これはトニーブレアが首相であることについてのページです。

フォーマットは上のページで説明されています(モデルごとに異なるフォーマットが必要です)。このファイルを作成したら、APIまたはopennlpアプリケーション(コマンドライン経由)のいずれかを介して実行すると、.binファイルが生成されます。この.binファイルを取得したら、それをモデルにロードして、使用を開始できます(上記のWebサイトのAPIに従って)。

9
andrew.butkus

まず、必要なエンティティを使用してデータをトレーニングする必要があります。

文は改行文字(\ n)で区切る必要があります。値はスペース文字で区切ってタグ付けする必要があります。
薬の実体モデルを作成したいとします。したがって、データは次のようになります。

<START:medicine> Augmentin-Duo <END> is a penicillin antibiotic that contains two medicines - <START:medicine> amoxicillin trihydrate <END> and 
<START:medicine> potassium clavulanate <END>. They work together to kill certain types of bacteria and are used to treat certain types of bacterial infections.

たとえば、サンプル dataset を参照できます。より良い結果を得るには、トレーニングデータに少なくとも15000文が必要です。

さらに、OpennlpTokenNameFinderTrainerを使用できます。出力ファイルは.bin形式になります。

次に例を示します。 OpenNLPでカスタムNameFinderモデルを作成する

詳細については、 Opennlpドキュメント を参照してください。

3
Nishu Tayal

おそらく、この記事はあなたを助けるでしょう。ウィキペディアから抽出されたデータからTokenNameFinderトレーニングを行う方法について説明します。

2
Oto Brglez

データ内のデータをコピーし、以下のコードを実行して、独自のmymodel.binを取得します。

データを参照できます= https://github.com/mccraigmccraig/opennlp/blob/master/src/test/resources/opennlp/tools/namefind/AnnotatedSentencesWithTypes.txt

public class Training {
       static String onlpModelPath = "mymodel.bin";
       // training data set
       static String trainingDataFilePath = "data.txt";

       public static void main(String[] args) throws IOException {
                       Charset charset = Charset.forName("UTF-8");
                       ObjectStream<String> lineStream = new PlainTextByLineStream(
                                                       new FileInputStream(trainingDataFilePath), charset);
                       ObjectStream<NameSample> sampleStream = new NameSampleDataStream(
                                                       lineStream);
                       TokenNameFinderModel model = null;
                       HashMap<String, Object> mp = new HashMap<String, Object>();
                       try {
                              //         model = NameFinderME.train("en","drugs", sampleStream, Collections.<String,Object>emptyMap(),100,4) ;
                                       model=  NameFinderME.train("en", "drugs", sampleStream, Collections. emptyMap());
                       } finally {
                                       sampleStream.close();
                       }
                       BufferedOutputStream modelOut = null;
                       try {
                                       modelOut = new BufferedOutputStream(new FileOutputStream(onlpModelPath));
                                       model.serialize(modelOut);
                       } finally {
                                       if (modelOut != null)
                                                       modelOut.close();
                       }
       }
}
1
user6858643