OpenNLP - Nhận dạng đối tượng được đặt tên

Quá trình tìm kiếm tên, người, địa điểm và các thực thể khác từ một văn bản nhất định được gọi là Named Entity Rđánh giá sinh thái (NER). Trong chương này, chúng ta sẽ thảo luận về cách thực hiện NER thông qua chương trình Java sử dụng thư viện OpenNLP.

Nhận dạng đối tượng được đặt tên bằng NLP mở

Để thực hiện các tác vụ NER khác nhau, OpenNLP sử dụng các mô hình được xác định trước khác nhau như en-nerdate.bn, en-ner-location.bin, en-ner-Organization.bin, en-ner-person.bin và en-ner-time. thùng rác. Tất cả các tệp này là các mô hình được xác định trước được đào tạo để phát hiện các thực thể tương ứng trong một văn bản thô nhất định.

Các opennlp.tools.namefindgói chứa các lớp và giao diện được sử dụng để thực hiện tác vụ NER. Để thực hiện tác vụ NER bằng thư viện OpenNLP, bạn cần -

  • Tải mô hình tương ứng bằng cách sử dụng TokenNameFinderModel lớp học.

  • Khởi tạo NameFinder lớp học.

  • Tìm tên và in chúng.

Sau đây là các bước cần làm để viết một chương trình phát hiện các thực thể tên từ một văn bản thô nhất định.

Bước 1: Tải mô hình

Mô hình phát hiện câu được đại diện bởi lớp có tên TokenNameFinderModel, thuộc về gói opennlp.tools.namefind.

Để tải một mô hình NER -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình NER thích hợp ở định dạng Chuỗi tới phương thức khởi tạo của nó).

  • Khởi tạo TokenNameFinderModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau.

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

Bước 2: Khởi tạo lớp NameFinderME

Các NameFinderME lớp của gói opennlp.tools.namefindchứa các phương thức để thực hiện các tác vụ NER. Lớp này sử dụng mô hình Maximum Entropy để tìm các thực thể được đặt tên trong văn bản thô đã cho.

Khởi tạo lớp này và chuyển đối tượng mô hình được tạo ở bước trước như hình dưới đây:

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

Bước 3: Tìm tên trong câu

Các find() phương pháp của NameFinderMElớp được sử dụng để phát hiện tên trong văn bản thô được chuyển cho nó. Phương thức này chấp nhận một biến Chuỗi làm tham số.

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu cho phương thức này.

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

Bước 4: In các nhịp của tên trong câu

Các find() phương pháp của NameFinderMElớp trả về một mảng các đối tượng kiểu Span. Lớp có tên Span of theopennlp.tools.util gói được sử dụng để lưu trữ startend số nguyên của các bộ.

Bạn có thể lưu trữ các nhịp được trả về bởi find() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

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

NER Example

Sau đây là chương trình đọc câu đã cho và nhận ra các khoảng tên của những người trong đó. Lưu chương trình này trong một tệp có tênNameFinderME_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());    
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac NameFinderME_Example.java 
java NameFinderME_Example

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), phát hiện tên của những người trong đó và hiển thị vị trí của họ (các khoảng), như được hiển thị bên dưới.

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

Tên cùng với vị trí của họ

Các substring() phương thức của lớp String chấp nhận beginend offsetsvà trả về chuỗi tương ứng. Chúng ta có thể sử dụng phương pháp này để in tên và khoảng cách (vị trí) của chúng với nhau, như được hiển thị trong khối mã sau.

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

Sau đây là chương trình để phát hiện các tên từ văn bản thô đã cho và hiển thị chúng cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênNameFinderSentences.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()]);      
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac NameFinderSentences.java 
java NameFinderSentences

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), phát hiện tên của những người trong đó và hiển thị vị trí của họ (các nhịp) như hình dưới đây.

[0..1) person  Mike

Tìm tên của vị trí

Bằng cách tải các mô hình khác nhau, bạn có thể phát hiện các thực thể được đặt tên khác nhau. Sau đây là một chương trình Java tảien-ner-location.binmô hình và phát hiện tên vị trí trong câu đã cho. Lưu chương trình này trong một tệp có tênLocationFinder.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()]); 
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac LocationFinder.java 
java LocationFinder

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), phát hiện tên của những người trong đó và hiển thị vị trí của họ (các khoảng), như được hiển thị bên dưới.

[4..5) location  Hyderabad

Xác suất công cụ tìm tên

Các probs()phương pháp của NameFinderME lớp được sử dụng để lấy xác suất của chuỗi được giải mã cuối cùng.

double[] probs = nameFinder.probs();

Sau đây là chương trình để in các xác suất. Lưu chương trình này trong một tệp có tênTokenizerMEProbs.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]);          
   } 
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Khi thực thi, chương trình trên đọc Chuỗi đã cho, mã hóa các câu và in ra. Ngoài ra, nó cũng trả về xác suất của chuỗi được giải mã cuối cùng, như được hiển thị bên dưới.

[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