OpenNLP - Rozpoznawanie nazwanych jednostek

Proces znajdowania nazwisk, osób, miejsc i innych bytów z danego tekstu jest znany jako Named Entity Rpoznanie (NER). W tym rozdziale omówimy, jak przeprowadzić NER przez program Java z wykorzystaniem biblioteki OpenNLP.

Rozpoznawanie nazwanych jednostek przy użyciu otwartego NLP

Aby wykonać różne zadania NER, OpenNLP używa różnych predefiniowanych modeli, a mianowicie en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin i en-ner-time. kosz. Wszystkie te pliki są predefiniowanymi modelami, które są uczone do wykrywania odpowiednich jednostek w danym surowym tekście.

Plik opennlp.tools.namefindpakiet zawiera klasy i interfejsy, które są używane do wykonywania zadania NER. Aby wykonać zadanie NER przy użyciu biblioteki OpenNLP, musisz -

  • Załaduj odpowiedni model za pomocą pliku TokenNameFinderModel klasa.

  • Utwórz wystąpienie NameFinder klasa.

  • Znajdź nazwiska i wydrukuj je.

Poniżej przedstawiono kroki, które należy wykonać, aby napisać program, który wykrywa encje nazwy z danego surowego tekstu.

Krok 1: Ładowanie modelu

Model wykrywania zdań jest reprezentowany przez nazwaną klasę TokenNameFinderModel, który należy do pakietu opennlp.tools.namefind.

Aby załadować model NER -

  • Stworzyć InputStream obiekt modelu (Utwórz wystąpienie FileInputStream i przekaż ścieżkę odpowiedniego modelu NER w formacie String do jego konstruktora).

  • Utwórz wystąpienie TokenNameFinderModel klasę i zdaj InputStream (obiekt) modelu jako parametr jego konstruktora, jak pokazano w poniższym bloku kodu.

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

Krok 2: Utworzenie wystąpienia klasy NameFinderME

Plik NameFinderME klasa pakietu opennlp.tools.namefindzawiera metody wykonywania zadań NER. Ta klasa używa modelu Maximum Entropy, aby znaleźć nazwane jednostki w danym surowym tekście.

Utwórz wystąpienie tej klasy i przekaż obiekt modelu utworzony w poprzednim kroku, jak pokazano poniżej -

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

Krok 3: Znalezienie nazwisk w zdaniu

Plik find() metoda NameFinderMEklasa służy do wykrywania nazw w przekazanym do niej nieprzetworzonym tekście. Ta metoda akceptuje zmienną typu String jako parametr.

Wywołaj tę metodę, przekazując format String zdania do tej metody.

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

Krok 4: Drukowanie rozpiętości nazw w zdaniu

Plik find() metoda NameFinderMEclass zwraca tablicę obiektów typu Span. Klasa o nazwie Span of theopennlp.tools.util pakiet służy do przechowywania pliku start i end liczba całkowita zbiorów.

Możesz przechowywać rozpiętości zwrócone przez find() w tablicy Span i wydrukuj je, jak pokazano w poniższym bloku kodu.

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

NER Example

Poniżej znajduje się program, który odczytuje podane zdanie i rozpoznaje rozpiętości nazwisk znajdujących się w nim osób. Zapisz ten program w pliku o nazwieNameFinderME_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());    
   }    
}

Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -

javac NameFinderME_Example.java 
java NameFinderME_Example

Podczas wykonywania powyższy program odczytuje podany String (surowy tekst), wykrywa nazwiska osób w nim i wyświetla ich pozycje (rozpiętości), jak pokazano poniżej.

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

Nazwy wraz z ich pozycjami

Plik substring() metoda klasy String akceptuje metodę begin i end offsetsi zwraca odpowiedni ciąg. Możemy użyć tej metody do wydrukowania nazw i ich rozpiętości (pozycji) razem, jak pokazano w poniższym bloku kodu.

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

Poniżej znajduje się program do wykrywania nazw z podanego surowego tekstu i wyświetlania ich wraz z ich pozycjami. Zapisz ten program w pliku o nazwieNameFinderSentences.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()]);      
   }    
}

Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -

javac NameFinderSentences.java 
java NameFinderSentences

Podczas wykonywania powyższy program odczytuje podany String (surowy tekst), wykrywa nazwiska osób w nim i wyświetla ich pozycje (przęsła), jak pokazano poniżej.

[0..1) person  Mike

Znajdowanie nazw lokalizacji

Ładując różne modele, możesz wykryć różne nazwane jednostki. Poniżej znajduje się program Java, który ładuje pliken-ner-location.binmodel i wykrywa nazwy lokalizacji w zadanym zdaniu. Zapisz ten program w pliku o nazwieLocationFinder.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()]); 
   }    
}

Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -

javac LocationFinder.java 
java LocationFinder

Podczas wykonywania powyższy program odczytuje podany String (surowy tekst), wykrywa nazwiska osób w nim i wyświetla ich pozycje (rozpiętości), jak pokazano poniżej.

[4..5) location  Hyderabad

Prawdopodobieństwo narzędzia NameFinder

Plik probs()metoda NameFinderME klasa służy do uzyskania prawdopodobieństwa ostatniej zdekodowanej sekwencji.

double[] probs = nameFinder.probs();

Poniżej znajduje się program do drukowania prawdopodobieństw. Zapisz ten program w pliku o nazwieTokenizerMEProbs.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]);          
   } 
}

Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Podczas wykonywania powyższy program odczytuje podany String, tokenizuje zdania i drukuje je. Ponadto zwraca również prawdopodobieństwa ostatniej zdekodowanej sekwencji, jak pokazano poniżej.

[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