OpenNLP - Reconnaissance d'entités nommées

Le processus de recherche de noms, de personnes, de lieux et d'autres entités à partir d'un texte donné est appelé Named Entité Rreconnaissance (NER). Dans ce chapitre, nous allons discuter de la manière d'exécuter NER via le programme Java en utilisant la bibliothèque OpenNLP.

Reconnaissance d'entités nommées à l'aide de NLP ouvert

Pour effectuer diverses tâches NER, OpenNLP utilise différents modèles prédéfinis, à savoir en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin et en-ner-time. poubelle. Tous ces fichiers sont des modèles prédéfinis qui sont formés pour détecter les entités respectives dans un texte brut donné.

le opennlp.tools.namefindpackage contient les classes et les interfaces utilisées pour exécuter la tâche NER. Pour effectuer une tâche NER à l'aide de la bibliothèque OpenNLP, vous devez -

  • Chargez le modèle respectif à l'aide du TokenNameFinderModel classe.

  • Instancier le NameFinder classe.

  • Trouvez les noms et imprimez-les.

Voici les étapes à suivre pour écrire un programme qui détecte les entités de nom à partir d'un texte brut donné.

Étape 1: chargement du modèle

Le modèle de détection de phrase est représenté par la classe nommée TokenNameFinderModel, qui appartient au package opennlp.tools.namefind.

Pour charger un modèle NER -

  • Créé un InputStream objet du modèle (instanciez le FileInputStream et passez le chemin du modèle NER approprié au format String à son constructeur).

  • Instancier le TokenNameFinderModel classe et passer le InputStream (objet) du modèle en tant que paramètre de son constructeur, comme illustré dans le bloc de code suivant.

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

Étape 2: instanciation de la classe NameFinderME

le NameFinderME classe du package opennlp.tools.namefindcontient des méthodes pour effectuer les tâches NER. Cette classe utilise le modèle d'entropie maximale pour rechercher les entités nommées dans le texte brut donné.

Instanciez cette classe et transmettez l'objet modèle créé à l'étape précédente comme indiqué ci-dessous -

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

Étape 3: Trouver les noms dans la phrase

le find() méthode de la NameFinderMEclass est utilisée pour détecter les noms dans le texte brut qui lui est passé. Cette méthode accepte une variable String comme paramètre.

Appelez cette méthode en transmettant le format String de la phrase à cette méthode.

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

Étape 4: Impression de l'étendue des noms dans la phrase

le find() méthode de la NameFinderMEclass renvoie un tableau d'objets du type Span. La classe nommée Span of theopennlp.tools.util package est utilisé pour stocker le start et end entier d'ensembles.

Vous pouvez stocker les portées renvoyées par le find() dans le tableau Span et imprimez-les, comme indiqué dans le bloc de code suivant.

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

NER Example

Voici le programme qui lit la phrase donnée et reconnaît les portées des noms des personnes qu'elle contient. Enregistrez ce programme dans un fichier avec le nomNameFinderME_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());    
   }    
}

Compilez et exécutez le fichier Java enregistré à partir de l'invite de commande à l'aide des commandes suivantes -

javac NameFinderME_Example.java 
java NameFinderME_Example

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée (texte brut), détecte les noms des personnes qu'elle contient et affiche leurs positions (étendues), comme indiqué ci-dessous.

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

Noms avec leurs positions

le substring() méthode de la classe String accepte le begin et le end offsetset renvoie la chaîne respective. Nous pouvons utiliser cette méthode pour imprimer les noms et leurs étendues (positions) ensemble, comme indiqué dans le bloc de code suivant.

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

Voici le programme pour détecter les noms à partir du texte brut donné et les afficher avec leurs positions. Enregistrez ce programme dans un fichier avec le nomNameFinderSentences.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()]);      
   }    
}

Compilez et exécutez le fichier Java enregistré à partir de l'invite de commande à l'aide des commandes suivantes -

javac NameFinderSentences.java 
java NameFinderSentences

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée (texte brut), détecte les noms des personnes qu'elle contient et affiche leurs positions (étendues) comme indiqué ci-dessous.

[0..1) person  Mike

Recherche des noms de l'emplacement

En chargeant divers modèles, vous pouvez détecter diverses entités nommées. Voici un programme Java qui charge leen-ner-location.binmodel et détecte les noms d'emplacement dans la phrase donnée. Enregistrez ce programme dans un fichier avec le nomLocationFinder.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()]); 
   }    
}

Compilez et exécutez le fichier Java enregistré à partir de l'invite de commande à l'aide des commandes suivantes -

javac LocationFinder.java 
java LocationFinder

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée (texte brut), détecte les noms des personnes qu'elle contient et affiche leurs positions (étendues), comme indiqué ci-dessous.

[4..5) location  Hyderabad

Probabilité de NameFinder

le probs()méthode de la NameFinderME class est utilisé pour obtenir les probabilités de la dernière séquence décodée.

double[] probs = nameFinder.probs();

Voici le programme pour imprimer les probabilités. Enregistrez ce programme dans un fichier avec le nomTokenizerMEProbs.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]);          
   } 
}

Compilez et exécutez le fichier Java enregistré à partir de l'invite de commande à l'aide des commandes suivantes -

javac TokenizerMEProbs.java 
java TokenizerMEProbs

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée, tokenise les phrases et les imprime. De plus, il renvoie également les probabilités de la dernière séquence décodée, comme indiqué ci-dessous.

[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