OpenNLP - Pengakuan Entitas Bernama

Proses menemukan nama, orang, tempat, dan entitas lain, dari teks tertentu disebut Named Entity Recognition (NER). Pada bab ini, kita akan membahas bagaimana menjalankan NER melalui program Java dengan menggunakan library OpenNLP.

Pengakuan Entitas Bernama menggunakan NLP terbuka

Untuk melakukan berbagai tugas NER, OpenNLP menggunakan model standar yang berbeda yaitu, en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin, dan en-ner-time. tempat sampah. Semua file ini adalah model yang telah ditentukan sebelumnya yang dilatih untuk mendeteksi entitas masing-masing dalam teks mentah tertentu.

Itu opennlp.tools.namefindpaket berisi kelas dan antarmuka yang digunakan untuk melakukan tugas NER. Untuk melakukan tugas NER menggunakan pustaka OpenNLP, Anda perlu -

  • Muat model masing-masing menggunakan TokenNameFinderModel kelas.

  • Instantiate NameFinder kelas.

  • Temukan nama dan cetaklah.

Berikut adalah langkah-langkah yang harus diikuti untuk menulis program yang mendeteksi entitas nama dari teks mentah yang diberikan.

Langkah 1: Memuat model

Model untuk pendeteksian kalimat diwakili oleh kelas bernama TokenNameFinderModel, yang termasuk dalam paket opennlp.tools.namefind.

Untuk memuat model NER -

  • Buat InputStream objek model (Membuat instance FileInputStream dan meneruskan jalur model NER yang sesuai dalam format String ke konstruktornya).

  • Instantiate TokenNameFinderModel kelas dan lulus InputStream (objek) model sebagai parameter untuk konstruktornya, seperti yang ditunjukkan pada blok kode berikut.

//Loading the NER-person model 
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");       
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);

Langkah 2: Membuat instance kelas NameFinderME

Itu NameFinderME kelas paket opennlp.tools.namefindberisi metode untuk melakukan tugas NER. Kelas ini menggunakan model Entropi Maksimum untuk menemukan entitas bernama dalam teks mentah yang diberikan.

Buat instance kelas ini dan teruskan objek model yang dibuat pada langkah sebelumnya seperti yang ditunjukkan di bawah ini -

//Instantiating the NameFinderME class 
NameFinderME nameFinder = new NameFinderME(model);

Langkah 3: Menemukan nama-nama dalam kalimat

Itu find() metode dari NameFinderMEkelas digunakan untuk mendeteksi nama-nama dalam teks mentah yang diteruskan padanya. Metode ini menerima variabel String sebagai parameter.

Panggil metode ini dengan meneruskan format String dari kalimat ke metode ini.

//Finding the names in the sentence 
Span nameSpans[] = nameFinder.find(sentence);

Langkah 4: Mencetak rentang nama dalam kalimat

Itu find() metode dari NameFinderMEclass mengembalikan larik objek dengan tipe Span. Kelas bernama Span of theopennlp.tools.util paket digunakan untuk menyimpan file start dan end bilangan bulat himpunan.

Anda dapat menyimpan durasi yang dikembalikan oleh find() metode dalam array Span dan mencetaknya, seperti yang ditunjukkan pada blok kode berikut.

//Printing the sentences and their spans of a sentence 
for (Span span : spans)         
System.out.println(paragraph.substring(span);

NER Example

Berikut adalah program yang membaca kalimat yang diberikan dan mengenali span dari nama-nama orang di dalamnya. Simpan program ini dalam sebuah file dengan namaNameFinderME_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());    
   }    
}

Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -

javac NameFinderME_Example.java 
java NameFinderME_Example

Saat menjalankan, program di atas membaca String yang diberikan (teks mentah), mendeteksi nama-nama orang di dalamnya, dan menampilkan posisi mereka (span), seperti yang ditunjukkan di bawah ini.

[0..1) person 
[2..3) person

Nama beserta Posisinya

Itu substring() metode kelas String menerima begin dan end offsetsdan mengembalikan string masing-masing. Kita dapat menggunakan metode ini untuk mencetak nama dan bentang (posisi) mereka bersama-sama, seperti yang ditunjukkan pada blok kode berikut.

for(Span s: nameSpans)        
   System.out.println(s.toString()+"  "+tokens[s.getStart()]);

Berikut adalah program untuk mendeteksi nama-nama dari teks mentah yang diberikan dan menampilkannya beserta posisinya. Simpan program ini dalam sebuah file dengan namaNameFinderSentences.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()]);      
   }    
}

Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -

javac NameFinderSentences.java 
java NameFinderSentences

Saat menjalankan, program di atas membaca String yang diberikan (teks mentah), mendeteksi nama-nama orang di dalamnya, dan menampilkan posisi (span) mereka seperti yang ditunjukkan di bawah ini.

[0..1) person  Mike

Menemukan Nama Lokasi

Dengan memuat berbagai model, Anda dapat mendeteksi berbagai entitas bernama. Berikut ini adalah program Java yang memuat fileen-ner-location.binmodel dan mendeteksi nama lokasi dalam kalimat yang diberikan. Simpan program ini dalam sebuah file dengan namaLocationFinder.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()]); 
   }    
}

Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -

javac LocationFinder.java 
java LocationFinder

Saat menjalankan, program di atas membaca String yang diberikan (teks mentah), mendeteksi nama-nama orang di dalamnya, dan menampilkan posisi mereka (span), seperti yang ditunjukkan di bawah ini.

[4..5) location  Hyderabad

Kemungkinan Pencari Nama

Itu probs()metode dari NameFinderME kelas digunakan untuk mendapatkan probabilitas dari urutan yang terakhir didekodekan.

double[] probs = nameFinder.probs();

Berikut adalah program untuk mencetak probabilitas. Simpan program ini dalam sebuah file dengan namaTokenizerMEProbs.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]);          
   } 
}

Kompilasi dan jalankan file Java yang disimpan dari Command prompt menggunakan perintah berikut -

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Saat mengeksekusi, program di atas membaca String yang diberikan, memberi token pada kalimat, dan mencetaknya. Selain itu, ini juga mengembalikan probabilitas urutan yang terakhir didekodekan, seperti yang ditunjukkan di bawah ini.

[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