OpenNLP - Detecção de Sentenças
Ao processar uma linguagem natural, decidir o início e o fim das frases é um dos problemas a serem enfrentados. Este processo é conhecido comoSentence Bexterior Disambiguação (SBD) ou simplesmente quebra de frase.
As técnicas que usamos para detectar as sentenças em um determinado texto dependem do idioma do texto.
Detecção de frases usando Java
Podemos detectar as sentenças no texto fornecido em Java usando Expressões regulares e um conjunto de regras simples.
Por exemplo, vamos supor que um ponto final, um ponto de interrogação ou um ponto de exclamação encerre uma frase no texto fornecido, então podemos dividir a frase usando o split() método do Stringclasse. Aqui, temos que passar uma expressão regular no formato String.
A seguir está o programa que determina as sentenças em um determinado texto usando expressões regulares Java (split method). Salve este programa em um arquivo com o nomeSentenceDetection_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 e execute o arquivo java salvo no prompt de comando usando os comandos a seguir.
javac SentenceDetection_RE.java
java SentenceDetection_RE
Ao ser executado, o programa acima cria um documento PDF exibindo a seguinte mensagem.
Hi
How are you
Welcome to Tutorialspoint
We provide free tutorials on various technologies
Detecção de frases usando OpenNLP
Para detectar frases, o OpenNLP usa um modelo predefinido, um arquivo chamado en-sent.bin. Este modelo predefinido é treinado para detectar frases em um determinado texto bruto.
o opennlp.tools.sentdetect pacote contém as classes e interfaces que são usadas para realizar a tarefa de detecção de frases.
Para detectar uma frase usando a biblioteca OpenNLP, você precisa -
Carregue o en-sent.bin modelo usando o SentenceModel classe
Instancie o SentenceDetectorME classe.
Detecte as sentenças usando o sentDetect() método desta classe.
A seguir estão os passos a serem seguidos para escrever um programa que detecta as sentenças de um determinado texto bruto.
Etapa 1: Carregando o modelo
O modelo para detecção de frases é representado pela classe chamada SentenceModel, que pertence ao pacote opennlp.tools.sentdetect.
Para carregar um modelo de detecção de frase -
Criar um InputStream objeto do modelo (instancie o FileInputStream e passe o caminho do modelo no formato String para seu construtor).
Instancie o SentenceModel classe e passar no InputStream (objeto) do modelo como um parâmetro para seu construtor, conforme mostrado no seguinte bloco de código -
//Loading sentence detector model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin");
SentenceModel model = new SentenceModel(inputStream);
Etapa 2: instanciando a classe SentençaDetectorME
o SentenceDetectorME classe do pacote opennlp.tools.sentdetectcontém métodos para dividir o texto bruto em frases. Esta classe usa o modelo de Entropia Máxima para avaliar caracteres de fim de frase em uma string para determinar se eles significam o fim de uma frase.
Instancie esta classe e passe o objeto modelo criado na etapa anterior, conforme mostrado abaixo.
//Instantiating the SentenceDetectorME class
SentenceDetectorME detector = new SentenceDetectorME(model);
Etapa 3: Detectando a frase
o sentDetect() método do SentenceDetectorMEclasse é usada para detectar as sentenças no texto bruto passado a ela. Este método aceita uma variável String como parâmetro.
Chame este método passando o formato String da frase para este método.
//Detecting the sentence
String sentences[] = detector.sentDetect(sentence);
Example
A seguir está o programa que detecta as sentenças em um determinado texto bruto. Salve este programa em um arquivo com o nomeSentenceDetectionME.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 e execute o arquivo Java salvo no prompt de comando usando os seguintes comandos -
javac SentenceDetectorME.java
java SentenceDetectorME
Ao ser executado, o programa acima lê a String fornecida, detecta as sentenças nela e exibe a seguinte saída.
Hi. How are you?
Welcome to Tutorialspoint.
We provide free tutorials on various technologies
Detectando as posições das sentenças
Também podemos detectar as posições das sentenças usando o método sentPosDetect () do SentenceDetectorME class.
A seguir estão os passos a serem seguidos para escrever um programa que detecta as posições das sentenças de um determinado texto bruto.
Etapa 1: Carregando o modelo
O modelo para detecção de frases é representado pela classe chamada SentenceModel, que pertence ao pacote opennlp.tools.sentdetect.
Para carregar um modelo de detecção de frase -
Criar um InputStream objeto do modelo (instancie o FileInputStream e passe o caminho do modelo no formato String para seu construtor).
Instancie o SentenceModel classe e passar no InputStream (objeto) do modelo como um parâmetro para seu construtor, conforme mostrado no bloco de código a seguir.
//Loading sentence detector model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
SentenceModel model = new SentenceModel(inputStream);
Etapa 2: instanciando a classe SentençaDetectorME
o SentenceDetectorME classe do pacote opennlp.tools.sentdetectcontém métodos para dividir o texto bruto em frases. Esta classe usa o modelo de Entropia Máxima para avaliar caracteres de fim de frase em uma string para determinar se eles significam o fim de uma frase.
Instancie essa classe e transmita o objeto modelo criado na etapa anterior.
//Instantiating the SentenceDetectorME class
SentenceDetectorME detector = new SentenceDetectorME(model);
Etapa 3: Detectando a posição da frase
o sentPosDetect() método do SentenceDetectorMEclasse é usada para detectar as posições das sentenças no texto bruto passado a ela. Este método aceita uma variável String como parâmetro.
Invoque este método passando o formato String da frase como um parâmetro para este método.
//Detecting the position of the sentences in the paragraph
Span[] spans = detector.sentPosDetect(sentence);
Etapa 4: imprimir as extensões das frases
o sentPosDetect() método do SentenceDetectorME classe retorna uma matriz de objetos do tipo Span. A classe chamada Span of theopennlp.tools.util pacote é usado para armazenar o inteiro inicial e final dos conjuntos.
Você pode armazenar os vãos retornados pelo sentPosDetect() na matriz Span e imprima-os, conforme mostrado no bloco de código a seguir.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
Example
A seguir está o programa que detecta as sentenças no texto bruto fornecido. Salve este programa em um arquivo com o nomeSentenceDetectionME.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 e execute o arquivo Java salvo no prompt de comando usando os seguintes comandos -
javac SentencePosDetection.java
java SentencePosDetection
Ao ser executado, o programa acima lê a String fornecida, detecta as sentenças nela e exibe a seguinte saída.
[0..16)
[17..43)
[44..93)
Frases juntamente com suas posições
o substring() método da classe String aceita o begin e a end offsetse retorna a respectiva string. Podemos usar esse método para imprimir as frases e seus intervalos (posições) juntos, conforme mostrado no bloco de código a seguir.
for (Span span : spans)
System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);
A seguir está o programa para detectar as frases do texto bruto fornecido e exibi-las junto com suas posições. Salve este programa em um arquivo com o nomeSentencesAndPosDetection.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 e execute o arquivo Java salvo no prompt de comando usando os seguintes comandos -
javac SentencesAndPosDetection.java
java SentencesAndPosDetection
Ao ser executado, o programa acima lê a String fornecida e detecta as sentenças junto com suas posições e exibe a seguinte saída.
Hi. How are you? [0..16)
Welcome to Tutorialspoint. [17..43)
We provide free tutorials on various technologies [44..93)
Detecção de probabilidade de sentença
o getSentenceProbabilities() método do SentenceDetectorME classe retorna as probabilidades associadas às chamadas mais recentes para o método sentDetect ().
//Getting the probabilities of the last decoded sequence
double[] probs = detector.getSentenceProbabilities();
A seguir está o programa para imprimir as probabilidades associadas às chamadas para o método sentDetect (). Salve este programa em um arquivo com o nomeSentenceDetectionMEProbs.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 e execute o arquivo Java salvo no prompt de comando usando os seguintes comandos -
javac SentenceDetectionMEProbs.java
java SentenceDetectionMEProbs
Ao ser executado, o programa acima lê a String fornecida, detecta as sentenças e as imprime. Além disso, ele também retorna as probabilidades associadas às chamadas mais recentes para o método sentDetect (), conforme mostrado abaixo.
Hi. How are you?
Welcome to Tutorialspoint.
We provide free tutorials on various technologies
0.9240246995179983
0.9957680129995953
1.0