OpenNLP - Chunking Sentences

Chunking uma frase refere-se a quebrar / dividir uma frase em partes de palavras, como grupos de palavras e grupos de verbos.

Chunking uma frase usando OpenNLP

Para detectar as frases, o OpenNLP usa um modelo, um arquivo chamado en-chunker.bin. Este é um modelo predefinido que é treinado para fragmentar as sentenças no texto bruto fornecido.

o opennlp.tools.chunker pacote contém as classes e interfaces que são usadas para encontrar anotações sintáticas não recursivas, como pedaços de frases nominais.

Você pode agrupar uma frase usando o método chunk() do ChunkerMEclasse. Este método aceita tokens de uma frase e tags POS como parâmetros. Portanto, antes de iniciar o processo de chunking, primeiro de tudo você precisa tokenizar a frase e gerar as tags POS das partes dela.

Para dividir uma frase usando a biblioteca OpenNLP, você precisa -

  • Tokenize a frase.

  • Gere tags de PDV para ele.

  • Carregue o en-chunker.bin modelo usando o ChunkerModel classe

  • Instancie o ChunkerME classe.

  • Separe as frases usando o chunk() método desta classe.

A seguir estão as etapas a serem seguidas para escrever um programa para separar frases do texto bruto fornecido.

Etapa 1: tokenização da frase

Tokenize as frases usando o tokenize() método do whitespaceTokenizer classe, conforme mostrado no bloco de código a seguir.

//Tokenizing the sentence 
String sentence = "Hi welcome to Tutorialspoint";       
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence);

Etapa 2: Gerando as tags POS

Gere as tags POS da frase usando o tag() método do POSTaggerME classe, conforme mostrado no bloco de código a seguir.

//Generating the POS tags 
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
POSModel model = new POSModelLoader().load(file);     
//Constructing the tagger 
POSTaggerME tagger = new POSTaggerME(model);        
//Generating tags from the tokens 
String[] tags = tagger.tag(tokens);

Etapa 3: Carregando o modelo

O modelo para fragmentar uma frase é representado pela classe chamada ChunkerModel, que pertence ao pacote opennlp.tools.chunker.

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 ChunkerModel classe e passar no InputStream (objeto) do modelo como um parâmetro para seu construtor, conforme mostrado no seguinte bloco de código -

//Loading the chunker model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
ChunkerModel chunkerModel = new ChunkerModel(inputStream);

Etapa 4: instanciando a classe chunkerME

o chunkerME classe do pacote opennlp.tools.chunkercontém métodos para fragmentar as sentenças. Este é um chunker baseado em entropia máxima.

Instancie essa classe e transmita o objeto modelo criado na etapa anterior.

//Instantiate the ChunkerME class 
ChunkerME chunkerME = new ChunkerME(chunkerModel);

Etapa 5: dividir a frase

o chunk() método do ChunkerMEclasse é usada para dividir as sentenças no texto bruto que lhe foi passado. Este método aceita dois arrays String representando tokens e tags, como parâmetros.

Chame este método passando a matriz de token e a matriz de tag criadas nas etapas anteriores como parâmetros.

//Generating the chunks 
String result[] = chunkerME.chunk(tokens, tags);

Example

A seguir está o programa para dividir as sentenças no texto bruto fornecido. Salve este programa em um arquivo com o nomeChunkerExample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;  

import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class ChunkerExample{ 
   
   public static void main(String args[]) throws IOException { 
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
     
      //Generating the POS tags 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModelLoader().load(file);     
      
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model);        
      
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);    
    
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel chunkerModel = new ChunkerModel(inputStream);  
      
      //Instantiate the ChunkerME class 
      ChunkerME chunkerME = new ChunkerME(chunkerModel);
       
      //Generating the chunks 
      String result[] = chunkerME.chunk(tokens, tags); 
  
      for (String s : result) 
         System.out.println(s);         
   }    
}

Compile e execute o arquivo Java salvo a partir do prompt de comando usando o seguinte comando -

javac ChunkerExample.java 
java ChunkerExample

Ao ser executado, o programa acima lê a String fornecida, separa as sentenças nela e as exibe conforme mostrado abaixo.

Loading POS Tagger model ... done (1.040s) 
B-NP 
I-NP 
B-VP 
I-VP

Detectando as posições dos tokens

Também podemos detectar as posições ou extensões dos pedaços usando o chunkAsSpans() método do ChunkerMEclasse. Este método retorna uma matriz de objetos do tipo Span. A classe chamada Span of theopennlp.tools.util pacote é usado para armazenar o start e end número inteiro de conjuntos.

Você pode armazenar os vãos retornados pelo chunkAsSpans() na matriz Span e imprima-os, conforme mostrado no bloco de código a seguir.

//Generating the tagged chunk spans 
Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
for (Span s : span) 
   System.out.println(s.toString());

Example

A seguir está o programa que detecta as sentenças no texto bruto fornecido. Salve este programa em um arquivo com o nomeChunkerSpansEample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream;  

import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer; 
import opennlp.tools.util.Span;  

public class ChunkerSpansEample{ 
   
   public static void main(String args[]) throws IOException { 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
      POSModel model = new POSModelLoader().load(file); 
       
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model); 
  
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);       
   
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel chunkerModel = new ChunkerModel(inputStream);
      ChunkerME chunkerME = new ChunkerME(chunkerModel);       
           
      //Generating the tagged chunk spans 
      Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
      for (Span s : span) 
         System.out.println(s.toString());  
   }    
}

Compile e execute o arquivo Java salvo no prompt de comando usando os seguintes comandos -

javac ChunkerSpansEample.java 
java ChunkerSpansEample

Ao ser executado, o programa acima lê a string fornecida e as extensões dos blocos nela, e exibe a seguinte saída -

Loading POS Tagger model ... done (1.059s) 
[0..2) NP 
[2..4) VP

Detecção de probabilidade de chunker

o probs() método do ChunkerME classe retorna as probabilidades da última sequência decodificada.

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

A seguir está o programa para imprimir as probabilidades da última sequência decodificada pelo chunker. Salve este programa em um arquivo com o nomeChunkerProbsExample.java.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import opennlp.tools.chunker.ChunkerME; 
import opennlp.tools.chunker.ChunkerModel; 
import opennlp.tools.cmdline.postag.POSModelLoader; 
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class ChunkerProbsExample{ 
   
   public static void main(String args[]) throws IOException { 
      //Load the parts of speech model 
      File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");     
      POSModel model = new POSModelLoader().load(file); 
       
      //Constructing the tagger 
      POSTaggerME tagger = new POSTaggerME(model); 
  
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint";       
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags from the tokens 
      String[] tags = tagger.tag(tokens);       
   
      //Loading the chunker model 
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
      ChunkerModel cModel = new ChunkerModel(inputStream); 
      ChunkerME chunkerME = new ChunkerME(cModel); 
       
      //Generating the chunk tags 
      chunkerME.chunk(tokens, tags); 
       
      //Getting the probabilities of the last decoded sequence       
      double[] probs = chunkerME.probs(); 
      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 ChunkerProbsExample.java 
java ChunkerProbsExample

Ao ser executado, o programa acima lê a string fornecida, fragmenta-a e imprime as probabilidades da última sequência decodificada.

0.9592746040797778 
0.6883933131241501 
0.8830563473996004 
0.8951150529746051