OpenNLP - Tokenização

O processo de cortar a frase dada em partes menores (tokens) é conhecido como tokenization. Em geral, o texto bruto fornecido é marcado com base em um conjunto de delimitadores (principalmente espaços em branco).

A tokenização é usada em tarefas como verificação ortográfica, processamento de pesquisas, identificação de classes gramaticais, detecção de frases, classificação de documentos, etc.

Tokenização usando OpenNLP

o opennlp.tools.tokenize pacote contém as classes e interfaces que são usadas para realizar a tokenização.

Para tokenizar as frases fornecidas em fragmentos mais simples, a biblioteca OpenNLP oferece três classes diferentes -

  • SimpleTokenizer - Esta classe simboliza o texto bruto fornecido usando classes de caracteres.

  • WhitespaceTokenizer - Esta classe usa espaços em branco para tokenizar o texto fornecido.

  • TokenizerME- Esta classe converte texto bruto em tokens separados. Ele usa Entropia Máxima para tomar suas decisões.

SimpleTokenizer

Para tokenizar uma frase usando o SimpleTokenizer classe, você precisa -

  • Crie um objeto da respectiva classe.

  • Tokenize a frase usando o tokenize() método.

  • Imprima os tokens.

A seguir estão os passos a serem seguidos para escrever um programa que tokenize o texto bruto fornecido.

Step 1 - Instanciando a respectiva classe

Em ambas as classes, não há construtores disponíveis para instanciá-los. Portanto, precisamos criar objetos dessas classes usando a variável estáticaINSTANCE.

SimpleTokenizer tokenizer = SimpleTokenizer.INSTANCE;

Step 2 - Tokenizar as frases

Ambas as classes contêm um método chamado tokenize(). Este método aceita um texto bruto no formato String. Ao invocar, ele simboliza a String fornecida e retorna uma matriz de Strings (tokens).

Tokenize a frase usando o tokenizer() método conforme mostrado abaixo.

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence);

Step 3 - Imprima os tokens

Depois de tokenizar a frase, você pode imprimir os tokens usando for loop, como mostrado abaixo.

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

Example

A seguir está o programa que simboliza a frase fornecida usando a classe SimpleTokenizer. Salve este programa em um arquivo com o nomeSimpleTokenizerExample.java.

import opennlp.tools.tokenize.SimpleTokenizer;  
public class SimpleTokenizerExample { 
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Tokenizing the given sentence 
      String tokens[] = simpleTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens) {         
         System.out.println(token);  
      }       
   }  
}

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

javac SimpleTokenizerExample.java 
java SimpleTokenizerExample

Ao ser executado, o programa acima lê a string fornecida (texto bruto), transforma-a em token e exibe a seguinte saída -

Hi 
. 
How 
are 
you 
? 
Welcome 
to 
Tutorialspoint 
. 
We 
provide 
free 
tutorials 
on 
various 
technologies

WhitespaceTokenizer

Para tokenizar uma frase usando o WhitespaceTokenizer classe, você precisa -

  • Crie um objeto da respectiva classe.

  • Tokenize a frase usando o tokenize() método.

  • Imprima os tokens.

A seguir estão os passos a serem seguidos para escrever um programa que tokenize o texto bruto fornecido.

Step 1 - Instanciando a respectiva classe

Em ambas as classes, não há construtores disponíveis para instanciá-los. Portanto, precisamos criar objetos dessas classes usando a variável estáticaINSTANCE.

WhitespaceTokenizer tokenizer = WhitespaceTokenizer.INSTANCE;

Step 2 - Tokenizar as frases

Ambas as classes contêm um método chamado tokenize(). Este método aceita um texto bruto no formato String. Ao invocar, ele simboliza a String fornecida e retorna uma matriz de Strings (tokens).

Tokenize a frase usando o tokenizer() método conforme mostrado abaixo.

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence);

Step 3 - Imprima os tokens

Depois de tokenizar a frase, você pode imprimir os tokens usando for loop, como mostrado abaixo.

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

Example

