OpenNLP - การรับรู้เอนทิตีที่มีชื่อ

กระบวนการค้นหาชื่อบุคคลสถานที่และหน่วยงานอื่น ๆ จากข้อความที่กำหนดเรียกว่า Nเอเมด Entity Rการรับรู้ (NER) ในบทนี้เราจะพูดถึงวิธีดำเนินการ NER ผ่านโปรแกรม Java โดยใช้ไลบรารี OpenNLP

ชื่อการรับรู้เอนทิตีโดยใช้ 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 ในการดำเนินงาน NER โดยใช้ไลบรารี OpenNLP คุณต้อง -

  • โหลดโมเดลตามลำดับโดยใช้ไฟล์ TokenNameFinderModel ชั้นเรียน

  • เริ่มต้นไฟล์ NameFinder ชั้นเรียน

  • ค้นหาชื่อและพิมพ์

ต่อไปนี้เป็นขั้นตอนที่ต้องปฏิบัติตามเพื่อเขียนโปรแกรมซึ่งตรวจพบเอนทิตีชื่อจากข้อความดิบที่กำหนด

ขั้นตอนที่ 1: กำลังโหลดโมเดล

โมเดลสำหรับการตรวจจับประโยคแสดงโดยคลาสที่มีชื่อว่า TokenNameFinderModelซึ่งเป็นของแพ็คเกจ opennlp.tools.namefind.

ในการโหลดโมเดล NER -

  • สร้างไฟล์ InputStream อ็อบเจ็กต์ของโมเดล (สร้างอินสแตนซ์ FileInputStream และส่งเส้นทางของโมเดล NER ที่เหมาะสมในรูปแบบ String ไปยังคอนสตรัคเตอร์)

  • เริ่มต้นไฟล์ TokenNameFinderModel ชั้นเรียนและผ่าน InputStream (วัตถุ) ของโมเดลเป็นพารามิเตอร์ของตัวสร้างดังที่แสดงในบล็อกโค้ดต่อไปนี้

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

ขั้นตอนที่ 2: สร้างอินสแตนซ์คลาส NameFinderME

NameFinderME คลาสของแพ็คเกจ opennlp.tools.namefindมีวิธีการในการดำเนินงาน NER คลาสนี้ใช้แบบจำลองเอนโทรปีสูงสุดเพื่อค้นหาเอนทิตีที่มีชื่อในข้อความดิบที่กำหนด

สร้างอินสแตนซ์คลาสนี้และส่งผ่านโมเดลอ็อบเจ็กต์ที่สร้างในขั้นตอนก่อนหน้าดังที่แสดงด้านล่าง -

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

ขั้นตอนที่ 3: ค้นหาชื่อในประโยค

find() วิธีการของ NameFinderMEคลาสถูกใช้เพื่อตรวจหาชื่อในข้อความดิบที่ส่งผ่านไป วิธีนี้ยอมรับตัวแปร String เป็นพารามิเตอร์

เรียกใช้วิธีนี้โดยส่งรูปแบบ String ของประโยคไปยังวิธีนี้

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

ขั้นตอนที่ 4: พิมพ์ช่วงของชื่อในประโยค

find() วิธีการของ NameFinderMEคลาสส่งคืนอาร์เรย์ของอ็อบเจ็กต์ประเภท Span คลาสที่มีชื่อว่า Span of theopennlp.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