OpenNLP - Détection de phrases

Lors du traitement d'un langage naturel, décider du début et de la fin des phrases est l'un des problèmes à résoudre. Ce processus est connu sous le nom deSentence Bbord Disambiguation (SBD) ou simplement rupture de phrase.

Les techniques que nous utilisons pour détecter les phrases dans le texte donné dépendent de la langue du texte.

Détection de phrases à l'aide de Java

Nous pouvons détecter les phrases dans le texte donné en Java en utilisant des expressions régulières et un ensemble de règles simples.

Par exemple, supposons qu'un point, un point d'interrogation ou un point d'exclamation termine une phrase dans le texte donné, puis nous pouvons diviser la phrase en utilisant le split() méthode de la Stringclasse. Ici, nous devons passer une expression régulière au format String.

Voici le programme qui détermine les phrases dans un texte donné à l'aide d'expressions régulières Java (split method). Enregistrez ce programme dans un fichier avec le nomSentenceDetection_RE.java.

public class SentenceDetection_RE {  
   public static void main(String args[]){ 
     
      String sentence = " Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
     
      String simple = "[.?!]";      
      String[] splitString = (sentence.split(simple));     
      for (String string : splitString)   
         System.out.println(string);      
   } 
}

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

javac SentenceDetection_RE.java 
java SentenceDetection_RE

Lors de l'exécution, le programme ci-dessus crée un document PDF affichant le message suivant.

Hi 
How are you 
Welcome to Tutorialspoint 
We provide free tutorials on various technologies

Détection de phrases à l'aide d'OpenNLP

Pour détecter les phrases, OpenNLP utilise un modèle prédéfini, un fichier nommé en-sent.bin. Ce modèle prédéfini est formé pour détecter des phrases dans un texte brut donné.

le opennlp.tools.sentdetect package contient les classes et interfaces utilisées pour effectuer la tâche de détection de phrase.

Pour détecter une phrase à l'aide de la bibliothèque OpenNLP, vous devez -

  • Chargez le en-sent.bin modèle utilisant le SentenceModel classe

  • Instancier le SentenceDetectorME classe.

  • Détectez les phrases à l'aide du sentDetect() méthode de cette classe.

Voici les étapes à suivre pour écrire un programme qui détecte les phrases du 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 SentenceModel, qui appartient au package opennlp.tools.sentdetect.

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 SentenceModel 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 sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Étape 2: instanciation de la classe SentenceDetectorME

le SentenceDetectorME classe du package opennlp.tools.sentdetectcontient des méthodes pour diviser le texte brut en phrases. Cette classe utilise le modèle d'entropie maximale pour évaluer les caractères de fin de phrase dans une chaîne afin de déterminer s'ils signifient la fin d'une phrase.

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

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Étape 3: Détecter la phrase

le sentDetect() méthode de la SentenceDetectorMEclass est utilisé pour détecter les phrases 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.

//Detecting the sentence 
String sentences[] = detector.sentDetect(sentence);

Example

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

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionME { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
    
      //Detecting the sentence
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);  
   } 
}

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

javac SentenceDetectorME.java 
java SentenceDetectorME

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée et détecte les phrases qu'elle contient et affiche la sortie suivante.

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies

Détecter les positions des phrases

On peut également détecter les positions des phrases en utilisant la méthode sentPosDetect () du SentenceDetectorME class.

Voici les étapes à suivre pour écrire un programme qui détecte les positions des phrases à partir du 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 SentenceModel, qui appartient au package opennlp.tools.sentdetect.

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 SentenceModel 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 sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Étape 2: instanciation de la classe SentenceDetectorME

le SentenceDetectorME classe du package opennlp.tools.sentdetectcontient des méthodes pour diviser le texte brut en phrases. Cette classe utilise le modèle d'entropie maximale pour évaluer les caractères de fin de phrase dans une chaîne afin de déterminer s'ils signifient la fin d'une phrase.

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

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Étape 3: Détecter la position de la phrase

le sentPosDetect() méthode de la SentenceDetectorMEclass est utilisé pour détecter les positions des phrases 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 en tant que paramètre à cette méthode.

//Detecting the position of the sentences in the paragraph  
Span[] spans = detector.sentPosDetect(sentence);

Étape 4: Impression des travées des phrases

le sentPosDetect() méthode de la SentenceDetectorME class renvoie un tableau d'objets du type Span. La classe nommée Span of theopennlp.tools.util package est utilisé pour stocker les entiers de début et de fin des ensembles.

Vous pouvez stocker les portées renvoyées par le sentPosDetect() 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);

Example

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

import java.io.FileInputStream; 
import java.io.InputStream; 
  
import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span;

public class SentencePosDetection { 
  
   public static void main(String args[]) throws Exception { 
   
      String paragraph = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the raw text 
      Span spans[] = detector.sentPosDetect(paragraph); 
       
      //Printing the spans of the sentences in the paragraph 
      for (Span span : spans)         
         System.out.println(span);  
   } 
}

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

javac SentencePosDetection.java 
java SentencePosDetection

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée et détecte les phrases qu'elle contient et affiche la sortie suivante.

[0..16) 
[17..43) 
[44..93)

Phrases 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 phrases et leurs étendues (positions) ensemble, comme indiqué dans le bloc de code suivant.

for (Span span : spans)         
   System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);

Voici le programme pour détecter les phrases à partir du texte brut donné et les afficher avec leurs positions. Enregistrez ce programme dans un fichier avec un nomSentencesAndPosDetection.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span; 
   
public class SentencesAndPosDetection { 
  
   public static void main(String args[]) throws Exception { 
     
      String sen = "Hi. How are you? Welcome to Tutorialspoint." 
         + " We provide free tutorials on various technologies"; 
      //Loading a sentence model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the paragraph  
      Span[] spans = detector.sentPosDetect(sen);  
      
      //Printing the sentences and their spans of a paragraph 
      for (Span span : spans)         
         System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);  
   } 
}

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

javac SentencesAndPosDetection.java 
java SentencesAndPosDetection

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée et détecte les phrases avec leurs positions et affiche la sortie suivante.

Hi. How are you? [0..16) 
Welcome to Tutorialspoint. [17..43)  
We provide free tutorials on various technologies [44..93)

Détection de probabilité de phrase

le getSentenceProbabilities() méthode de la SentenceDetectorME class renvoie les probabilités associées aux appels les plus récents à la méthode sentDetect ().

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

Voici le programme pour imprimer les probabilités associées aux appels à la méthode sentDetect (). Enregistrez ce programme dans un fichier avec le nomSentenceDetectionMEProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionMEProbs { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class
      SentenceDetectorME detector = new SentenceDetectorME(model);  
      
      //Detecting the sentence 
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);   
         
      //Getting the probabilities of the last decoded sequence       
      double[] probs = detector.getSentenceProbabilities(); 
       
      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 SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

Lors de l'exécution, le programme ci-dessus lit la chaîne donnée, détecte les phrases et les imprime. En outre, il renvoie également les probabilités associées aux appels les plus récents à la méthode sentDetect (), comme indiqué ci-dessous.

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies 
   
0.9240246995179983 
0.9957680129995953 
1.0