OpenNLP - Encontrando partes da fala

Usando o OpenNLP, você também pode detectar as partes da fala de uma determinada frase e imprimi-las. Em vez do nome completo das classes gramaticais, o OpenNLP usa formas curtas de cada classe gramatical. A tabela a seguir indica as diversas partes dos discursos detectados pelo OpenNLP e seus significados.

Partes do discurso Significado da classe gramatical
NN Substantivo, singular ou massa
DT Determinante
VB Verbo, forma básica
VBD Verbo, pretérito
VBZ Verbo, terceira pessoa do singular presente
DENTRO Preposição ou conjunção subordinada
NNP Nome próprio, singular
PARA para
JJ Adjetivo

Marcando as partes da fala

Para marcar a classe gramatical de uma frase, o OpenNLP usa um modelo, um arquivo chamado en-posmaxent.bin. Este é um modelo predefinido que é treinado para marcar as classes gramaticais de um determinado texto bruto.

o POSTaggerME classe do opennlp.tools.postagpacote é usado para carregar este modelo e marcar a classe gramatical do texto bruto fornecido usando a biblioteca OpenNLP. Para fazer isso, você precisa -

  • Carregue o en-pos-maxent.bin modelo usando o POSModel classe.

  • Instancie o POSTaggerME classe.

  • Tokenize a frase.

  • Gere as tags usando tag() método.

  • Imprima os tokens e tags usando POSSample classe.

A seguir estão os passos a serem seguidos para escrever um programa que marca as partes do discurso no texto bruto fornecido usando o POSTaggerME classe.

Etapa 1: carregar o modelo

O modelo para marcação de POS é representado pela classe chamada POSModel, que pertence ao pacote opennlp.tools.postag.

Para carregar um modelo de tokenizer -

  • Criar um InputStream objeto do modelo (instancie o FileInputStream e passe o caminho do modelo no formato String para seu construtor).

  • Instancie o POSModel classe e passar no InputStream (objeto) do modelo como um parâmetro para seu construtor, conforme mostrado no seguinte bloco de código -

//Loading Parts of speech-maxent model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin"); 
POSModel model = new POSModel(inputStream);

Etapa 2: instanciando a classe POSTaggerME

o POSTaggerME classe do pacote opennlp.tools.postagé usado para prever as classes gramaticais de um determinado texto bruto. Ele usa Entropia Máxima para tomar suas decisões.

Instancie esta classe e passe o objeto modelo criado na etapa anterior, conforme mostrado abaixo -

//Instantiating POSTaggerME class 
POSTaggerME tagger = new POSTaggerME(model);

Etapa 3: tokenização da frase

o tokenize() método do whitespaceTokenizerclasse é usada para tokenizar o texto bruto passado a ela. Este método aceita uma variável String como parâmetro e retorna uma matriz de Strings (tokens).

Instancie o whitespaceTokenizer classe e invocar este método passando o formato String da frase para este método.

//Tokenizing the sentence using WhitespaceTokenizer class  
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence);

Etapa 4: Gerando as tags

o tag() método do whitespaceTokenizerclasse atribui tags POS para a frase de tokens. Este método aceita um array de tokens (String) como parâmetro e retorna a tag (array).

Invoque o tag() método passando os tokens gerados na etapa anterior para ele.

//Generating tags 
String[] tags = tagger.tag(tokens);

Etapa 5: imprimir os tokens e as tags

o POSSampleclasse representa a frase marcada com POS. Para instanciar essa classe, exigiríamos um array de tokens (do texto) e um array de tags.

o toString()método desta classe retorna a frase marcada. Instancie essa classe passando o token e as matrizes de tag criadas nas etapas anteriores e invoque seutoString() método, conforme mostrado no seguinte bloco de código.

//Instantiating the POSSample class 
POSSample sample = new POSSample(tokens, tags); 
System.out.println(sample.toString());

Example

