Opennlp-chunking-sentences
OpenNLP-チャンキング文
文のチャンク化とは、文を単語グループや動詞グループなどの単語の一部に分割/分割することを指します。
OpenNLPを使用した文のチャンク化
文を検出するために、OpenNLPは en-chunker.bin という名前のファイルというモデルを使用します。 これは、指定された生テキストの文をチャンクするように訓練された事前定義モデルです。
*opennlp.tools.chunker* パッケージには、名詞句チャンクなどの非再帰的な構文注釈を見つけるために使用されるクラスとインターフェースが含まれています。
*ChunkerME* クラスの* chunk()*メソッドを使用して文をチャンクできます。 このメソッドは、文のトークンとPOSタグをパラメーターとして受け入れます。 したがって、チャンクのプロセスを開始する前に、まず文をトークン化し、そのPOSタグのパーツを生成する必要があります。
OpenNLPライブラリを使用して文をチャンクするには、する必要があります-
- 文をトークン化します。
- そのためのPOSタグを生成します。
- ChunkerModel クラスを使用して en-chunker.bin モデルを読み込みます
- ChunkerME クラスをインスタンス化します。
- このクラスの* chunk()*メソッドを使用して文をチャンクします。
以下は、与えられた生のテキストから文をチャンクするプログラムを書くために従うべきステップです。
ステップ1:文のトークン化
次のコードブロックに示すように、 whitespaceTokenizer クラスの* tokenize()*メソッドを使用して文をトークン化します。
//Tokenizing the sentence
String sentence = "Hi welcome to finddevguides";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
ステップ2:POSタグを生成する
次のコードブロックに示すように、 POSTaggerME クラスの* tag()*メソッドを使用して、文のPOSタグを生成します。
//Generating the POS tags
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
ステップ3:モデルの読み込み
文をチャンク化するモデルは、 ChunkerModel という名前のクラスで表されます。このクラスは、パッケージ opennlp.tools.chunker に属します。
文検出モデルをロードするには-
- モデルの InputStream オブジェクトを作成します(FileInputStreamをインスタンス化し、モデルのパスをString形式でコンストラクターに渡します)。
- 次のコードブロックに示すように、 ChunkerModel クラスをインスタンス化し、モデルの InputStream (オブジェクト)をコンストラクターにパラメーターとして渡します-
//Loading the chunker model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel chunkerModel = new ChunkerModel(inputStream);
ステップ4:chunkerMEクラスのインスタンス化
パッケージ opennlp.tools.chunker の chunkerME クラスには、文をチャンクするメソッドが含まれています。 これは、最大エントロピーベースのチャンカーです。
このクラスをインスタンス化し、前の手順で作成したモデルオブジェクトを渡します。
//Instantiate the ChunkerME class
ChunkerME chunkerME = new ChunkerME(chunkerModel);
ステップ5:文のチャンク化
*ChunkerME* クラスの* chunk()*メソッドを使用して、渡された生テキストの文をチャンクします。 このメソッドは、トークンとタグを表す2つの文字列配列をパラメーターとして受け入れます。
前の手順で作成したトークン配列とタグ配列をパラメーターとして渡すことにより、このメソッドを呼び出します。
//Generating the chunks
String result[] = chunkerME.chunk(tokens, tags);
例
以下は、指定された生テキストの文をチャンクするプログラムです。 このプログラムを ChunkerExample.java という名前のファイルに保存します。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerModel;
import opennlp.tools.cmdline.postag.POSModelLoader;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class ChunkerExample{
public static void main(String args[]) throws IOException {
//Tokenizing the sentence
String sentence = "Hi welcome to finddevguides";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating the POS tags
//Load the parts of speech model
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
//Loading the chunker model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel chunkerModel = new ChunkerModel(inputStream);
//Instantiate the ChunkerME class
ChunkerME chunkerME = new ChunkerME(chunkerModel);
//Generating the chunks
String result[] = chunkerME.chunk(tokens, tags);
for (String s : result)
System.out.println(s);
}
}
次のコマンドを使用して、コマンドプロンプトから保存されたJavaファイルをコンパイルして実行します-
javac ChunkerExample.java
java ChunkerExample
実行時に、上記のプログラムは指定された文字列を読み取り、その中の文をチャンクし、以下に示すように表示します。
Loading POS Tagger model ... done (1.040s)
B-NP
I-NP
B-VP
I-VP
トークンの位置の検出
*ChunkerME* クラスの* chunkAsSpans()*メソッドを使用して、チャンクの位置またはスパンを検出することもできます。 このメソッドは、Span型のオブジェクトの配列を返します。 *opennlp.tools.util* パッケージのSpanという名前のクラスは、セットの *start* および *end* 整数を格納するために使用されます。
次のコードブロックに示すように、* chunkAsSpans()*メソッドによって返されたスパンをSpan配列に格納して印刷できます。
//Generating the tagged chunk spans
Span[] span = chunkerME.chunkAsSpans(tokens, tags);
for (Span s : span)
System.out.println(s.toString());
例
以下は、指定された生テキスト内の文を検出するプログラムです。 このプログラムを ChunkerSpansEample.java という名前のファイルに保存します。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerModel;
import opennlp.tools.cmdline.postag.POSModelLoader;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.Span;
public class ChunkerSpansEample{
public static void main(String args[]) throws IOException {
//Load the parts of speech model
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Tokenizing the sentence
String sentence = "Hi welcome to finddevguides";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
//Loading the chunker model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel chunkerModel = new ChunkerModel(inputStream);
ChunkerME chunkerME = new ChunkerME(chunkerModel);
//Generating the tagged chunk spans
Span[] span = chunkerME.chunkAsSpans(tokens, tags);
for (Span s : span)
System.out.println(s.toString());
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します-
javac ChunkerSpansEample.java
java ChunkerSpansEample
実行すると、上記のプログラムは、指定された文字列とその中のチャンクのスパンを読み取り、次の出力を表示します-
Loading POS Tagger model ... done (1.059s)
[0..2) NP
[2..4) VP
チャンカー確率検出
*ChunkerME* クラスの* probs()*メソッドは、最後にデコードされたシーケンスの確率を返します。
//Getting the probabilities of the last decoded sequence
double[] probs = chunkerME.probs();
以下は、 chunker によって最後にデコードされたシーケンスの確率を出力するプログラムです。 このプログラムを ChunkerProbsExample.java という名前のファイルに保存します。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerModel;
import opennlp.tools.cmdline.postag.POSModelLoader;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class ChunkerProbsExample{
public static void main(String args[]) throws IOException {
//Load the parts of speech model
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Tokenizing the sentence
String sentence = "Hi welcome to finddevguides";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
//Loading the chunker model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel cModel = new ChunkerModel(inputStream);
ChunkerME chunkerME = new ChunkerME(cModel);
//Generating the chunk tags
chunkerME.chunk(tokens, tags);
//Getting the probabilities of the last decoded sequence
double[] probs = chunkerME.probs();
for(int i = 0; i<probs.length; i++)
System.out.println(probs[i]);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します-
javac ChunkerProbsExample.java
java ChunkerProbsExample
実行時に、上記のプログラムは指定された文字列を読み取り、チャンクし、最後にデコードされたシーケンスの確率を出力します。
0.9592746040797778
0.6883933131241501
0.8830563473996004
0.8951150529746051