OpenNLP - Adlandırılmış Varlık Tanıma

Belirli bir metinden isimleri, kişileri, yerleri ve diğer varlıkları bulma süreci, Named Entity Rtanıma (NER). Bu bölümde, OpenNLP kitaplığını kullanarak Java programı aracılığıyla NER'in nasıl gerçekleştirileceğini tartışacağız.

Açık NLP kullanarak Adlandırılmış Varlık Tanıma

OpenNLP, çeşitli NER görevlerini gerçekleştirmek için önceden tanımlanmış farklı modeller kullanır: en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin ve en-ner-time. çöp Kutusu. Tüm bu dosyalar, belirli bir ham metindeki ilgili varlıkları tespit etmek için eğitilmiş önceden tanımlanmış modellerdir.

opennlp.tools.namefindpaketi, NER görevini gerçekleştirmek için kullanılan sınıfları ve arabirimleri içerir. OpenNLP kitaplığını kullanarak NER görevini gerçekleştirmek için yapmanız gerekenler -

  • Kullanarak ilgili modeli yükleyin TokenNameFinderModel sınıf.

  • Örnekleyin NameFinder sınıf.

  • İsimleri bulun ve yazdırın.

Belirli bir ham metinden isim varlıklarını algılayan bir program yazmak için izlenecek adımlar aşağıdadır.

Adım 1: Modeli yükleme

Cümle algılama modeli, adlı sınıf tarafından temsil edilir. TokenNameFinderModelpakete ait olan opennlp.tools.namefind.

Bir NER modeli yüklemek için -

  • Oluşturduğunuz bir InputStream modelin nesnesi (FileInputStream'i somutlaştırın ve uygun NER modelinin yolunu String biçiminde yapıcısına iletin).

  • Örnekleyin TokenNameFinderModel sınıf ve geç InputStream (nesne) modelinin yapıcısına bir parametre olarak aşağıdaki kod bloğunda gösterildiği gibi.

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

2. Adım: NameFinderME sınıfının örneğini oluşturma

NameFinderME paketin sınıfı opennlp.tools.namefindNER görevlerini gerçekleştirmek için yöntemler içerir. Bu sınıf, verilen ham metinde adlandırılmış varlıkları bulmak için Maksimum Entropy modelini kullanır.

Bu sınıfı örnekleyin ve önceki adımda oluşturulan model nesnesini aşağıda gösterildiği gibi iletin -

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

3. Adım: Cümledeki isimleri bulmak

find() yöntemi NameFinderMEsınıfı, kendisine aktarılan ham metindeki isimleri tespit etmek için kullanılır. Bu yöntem, bir String değişkenini parametre olarak kabul eder.

Cümlenin String biçimini bu yönteme ileterek bu yöntemi çağırın.

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

Adım 4: Cümledeki adların aralıklarını yazdırma

find() yöntemi NameFinderMEclass, Span türünde bir dizi nesne döndürür. Span adlı sınıfopennlp.tools.util paketi saklamak için kullanılır start ve end kümelerin tamsayısı.

Tarafından döndürülen aralıkları saklayabilirsiniz. find() yöntemini Span dizisine ekleyin ve aşağıdaki kod bloğunda gösterildiği gibi yazdırın.

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

NER Example

Aşağıda verilen cümleyi okuyan ve içindeki kişilerin isimlerinin açıklıklarını tanıyan programdır. Bu programı adıyla bir dosyaya kaydedinNameFinderME_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());    
   }    
}

Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -

javac NameFinderME_Example.java 
java NameFinderME_Example

Yürütüldüğünde, yukarıdaki program verilen Dizgeyi (ham metin) okur, içindeki kişilerin adlarını algılar ve aşağıda gösterildiği gibi konumlarını (aralıkları) görüntüler.

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

İsimler ve Pozisyonları

substring() String sınıfının yöntemi, begin ve end offsetsve ilgili dizeyi döndürür. Bu yöntemi, aşağıdaki kod bloğunda gösterildiği gibi adları ve açıklıklarını (konumlarını) birlikte yazdırmak için kullanabiliriz.

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

Aşağıda verilen ham metinden isimleri tespit etmek ve konumlarıyla birlikte görüntülemek için program yer almaktadır. Bu programı adıyla bir dosyaya kaydedinNameFinderSentences.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()]);      
   }    
}

Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -

javac NameFinderSentences.java 
java NameFinderSentences

Yürütüldüğünde, yukarıdaki program verilen Dizgeyi (ham metin) okur, içindeki kişilerin adlarını algılar ve aşağıda gösterildiği gibi konumlarını (aralıklarını) görüntüler.

[0..1) person  Mike

Konumun Adlarını Bulmak

Çeşitli modeller yükleyerek, çeşitli adlandırılmış varlıkları tespit edebilirsiniz. Aşağıdakileri yükleyen bir Java programıen-ner-location.binverilen cümlede yer adlarını modelleyip algılar. Bu programı adıyla bir dosyaya kaydedinLocationFinder.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()]); 
   }    
}

Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -

javac LocationFinder.java 
java LocationFinder

Yürütüldüğünde, yukarıdaki program verilen Dizgeyi (ham metin) okur, içindeki kişilerin adlarını algılar ve aşağıda gösterildiği gibi konumlarını (aralıkları) görüntüler.

[4..5) location  Hyderabad

Ad Bulucu Olasılığı

probs()yöntemi NameFinderME sınıfı, son kodu çözülen dizinin olasılıklarını elde etmek için kullanılır.

double[] probs = nameFinder.probs();

Olasılıkları yazdırmak için program aşağıdadır. Bu programı adıyla bir dosyaya kaydedinTokenizerMEProbs.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]);          
   } 
}

Kaydedilen Java dosyasını aşağıdaki komutları kullanarak Komut isteminden derleyin ve yürütün -

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Yürütüldüğünde, yukarıdaki program verilen String'i okur, cümleleri belirteçler ve yazdırır. Ek olarak, aşağıda gösterildiği gibi, son kodu çözülen dizinin olasılıklarını da döndürür.

[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