OpenNLP - Phrases de segmentation

La segmentation d'une phrase fait référence au fractionnement / division d'une phrase en parties de mots telles que des groupes de mots et des groupes de verbes.

Couper une phrase en utilisant OpenNLP

Pour détecter les phrases, OpenNLP utilise un modèle, un fichier nommé en-chunker.bin. Il s'agit d'un modèle prédéfini qui est formé pour fragmenter les phrases dans le texte brut donné.

le opennlp.tools.chunker package contient les classes et les interfaces qui sont utilisées pour rechercher des annotations syntaxiques non récursives telles que des fragments de phrases nominales.

Vous pouvez découper une phrase en utilisant la méthode chunk() du ChunkerMEclasse. Cette méthode accepte les jetons d'une phrase et les balises POS comme paramètres. Par conséquent, avant de commencer le processus de segmentation, vous devez d'abord Tokenize la phrase et générer les parties balises POS de celle-ci.

Pour découper une phrase en utilisant la bibliothèque OpenNLP, vous devez -

  • Tokenize la phrase.

  • Générez des balises POS pour cela.

  • Chargez le en-chunker.bin modèle utilisant le ChunkerModel classe

  • Instancier le ChunkerME classe.

  • Coupez les phrases en utilisant le chunk() méthode de cette classe.

Voici les étapes à suivre pour écrire un programme pour découper des phrases à partir du texte brut donné.

Étape 1: Tokeniser la phrase

Tokenize les phrases en utilisant le tokenize() méthode de la whitespaceTokenizer class, comme indiqué dans le bloc de code suivant.

//Tokenizing the sentence 
String sentence = "Hi welcome to Tutorialspoint";       
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence);

Étape 2: Génération des balises POS

Générez les balises POS de la phrase en utilisant le tag() méthode de la POSTaggerME class, comme indiqué dans le bloc de code suivant.

//Generating the POS tags 
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
POSModel model = new POSModelLoader().load(file);     
//Constructing the tagger 
POSTaggerME tagger = new POSTaggerME(model);        
//Generating tags from the tokens 
String[] tags = tagger.tag(tokens);

Étape 3: chargement du modèle

Le modèle de segmentation d'une phrase est représenté par la classe nommée ChunkerModel, qui appartient au package opennlp.tools.chunker.

Pour charger un modèle de détection de phrase -

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

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

//Loading the chunker model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
ChunkerModel chunkerModel = new ChunkerModel(inputStream);

Étape 4: Instanciation de la classe chunkerME

le chunkerME classe du package opennlp.tools.chunkercontient des méthodes pour découper les phrases. Il s'agit d'un bloc basé sur une entropie maximale.

Instanciez cette classe et transmettez l'objet modèle créé à l'étape précédente.

//Instantiate the ChunkerME class 
ChunkerME chunkerME = new ChunkerME(chunkerModel);

Étape 5: découper la phrase

le chunk() méthode de la ChunkerMEclass est utilisé pour fragmenter les phrases du texte brut qui lui est passé. Cette méthode accepte deux tableaux String représentant des jetons et des balises, en tant que paramètres.

Appelez cette méthode en passant le tableau de jetons et le tableau de balises créés au cours des étapes précédentes en tant que paramètres.

//Generating the chunks 
String result[] = chunkerME.chunk(tokens, tags);

Example

Voici le programme pour découper les phrases dans le texte brut donné. Enregistrez ce programme dans un fichier avec le nomChunkerExample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;  

import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class ChunkerExample{ 
   
   public static void main(String args[]) throws IOException { 
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
     
      //Generating the POS tags 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModelLoader().load(file);     
      
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model);        
      
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);    
    
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel chunkerModel = new ChunkerModel(inputStream);  
      
      //Instantiate the ChunkerME class 
      ChunkerME chunkerME = new ChunkerME(chunkerModel);
       
      //Generating the chunks 
      String result[] = chunkerME.chunk(tokens, tags); 
  
      for (String s : result) 
         System.out.println(s);         
   }    
}

Compilez et exécutez le fichier Java enregistré à partir de l'invite de commande à l'aide de la commande suivante -

javac ChunkerExample.java 
java ChunkerExample

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée, segmente les phrases qu'elle contient et les affiche comme indiqué ci-dessous.

Loading POS Tagger model ... done (1.040s) 
B-NP 
I-NP 
B-VP 
I-VP

Détection des positions des jetons

Nous pouvons également détecter les positions ou les portées des morceaux en utilisant le chunkAsSpans() méthode de la ChunkerMEclasse. Cette méthode 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 chunkAsSpans() dans le tableau Span et imprimez-les, comme indiqué dans le bloc de code suivant.

//Generating the tagged chunk spans 
Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
for (Span s : span) 
   System.out.println(s.toString());

Example

Voici le programme qui détecte les phrases dans le texte brut donné. Enregistrez ce programme dans un fichier avec le nomChunkerSpansEample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;  

import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer; 
import opennlp.tools.util.Span;  

public class ChunkerSpansEample{ 
   
   public static void main(String args[]) throws IOException { 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
      POSModel model = new POSModelLoader().load(file); 
       
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model); 
  
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);       
   
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel chunkerModel = new ChunkerModel(inputStream);
      ChunkerME chunkerME = new ChunkerME(chunkerModel);       
           
      //Generating the tagged chunk spans 
      Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
      for (Span s : span) 
         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 ChunkerSpansEample.java 
java ChunkerSpansEample

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée et s'étend sur les morceaux qu'elle contient, et affiche la sortie suivante -

Loading POS Tagger model ... done (1.059s) 
[0..2) NP 
[2..4) VP

Détection de probabilité de bloc

le probs() méthode de la ChunkerME class renvoie les probabilités de la dernière séquence décodée.

//Getting the probabilities of the last decoded sequence       
double[] probs = chunkerME.probs();

Voici le programme pour imprimer les probabilités de la dernière séquence décodée par le chunker. Enregistrez ce programme dans un fichier avec le nomChunkerProbsExample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class ChunkerProbsExample{ 
   
   public static void main(String args[]) throws IOException { 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
      POSModel model = new POSModelLoader().load(file); 
       
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model); 
  
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);       
   
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel cModel = new ChunkerModel(inputStream); 
      ChunkerME chunkerME = new ChunkerME(cModel); 
       
      //Generating the chunk tags 
      chunkerME.chunk(tokens, tags); 
       
      //Getting the probabilities of the last decoded sequence       
      double[] probs = chunkerME.probs(); 
      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 ChunkerProbsExample.java 
java ChunkerProbsExample

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée, la segmente et imprime les probabilités de la dernière séquence décodée.

0.9592746040797778 
0.6883933131241501 
0.8830563473996004 
0.8951150529746051