OpenNLP-名前付きエンティティの認識
特定のテキストから名前、人、場所、その他のエンティティを見つけるプロセスは、次のように知られています。 Named Entity Rエコグニション(NER)。この章では、OpenNLPライブラリを使用してJavaプログラムを介してNERを実行する方法について説明します。
オープンNLPを使用した名前付きエンティティの認識
さまざまなNERタスクを実行するために、OpenNLPはさまざまな定義済みモデル、つまりen-nerdate.bn、en-ner-location.bin、en-ner-organization.bin、en-ner-person.bin、およびen-ner-timeを使用します。置き場。これらのファイルはすべて事前定義されたモデルであり、特定の生テキスト内のそれぞれのエンティティを検出するようにトレーニングされています。
ザ・ opennlp.tools.namefindパッケージには、NERタスクの実行に使用されるクラスとインターフェイスが含まれています。OpenNLPライブラリを使用してNERタスクを実行するには、次のことを行う必要があります。
を使用してそれぞれのモデルをロードします TokenNameFinderModel クラス。
インスタンス化する NameFinder クラス。
名前を見つけて印刷します。
以下は、指定された生のテキストから名前エンティティを検出するプログラムを作成するために従うべき手順です。
ステップ1:モデルをロードする
文検出のモデルは、という名前のクラスで表されます。 TokenNameFinderModel、パッケージに属します opennlp.tools.namefind。
NERモデルをロードするには-
作成する InputStream モデルのオブジェクト(FileInputStreamをインスタンス化し、適切なNERモデルのパスを文字列形式でコンストラクターに渡します)。
インスタンス化する TokenNameFinderModel クラスと合格 InputStream 次のコードブロックに示すように、コンストラクターへのパラメーターとしてのモデルの(オブジェクト)。
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
ステップ2:NameFinderMEクラスをインスタンス化する
ザ・ NameFinderME パッケージのクラス opennlp.tools.namefindNERタスクを実行するためのメソッドが含まれています。このクラスは、最大エントロピーモデルを使用して、指定された生のテキスト内の名前付きエンティティを検索します。
このクラスをインスタンス化し、以下に示すように、前の手順で作成したモデルオブジェクトを渡します-
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
ステップ3:文の中の名前を見つける
ザ・ find() の方法 NameFinderMEクラスは、渡された生のテキスト内の名前を検出するために使用されます。このメソッドは、String変数をパラメーターとして受け入れます。
文の文字列形式をこのメソッドに渡して、このメソッドを呼び出します。
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
ステップ4:文中の名前のスパンを印刷する
ザ・ find() の方法 NameFinderMEclassは、Span型のオブジェクトの配列を返します。Span oftheという名前のクラスopennlp.tools.util パッケージは、 start そして end セットの整数。
によって返されたスパンを保存できます find() 次のコードブロックに示すように、Span配列のメソッドを取得して出力します。
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
以下は、与えられた文を読み、その中の人の名前のスパンを認識するプログラムです。このプログラムを名前のファイルに保存しますNameFinderME_Example.java。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.util.Span;
public class NameFinderME_Example {
public static void main(String args[]) throws Exception{
/Loading the NER - Person model InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-ner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStream);
//Instantiating the NameFinder class
NameFinderME nameFinder = new NameFinderME(model);
//Getting the sentence in the form of String array
String [] sentence = new String[]{
"Mike",
"and",
"Smith",
"are",
"good",
"friends"
};
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
//Printing the spans of the names in the sentence
for(Span s: nameSpans)
System.out.println(s.toString());
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します-
javac NameFinderME_Example.java
java NameFinderME_Example
上記のプログラムは、実行時に、指定された文字列(生のテキスト)を読み取り、その中の人物の名前を検出し、以下に示すようにその位置(スパン)を表示します。
[0..1) person
[2..3) person
名前とその位置
ザ・ substring() Stringクラスのメソッドは begin そしてその end offsetsそれぞれの文字列を返します。次のコードブロックに示すように、このメソッドを使用して、名前とそのスパン(位置)を一緒に出力できます。
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
以下は、指定された生のテキストから名前を検出し、それらの位置とともに表示するプログラムです。このプログラムを名前のファイルに保存しますNameFinderSentences.java。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class NameFinderSentences {
public static void main(String args[]) throws Exception{
//Loading the tokenizer model
InputStream inputStreamTokenizer = new
FileInputStream("C:/OpenNLP_models/entoken.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStreamTokenizer);
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
//Tokenizing the sentence in to a string array
String sentence = "Mike is senior programming
manager and Rama is a clerk both are working at
Tutorialspoint";
String tokens[] = tokenizer.tokenize(sentence);
//Loading the NER-person model
InputStream inputStreamNameFinder = new
FileInputStream("C:/OpenNLP_models/enner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(tokens);
//Printing the names and their spans in a sentence
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します-
javac NameFinderSentences.java
java NameFinderSentences
上記のプログラムは、実行時に指定された文字列(生のテキスト)を読み取り、その中の人物の名前を検出し、以下に示すようにその位置(スパン)を表示します。
[0..1) person Mike
場所の名前を見つける
さまざまなモデルをロードすることで、さまざまな名前付きエンティティを検出できます。以下は、をロードするJavaプログラムです。en-ner-location.bin指定された文の場所の名前をモデル化して検出します。このプログラムを名前のファイルに保存しますLocationFinder.java。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class LocationFinder {
public static void main(String args[]) throws Exception{
InputStream inputStreamTokenizer = new
FileInputStream("C:/OpenNLP_models/entoken.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStreamTokenizer);
//String paragraph = "Mike and Smith are classmates";
String paragraph = "Tutorialspoint is located in Hyderabad";
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
String tokens[] = tokenizer.tokenize(paragraph);
//Loading the NER-location moodel
InputStream inputStreamNameFinder = new
FileInputStream("C:/OpenNLP_models/en- ner-location.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
//Finding the names of a location
Span nameSpans[] = nameFinder.find(tokens);
//Printing the spans of the locations in the sentence
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します-
javac LocationFinder.java
java LocationFinder
上記のプログラムは、実行時に、指定された文字列(生のテキスト)を読み取り、その中の人物の名前を検出し、以下に示すようにその位置(スパン)を表示します。
[4..5) location Hyderabad
NameFinderの確率
ザ・ probs()の方法 NameFinderME クラスは、最後にデコードされたシーケンスの確率を取得するために使用されます。
double[] probs = nameFinder.probs();
以下は、確率を出力するプログラムです。このプログラムを名前のファイルに保存しますTokenizerMEProbs.java。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class TokenizerMEProbs {
public static void main(String args[]) throws Exception{
String sent = "Hello John how are you welcome to Tutorialspoint";
//Loading the Tokenizer model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-token.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStream);
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
//Retrieving the positions of the tokens
Span tokens[] = tokenizer.tokenizePos(sent);
//Getting the probabilities of the recent calls to tokenizePos() method
double[] probs = tokenizer.getTokenProbabilities();
//Printing the spans of tokens
for( Span token : tokens)
System.out.println(token +"
"+sent.substring(token.getStart(), token.getEnd()));
System.out.println(" ");
for(int i = 0; i<probs.length; i++)
System.out.println(probs[i]);
}
}
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します-
javac TokenizerMEProbs.java
java TokenizerMEProbs
実行時に、上記のプログラムは指定された文字列を読み取り、文をトークン化し、それらを出力します。さらに、以下に示すように、最後にデコードされたシーケンスの確率も返します。
[0..5) Hello
[6..10) John
[11..14) how
[15..18) are
[19..22) you
[23..30) welcome
[31..33) to
[34..48) Tutorialspoint
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0