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