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