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