A seguir está o programa que simboliza a frase dada usando o WhitespaceTokenizerclasse. Salve este programa em um arquivo com o nomeWhitespaceTokenizerExample.java.

import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class WhitespaceTokenizerExample {  
   
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating whitespaceTokenizer class 
       WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Tokenizing the given paragraph 
      String tokens[] = whitespaceTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens)     
         System.out.println(token);        
   } 
}

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

javac WhitespaceTokenizerExample.java 
java WhitespaceTokenizerExample

Ao ser executado, o programa acima lê a string fornecida (texto bruto), transforma-a em token e exibe a seguinte saída.

Hi. 
How 
are 
you? 
Welcome 
to 
Tutorialspoint. 
We 
provide 
free 
tutorials 
on 
various 
technologies

Classe TokenizerME

O OpenNLP também usa um modelo predefinido, um arquivo denominado de-token.bin, para tokenizar as frases. Ele é treinado para tokenizar as sentenças em um determinado texto bruto.

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

  • Carregue o en-token.bin modelo usando o TokenizerModel classe.

  • Instancie o TokenizerME classe.

  • Tokenize as frases usando o tokenize() método desta classe.

A seguir estão os passos a serem seguidos para escrever um programa que tokenizar as sentenças do texto bruto fornecido usando o TokenizerME classe.

Step 1 - Carregando o modelo

O modelo de tokenização é representado pela classe chamada TokenizerModel, que pertence ao pacote opennlp.tools.tokenize.

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 TokenizerModel 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 the Tokenizer model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
TokenizerModel tokenModel = new TokenizerModel(inputStream);

Step 2 - Instanciando a classe TokenizerME

o TokenizerME classe do pacote opennlp.tools.tokenizecontém métodos para dividir o texto bruto em partes menores (tokens). 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 the TokenizerME class 
TokenizerME tokenizer = new TokenizerME(tokenModel);

Step 3 - Tokenização da frase

o tokenize() método do TokenizerMEclasse é 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).

Chame este método passando o formato String da frase para este método, como segue.

//Tokenizing the given raw text 
String tokens[] = tokenizer.tokenize(paragraph);

Example

A seguir está o programa que simboliza o texto bruto fornecido. Salve este programa em um arquivo com o nomeTokenizerMEExample.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel;  

public class TokenizerMEExample { 
  
   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 the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
       
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel); 
       
      //Tokenizing the given raw text 
      String tokens[] = tokenizer.tokenize(sentence);       
          
      //Printing the tokens  
      for (String a : tokens) 
         System.out.println(a); 
   } 
}

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

javac TokenizerMEExample.java 
java TokenizerMEExample

Ao ser executado, o programa acima lê a string fornecida e detecta as sentenças nela e exibe a seguinte saída -

Hi 
. 
How 
are 
you 
? 
Welcome 
to 
Tutorialspoint 
. 
We 
provide 
free 
tutorials 
on 
various 
technologie

Recuperando as posições dos tokens

Também podemos obter as posições ou spans dos tokens usando o tokenizePos()método. Este é o método da interface Tokenizer do pacoteopennlp.tools.tokenize. Uma vez que todas as (três) classes de Tokenizer implementam essa interface, você pode encontrar esse método em todas elas.

Este método aceita a frase ou texto bruto na forma de uma string e retorna uma matriz de objetos do tipo Span.

Você pode obter as posições dos tokens usando o tokenizePos() método, como segue -

//Retrieving the tokens 
tokenizer.tokenizePos(sentence);

Imprimindo as posições (spans)

A classe chamada Span do opennlp.tools.util pacote é usado para armazenar o inteiro inicial e final dos conjuntos.

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

//Retrieving the tokens 
Span[] tokens = tokenizer.tokenizePos(sentence);
//Printing the spans of tokens 
for( Span token : tokens)        
   System.out.println(token);

Imprimir tokens e suas posições juntos

o substring() método da classe String aceita o begin e a enddesloca e retorna a respectiva string. Podemos usar esse método para imprimir os tokens e seus intervalos (posições) juntos, conforme mostrado no bloco de código a seguir.

