OpenNLP - Detección de frases

Al procesar un lenguaje natural, decidir el comienzo y el final de las oraciones es uno de los problemas a abordar. Este proceso se conoce comoSentence Blímite Disambiguación (SBD) o simplemente romper oraciones.

Las técnicas que usamos para detectar las oraciones en un texto dado, dependen del idioma del texto.

Detección de oraciones usando Java

Podemos detectar las oraciones en el texto dado en Java usando Expresiones Regulares y un conjunto de reglas simples.

Por ejemplo, supongamos que un punto, un signo de interrogación o un signo de exclamación finalizan una oración en el texto dado, luego podemos dividir la oración usando el split() método del Stringclase. Aquí, tenemos que pasar una expresión regular en formato String.

A continuación se muestra el programa que determina las oraciones en un texto dado utilizando expresiones regulares de Java (split method). Guarde este programa en un archivo con el nombreSentenceDetection_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);      
   } 
}

Compile y ejecute el archivo java guardado desde el símbolo del sistema utilizando los siguientes comandos.

javac SentenceDetection_RE.java 
java SentenceDetection_RE

Al ejecutarse, el programa anterior crea un documento PDF que muestra el siguiente mensaje.

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

Detección de frases usando OpenNLP

Para detectar sentencias, OpenNLP usa un modelo predefinido, un archivo llamado en-sent.bin. Este modelo predefinido está entrenado para detectar oraciones en un texto sin formato determinado.

los opennlp.tools.sentdetect El paquete contiene las clases e interfaces que se utilizan para realizar la tarea de detección de frases.

Para detectar una oración usando la biblioteca OpenNLP, necesita:

  • Carga el en-sent.bin modelo usando el SentenceModel clase

  • Instancia del SentenceDetectorME clase.

  • Detecta las oraciones usando el sentDetect() método de esta clase.

A continuación se muestran los pasos a seguir para escribir un programa que detecte las oraciones del texto en bruto dado.

Paso 1: carga del modelo

El modelo para la detección de oraciones está representado por la clase denominada SentenceModel, que pertenece al paquete opennlp.tools.sentdetect.

Para cargar un modelo de detección de frases:

  • Crear un InputStream objeto del modelo (Cree una instancia de FileInputStream y pase la ruta del modelo en formato String a su constructor).

  • Instancia del SentenceModel clase y pasar el InputStream (objeto) del modelo como un parámetro para su constructor como se muestra en el siguiente bloque de código -

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Paso 2: instanciar la clase SentenceDetectorME

los SentenceDetectorME clase del paquete opennlp.tools.sentdetectcontiene métodos para dividir el texto sin procesar en oraciones. Esta clase usa el modelo de máxima entropía para evaluar los caracteres del final de la oración en una cadena para determinar si significan el final de una oración.

Cree una instancia de esta clase y pase el objeto modelo creado en el paso anterior, como se muestra a continuación.

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

Paso 3: Detectando la oración

los sentDetect() método del SentenceDetectorMELa clase se usa para detectar las oraciones en el texto sin formato que se le pasa. Este método acepta una variable String como parámetro.

Invoque este método pasando el formato de cadena de la oración a este método.

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

Example

A continuación se muestra el programa que detecta las oraciones en un texto en bruto determinado. Guarde este programa en un archivo con nombreSentenceDetectionME.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);  
   } 
}

Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:

javac SentenceDetectorME.java 
java SentenceDetectorME

Al ejecutarse, el programa anterior lee la cadena dada y detecta las oraciones en ella y muestra la siguiente salida.

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

Detectando las posiciones de las oraciones

También podemos detectar las posiciones de las oraciones usando el método sentPosDetect () del SentenceDetectorME class.

A continuación se muestran los pasos a seguir para escribir un programa que detecte las posiciones de las oraciones a partir del texto en bruto dado.

Paso 1: carga del modelo

El modelo para la detección de oraciones está representado por la clase denominada SentenceModel, que pertenece al paquete opennlp.tools.sentdetect.

Para cargar un modelo de detección de frases:

  • Crear un InputStream objeto del modelo (Cree una instancia de FileInputStream y pase la ruta del modelo en formato String a su constructor).

  • Instancia del SentenceModel clase y pasar el InputStream (objeto) del modelo como parámetro para su constructor, como se muestra en el siguiente bloque de código.

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Paso 2: instanciar la clase SentenceDetectorME

los SentenceDetectorME clase del paquete opennlp.tools.sentdetectcontiene métodos para dividir el texto sin procesar en oraciones. Esta clase usa el modelo de máxima entropía para evaluar los caracteres del final de la oración en una cadena para determinar si significan el final de una oración.

Cree una instancia de esta clase y pase el objeto modelo creado en el paso anterior.

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

Paso 3: Detectando la posición de la oración

los sentPosDetect() método del SentenceDetectorMELa clase se usa para detectar las posiciones de las oraciones en el texto sin formato que se le pasa. Este método acepta una variable String como parámetro.

Invoque este método pasando el formato de cadena de la oración como parámetro a este método.

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

Paso 4: imprimir los intervalos de las oraciones

los sentPosDetect() método del SentenceDetectorME clase devuelve una matriz de objetos del tipo Span. La clase denominada Span delopennlp.tools.util paquete se utiliza para almacenar el número entero inicial y final de conjuntos.

Puede almacenar los intervalos devueltos por el sentPosDetect() en la matriz Span e imprímalos, como se muestra en el siguiente bloque de código.

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

Example

A continuación se muestra el programa que detecta las oraciones en el texto sin formato dado. Guarde este programa en un archivo con nombreSentenceDetectionME.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);  
   } 
}

Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:

javac SentencePosDetection.java 
java SentencePosDetection

Al ejecutarse, el programa anterior lee la cadena dada y detecta las oraciones en ella y muestra la siguiente salida.

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

Oraciones junto con sus posiciones

los substring() El método de la clase String acepta el begin y el end offsetsy devuelve la cadena respectiva. Podemos usar este método para imprimir las oraciones y sus intervalos (posiciones) juntos, como se muestra en el siguiente bloque de código.

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

A continuación se muestra el programa para detectar las oraciones del texto en bruto dado y mostrarlas junto con sus posiciones. Guarde este programa en un archivo con nombreSentencesAndPosDetection.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);  
   } 
}

Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:

javac SentencesAndPosDetection.java 
java SentencesAndPosDetection

Al ejecutarse, el programa anterior lee la cadena dada y detecta las oraciones junto con sus posiciones y muestra la siguiente salida.

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

Detección de probabilidad de oraciones

los getSentenceProbabilities() método del SentenceDetectorME La clase devuelve las probabilidades asociadas con las llamadas más recientes al método sentDetect ().

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

A continuación se muestra el programa para imprimir las probabilidades asociadas con las llamadas al método sentDetect (). Guarde este programa en un archivo con el nombreSentenceDetectionMEProbs.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]); 
   } 
}

Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:

javac SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

Al ejecutarse, el programa anterior lee la cadena dada, detecta las oraciones y las imprime. Además, también devuelve las probabilidades asociadas con las llamadas más recientes al método sentDetect (), como se muestra a continuación.

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