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