//Printing the spans of tokens 
for(Span token : tokens)  
   System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));

Example(SimpleTokenizer)

A seguir está o programa que recupera as extensões de token do texto bruto usando o SimpleTokenizerclasse. Ele também imprime os tokens junto com suas posições. Salve este programa em um arquivo com o nomeSimpleTokenizerSpans.java.

import opennlp.tools.tokenize.SimpleTokenizer; 
import opennlp.tools.util.Span;  

public class SimpleTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Retrieving the boundaries of the tokens 
      Span[] tokens = simpleTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens)
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));          
   } 
}

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

javac SimpleTokenizerSpans.java 
java SimpleTokenizerSpans

Ao ser executado, o programa acima lê a string fornecida (texto bruto), transforma-a em token e exibe a seguinte saída -

[0..2) Hi 
[2..3) . 
[4..7) How 
[8..11) are 
[12..15) you 
[15..16) ? 
[17..24) Welcome 
[25..27) to 
[28..42) Tutorialspoint 
[42..43) . 
[44..46) We 
[47..54) provide 
[55..59) free 
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

Example (WhitespaceTokenizer)

A seguir está o programa que recupera as extensões de token do texto bruto usando o WhitespaceTokenizerclasse. Ele também imprime os tokens junto com suas posições. Salve este programa em um arquivo com o nomeWhitespaceTokenizerSpans.java.

import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.Span; 
public class WhitespaceTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Retrieving the tokens 
      Span[] tokens = whitespaceTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens) 
         System.out.println(token +" 
            "+sent.substring(token.getStart(), token.getEnd()));        
   } 
}

Compile e execute o arquivo java salvo a partir do prompt de comando usando os seguintes comandos

javac WhitespaceTokenizerSpans.java 
java WhitespaceTokenizerSpans

Ao ser executado, o programa acima lê a string fornecida (texto bruto), transforma-a em token e exibe a seguinte saída.

[0..3) Hi. 
[4..7) How 
[8..11) are 
[12..16) you? 
[17..24) Welcome 
[25..27) to 
[28..43) Tutorialspoint. 
[44..46) We 
[47..54) provide 
[55..59) free
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

Example (TokenizerME)

A seguir está o programa que recupera as extensões de token do texto bruto usando o TokenizerMEclasse. Ele também imprime os tokens junto com suas posições. Salve este programa em um arquivo com o nomeTokenizerMESpans.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span;  

public class TokenizerMESpans { 
   public static void main(String args[]) throws Exception{     
      String sent = "Hello John how are you welcome to Tutorialspoint"; 
       
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
       
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel); 
       
      //Retrieving the positions of the tokens 
      Span tokens[] = tokenizer.tokenizePos(sent); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
   } 
}

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

javac TokenizerMESpans.java 
java TokenizerMESpans

Ao ser executado, o programa acima lê a string fornecida (texto bruto), transforma-a em token e exibe a seguinte saída -

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint

Probabilidade de Tokenizer

O método getTokenProbabilities () da classe TokenizerME é usado para obter as probabilidades associadas às chamadas mais recentes para o método tokenizePos ().

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

A seguir está o programa para imprimir as probabilidades associadas às chamadas para o método tokenizePos (). Salve este programa em um arquivo com o nomeTokenizerMEProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span;  

public class TokenizerMEProbs { 
   
   public static void main(String args[]) throws Exception{     
      String sent = "Hello John how are you welcome to Tutorialspoint"; 
      
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
      
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel);
      
      //Retrieving the positions of the tokens 
      Span tokens[] = tokenizer.tokenizePos(sent); 
       
      //Getting the probabilities of the recent calls to tokenizePos() method 
      double[] probs = tokenizer.getTokenProbabilities(); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
         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 TokenizerMEProbs.java 
java TokenizerMEProbs

Ao ser executado, o programa acima lê a String fornecida, transforma as frases em token e as imprime. Além disso, ele também retorna as probabilidades associadas às chamadas mais recentes para o método tokenizerPos ().

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint 
   
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0