OpenNLP - Reconocimiento de entidad nombrada
El proceso de encontrar nombres, personas, lugares y otras entidades de un texto dado se conoce como Named Eentidad Rreconocimiento (NER). En este capítulo, discutiremos cómo realizar NER a través del programa Java usando la biblioteca OpenNLP.
Reconocimiento de entidad nombrada usando PNL abierto
Para realizar varias tareas de NER, OpenNLP utiliza diferentes modelos predefinidos, a saber, en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin y en-ner-time. compartimiento. Todos estos archivos son modelos predefinidos que están entrenados para detectar las entidades respectivas en un texto sin formato dado.
los opennlp.tools.namefindEl paquete contiene las clases y las interfaces que se utilizan para realizar la tarea NER. Para realizar la tarea NER utilizando la biblioteca OpenNLP, debe:
Cargue el modelo respectivo usando el TokenNameFinderModel clase.
Instancia del NameFinder clase.
Busque los nombres e imprímalos.
A continuación se muestran los pasos a seguir para escribir un programa que detecte las entidades de nombre de un texto en bruto dado.
Paso 1: carga del modelo
El modelo para la detección de oraciones está representado por la clase denominada TokenNameFinderModel, que pertenece al paquete opennlp.tools.namefind.
Para cargar un modelo NER:
Crear un InputStream objeto del modelo (Cree una instancia de FileInputStream y pase la ruta del modelo NER apropiado en formato String a su constructor).
Instancia del TokenNameFinderModel clase y pasar el InputStream (objeto) del modelo como parámetro para su constructor, como se muestra en el siguiente bloque de código.
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
Paso 2: instanciar la clase NameFinderME
los NameFinderME clase del paquete opennlp.tools.namefindcontiene métodos para realizar las tareas NER. Esta clase usa el modelo de máxima entropía para encontrar las entidades nombradas en el texto sin formato dado.
Cree una instancia de esta clase y pase el objeto modelo creado en el paso anterior como se muestra a continuación:
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
Paso 3: encontrar los nombres en la oración
los find() método del NameFinderMELa clase se utiliza para detectar los nombres en el texto sin formato que se le pasa. Este método acepta una variable String como parámetro.
Invoque este método pasando el formato de cadena de la oración a este método.
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
Paso 4: imprimir los intervalos de los nombres en la oración
los find() método del NameFinderMELa clase devuelve una matriz de objetos del tipo Span. La clase denominada Span delopennlp.tools.util El paquete se utiliza para almacenar el start y end entero de conjuntos.
Puede almacenar los intervalos devueltos por el find() en la matriz Span e imprímalos, como se muestra en el siguiente bloque de código.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
A continuación se muestra el programa que lee la oración dada y reconoce los intervalos de los nombres de las personas en ella. Guarde este programa en un archivo con el nombreNameFinderME_Example.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.util.Span;
public class NameFinderME_Example {
public static void main(String args[]) throws Exception{
/Loading the NER - Person model InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-ner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStream);
//Instantiating the NameFinder class
NameFinderME nameFinder = new NameFinderME(model);
//Getting the sentence in the form of String array
String [] sentence = new String[]{
"Mike",
"and",
"Smith",
"are",
"good",
"friends"
};
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
//Printing the spans of the names in the sentence
for(Span s: nameSpans)
System.out.println(s.toString());
}
}
Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:
javac NameFinderME_Example.java
java NameFinderME_Example
Al ejecutarse, el programa anterior lee la cadena dada (texto sin formato), detecta los nombres de las personas en él y muestra sus posiciones (intervalos), como se muestra a continuación.
[0..1) person
[2..3) person
Nombres junto con sus posiciones
los substring() El método de la clase String acepta el begin y el end offsetsy devuelve la cadena respectiva. Podemos usar este método para imprimir los nombres y sus intervalos (posiciones) juntos, como se muestra en el siguiente bloque de código.
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
A continuación se muestra el programa para detectar los nombres del texto sin formato dado y mostrarlos junto con sus posiciones. Guarde este programa en un archivo con el nombreNameFinderSentences.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class NameFinderSentences {
public static void main(String args[]) throws Exception{
//Loading the tokenizer model
InputStream inputStreamTokenizer = new
FileInputStream("C:/OpenNLP_models/entoken.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStreamTokenizer);
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
//Tokenizing the sentence in to a string array
String sentence = "Mike is senior programming
manager and Rama is a clerk both are working at
Tutorialspoint";
String tokens[] = tokenizer.tokenize(sentence);
//Loading the NER-person model
InputStream inputStreamNameFinder = new
FileInputStream("C:/OpenNLP_models/enner-person.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(tokens);
//Printing the names and their spans in a sentence
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
}
}
Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:
javac NameFinderSentences.java
java NameFinderSentences
Al ejecutarse, el programa anterior lee la Cadena dada (texto sin formato), detecta los nombres de las personas en él y muestra sus posiciones (intervalos) como se muestra a continuación.
[0..1) person Mike
Encontrar los nombres de la ubicación
Al cargar varios modelos, puede detectar varias entidades con nombre. A continuación se muestra un programa Java que carga elen-ner-location.binmodela y detecta los nombres de ubicación en la oración dada. Guarde este programa en un archivo con el nombreLocationFinder.java.
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.namefind.NameFinderME;
import opennlp.tools.namefind.TokenNameFinderModel;
import opennlp.tools.tokenize.TokenizerME;
import opennlp.tools.tokenize.TokenizerModel;
import opennlp.tools.util.Span;
public class LocationFinder {
public static void main(String args[]) throws Exception{
InputStream inputStreamTokenizer = new
FileInputStream("C:/OpenNLP_models/entoken.bin");
TokenizerModel tokenModel = new TokenizerModel(inputStreamTokenizer);
//String paragraph = "Mike and Smith are classmates";
String paragraph = "Tutorialspoint is located in Hyderabad";
//Instantiating the TokenizerME class
TokenizerME tokenizer = new TokenizerME(tokenModel);
String tokens[] = tokenizer.tokenize(paragraph);
//Loading the NER-location moodel
InputStream inputStreamNameFinder = new
FileInputStream("C:/OpenNLP_models/en- ner-location.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
//Finding the names of a location
Span nameSpans[] = nameFinder.find(tokens);
//Printing the spans of the locations in the sentence
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
}
}
Compile y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:
javac LocationFinder.java
java LocationFinder
Al ejecutarse, el programa anterior lee la cadena dada (texto sin formato), detecta los nombres de las personas en él y muestra sus posiciones (intervalos), como se muestra a continuación.
[4..5) location Hyderabad
Probabilidad de NameFinder
los probs()método del NameFinderME La clase se usa para obtener las probabilidades de la última secuencia decodificada.
double[] probs = nameFinder.probs();
A continuación se muestra el programa para imprimir las probabilidades. Guarde este programa en un archivo con el nombreTokenizerMEProbs.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 y ejecute el archivo Java guardado desde el símbolo del sistema utilizando los siguientes comandos:
javac TokenizerMEProbs.java
java TokenizerMEProbs
Al ejecutarse, el programa anterior lee la Cadena dada, tokeniza las oraciones y las imprime. Además, también devuelve las probabilidades de la última secuencia decodificada, como se muestra a continuación.
[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