A seguir está o programa que marca as classes gramaticais em um determinado texto bruto. Salve este programa em um arquivo com o nomePosTaggerExample.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class PosTaggerExample { 
  
   public static void main(String args[]) throws Exception{ 
    
      //Loading Parts of speech-maxent model       
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModel(inputStream); 
       
      //Instantiating POSTaggerME class 
      POSTaggerME tagger = new POSTaggerME(model); 
       
      String sentence = "Hi welcome to Tutorialspoint"; 
       
      //Tokenizing the sentence using WhitespaceTokenizer class  
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Generating tags 
      String[] tags = tagger.tag(tokens);
      
      //Instantiating the POSSample class 
      POSSample sample = new POSSample(tokens, tags); 
      System.out.println(sample.toString()); 
   
   } 
}

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

javac PosTaggerExample.java 
java PosTaggerExample

Ao ser executado, o programa acima lê o texto fornecido e detecta as classes gramaticais dessas frases e as exibe, conforme mostrado abaixo.

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB

Desempenho do POS Tagger

A seguir está o programa que marca as classes gramaticais de um determinado texto bruto. Ele também monitora o desempenho e exibe o desempenho do tagger. Salve este programa em um arquivo com o nomePosTagger_Performance.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.cmdline.PerformanceMonitor; 
import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class PosTagger_Performance { 
   public static void main(String args[]) throws Exception{ 
      //Loading Parts of speech-maxent model       
      InputStream inputStream = new 
         FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin"); 
      POSModel model = new POSModel(inputStream); 
       
      //Creating an object of WhitespaceTokenizer class  
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
      
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint"; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Instantiating POSTaggerME class 
      POSTaggerME tagger = new POSTaggerME(model); 
       
      //Generating tags 
      String[] tags = tagger.tag(tokens); 
       
      //Instantiating POSSample class       
      POSSample sample = new POSSample(tokens, tags); 
      System.out.println(sample.toString()); 
       
      //Monitoring the performance of POS tagger 
      PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent"); 
      perfMon.start(); 
      perfMon.incrementCounter(); 
      perfMon.stopAndPrintFinalResult();      
   } 
}

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

javac PosTaggerExample.java 
java PosTaggerExample

Na execução, o programa acima lê o texto fornecido, marca as classes gramaticais dessas frases e as exibe. Além disso, ele também monitora o desempenho do tagger POS e o exibe.

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB  
Average: 0.0 sent/s  
Total: 1 sent 
Runtime: 0.0s

Probabilidade POS Tagger

o probs() método do POSTaggerME classe é usada para encontrar as probabilidades para cada tag da frase recentemente marcada.

//Getting the probabilities of the recent calls to tokenizePos() method 
double[] probs = detector.getSentenceProbabilities();

A seguir está o programa que exibe as probabilidades para cada tag da última frase marcada. Salve este programa em um arquivo com o nomePosTaggerProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.postag.POSModel; 
import opennlp.tools.postag.POSSample; 
import opennlp.tools.postag.POSTaggerME; 
import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class PosTaggerProbs { 
   
   public static void main(String args[]) throws Exception{ 
      
      //Loading Parts of speech-maxent model       
      InputStream inputStream = new FileInputStream("C:/OpenNLP_mdl/en-pos-maxent.bin"); 
      POSModel model = new POSModel(inputStream); 
       
      //Creating an object of WhitespaceTokenizer class  
      WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
       
      //Tokenizing the sentence 
      String sentence = "Hi welcome to Tutorialspoint"; 
      String[] tokens = whitespaceTokenizer.tokenize(sentence); 
       
      //Instantiating POSTaggerME class 
      POSTaggerME tagger = new POSTaggerME(model); 
             
      //Generating tags 
      String[] tags = tagger.tag(tokens);       
      
      //Instantiating the POSSample class 
      POSSample sample = new POSSample(tokens, tags);  
      System.out.println(sample.toString());
      
      //Probabilities for each tag of the last tagged sentence. 
      double [] probs = tagger.probs();       
      System.out.println("  ");       
      
      //Printing the probabilities  
      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 TokenizerMEProbs.java 
java TokenizerMEProbs

Ao ser executado, o programa acima lê o texto bruto fornecido, marca as classes gramaticais de cada token nele e os exibe. Além disso, ele também exibe as probabilidades para cada classe de palavras na frase dada, conforme mostrado abaixo.

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB    
0.6416834779738033 
0.42983612874819177 
0.8584513635863117 
0.4394784478206072