ओपनएनएलपी - नामांकित मान्यता

किसी दिए गए पाठ से नाम, लोगों, स्थानों और अन्य संस्थाओं को खोजने की प्रक्रिया के रूप में जाना जाता है Nपरिवेश क्षेत्र amed Entity Rपारिस्थितिकी (एनईआर)। इस अध्याय में, हम चर्चा करेंगे कि ओपनएनएलपी लाइब्रेरी का उपयोग करके जावा प्रोग्राम के माध्यम से एनईआर को कैसे आगे बढ़ाया जाए।

नामित एनएलपी का उपयोग कर एंटिटी मान्यता

विभिन्न एनईआर कार्यों को करने के लिए, ओपनएनएलपी अलग-अलग पूर्वनिर्धारित मॉडल का उपयोग करता है, जैसे- en-nerdate.bn, en-ner-location.bin, en-ner-Organization.bin, en-ner-person.bin और en-ner-time। बिन। ये सभी फाइलें पूर्वनिर्धारित मॉडल हैं जिन्हें किसी दिए गए कच्चे पाठ में संबंधित संस्थाओं का पता लगाने के लिए प्रशिक्षित किया जाता है।

opennlp.tools.namefindपैकेज में वे वर्ग और इंटरफ़ेस होते हैं जिनका उपयोग NER कार्य करने के लिए किया जाता है। ओपनएनआरपी लाइब्रेरी का उपयोग करके एनईआर कार्य करने के लिए, आपको निम्न की आवश्यकता है -

  • संबंधित मॉडल का उपयोग करके लोड करें TokenNameFinderModel कक्षा।

  • झटपट NameFinder कक्षा।

  • नाम खोजें और उन्हें प्रिंट करें।

एक प्रोग्राम लिखने के लिए निम्नलिखित चरणों का पालन करना चाहिए जो किसी दिए गए कच्चे पाठ से नाम संस्थाओं का पता लगाता है।

चरण 1: मॉडल लोड हो रहा है

वाक्य का पता लगाने के लिए मॉडल को नामित वर्ग द्वारा दर्शाया गया है TokenNameFinderModel, जो पैकेज के अंतर्गत आता है opennlp.tools.namefind

एक एनईआर मॉडल लोड करने के लिए -

  • बनाओ InputStream मॉडल का उद्देश्य (FileInputStream झटपट करें और इसके निर्माण में स्ट्रिंग प्रारूप में उपयुक्त एनईआर मॉडल का मार्ग पास करें)।

  • झटपट 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एनईआर कार्यों को करने के लिए तरीके हैं। यह वर्ग दिए गए कच्चे पाठ में नामित संस्थाओं को खोजने के लिए अधिकतम एंट्रोपी मॉडल का उपयोग करता है।

इस वर्ग को तुरंत लिखें और पिछले चरण में बनाए गए मॉडल ऑब्जेक्ट को नीचे दिखाए गए अनुसार दर्ज करें -

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

चरण 3: वाक्य में नाम ढूँढना

find() की विधि NameFinderMEकक्षा का उपयोग इसके लिए पारित कच्चे पाठ में नामों का पता लगाने के लिए किया जाता है। यह विधि एक स्ट्रिंग चर को एक पैरामीटर के रूप में स्वीकार करती है।

इस विधि में वाक्य के स्ट्रिंग प्रारूप को पास करके इस विधि को लागू करें।

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

चरण 4: वाक्य में नामों के स्पैन को प्रिंट करना

find() की विधि NameFinderMEवर्ग प्रकार की वस्तुओं की एक सरणी देता है। स्पान नाम की कक्षाopennlp.tools.util पैकेज का उपयोग स्टोर करने के लिए किया जाता है start तथा end सेट का पूर्णांक।

आप द्वारा दिए गए स्पैन को स्टोर कर सकते हैं find() स्पैन ऐरे में विधि और उन्हें प्रिंट करें, जैसा कि निम्नलिखित कोड ब्लॉक में दिखाया गया है।

//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());    
   }    
}

निम्न आदेशों का उपयोग करके कमांड प्रॉम्प्ट से सहेजी गई जावा फ़ाइल को संकलित करें और निष्पादित करें -

javac NameFinderME_Example.java 
java NameFinderME_Example

निष्पादित करने पर, उपरोक्त कार्यक्रम दिए गए स्ट्रिंग (कच्चे पाठ) को पढ़ता है, इसमें व्यक्तियों के नाम का पता लगाता है, और उनके पदों (स्पैन) को प्रदर्शित करता है, जैसा कि नीचे दिखाया गया है।

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

उनके पदों के साथ नाम

substring() स्ट्रिंग कक्षा की विधि स्वीकार करती है 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()]);      
   }    
}

निम्न आदेशों का उपयोग करके कमांड प्रॉम्प्ट से सहेजी गई जावा फ़ाइल को संकलित करें और निष्पादित करें -

javac NameFinderSentences.java 
java NameFinderSentences

निष्पादित करने पर, उपरोक्त कार्यक्रम दिए गए स्ट्रिंग (कच्चे पाठ) को पढ़ता है, इसमें व्यक्तियों के नाम का पता लगाता है, और नीचे दिखाए गए अनुसार उनके पदों (स्पैन) को प्रदर्शित करता है।

[0..1) person  Mike

स्थान के नाम का पता लगाना

विभिन्न मॉडलों को लोड करके, आप विभिन्न नामित संस्थाओं का पता लगा सकते हैं। निम्नलिखित एक जावा प्रोग्राम है जो लोड करता है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()]); 
   }    
}

निम्न आदेशों का उपयोग करके कमांड प्रॉम्प्ट से सहेजी गई जावा फ़ाइल को संकलित करें और निष्पादित करें -

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]);          
   } 
}

निम्न आदेशों का उपयोग करके कमांड प्रॉम्प्ट से सहेजी गई जावा फ़ाइल को संकलित करें और निष्पादित करें -

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