OpenNLP - Named Entity Recognition
Das Finden von Namen, Personen, Orten und anderen Entitäten aus einem bestimmten Text ist bekannt als Named Entität RErkenntnis (NER). In diesem Kapitel werden wir diskutieren, wie NER über ein Java-Programm unter Verwendung der OpenNLP-Bibliothek ausgeführt wird.
Named Entity Recognition mit offenem NLP
Um verschiedene NER-Aufgaben auszuführen, verwendet OpenNLP verschiedene vordefinierte Modelle, nämlich en-nerdate.bn, en-ner-location.bin, en-ner-organisation.bin, en-ner-person.bin und en-ner-time. Behälter. Alle diese Dateien sind vordefinierte Modelle, die darauf trainiert sind, die jeweiligen Entitäten in einem bestimmten Rohtext zu erkennen.
Das opennlp.tools.namefindDas Paket enthält die Klassen und Schnittstellen, die zur Ausführung der NER-Aufgabe verwendet werden. Um eine NER-Aufgabe mit der OpenNLP-Bibliothek auszuführen, müssen Sie -
Laden Sie das entsprechende Modell mit dem TokenNameFinderModel Klasse.
Instanziieren Sie die NameFinder Klasse.
Finde die Namen und drucke sie aus.
Im Folgenden finden Sie die Schritte zum Schreiben eines Programms, das die Namensentitäten aus einem bestimmten Rohtext erkennt.
Schritt 1: Laden des Modells
Das Modell zur Satzerkennung wird durch die genannte Klasse dargestellt TokenNameFinderModel, die zum Paket gehört opennlp.tools.namefind.
So laden Sie ein NER-Modell:
Erstelle ein InputStream Objekt des Modells (Instanziieren Sie den FileInputStream und übergeben Sie den Pfad des entsprechenden NER-Modells im String-Format an seinen Konstruktor).
Instanziieren Sie die TokenNameFinderModel Klasse und bestehen die InputStream (Objekt) des Modells als Parameter für seinen Konstruktor, wie im folgenden Codeblock gezeigt.
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
Schritt 2: Instanziieren der NameFinderME-Klasse
Das NameFinderME Klasse des Pakets opennlp.tools.namefindenthält Methoden zum Ausführen der NER-Aufgaben. Diese Klasse verwendet das Maximum-Entropy-Modell, um die benannten Entitäten im angegebenen Rohtext zu finden.
Instanziieren Sie diese Klasse und übergeben Sie das im vorherigen Schritt erstellte Modellobjekt wie unten gezeigt -
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
Schritt 3: Finden der Namen im Satz
Das find() Methode der NameFinderMEKlasse wird verwendet, um die Namen in dem an sie übergebenen Rohtext zu erkennen. Diese Methode akzeptiert eine String-Variable als Parameter.
Rufen Sie diese Methode auf, indem Sie das String-Format des Satzes an diese Methode übergeben.
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
Schritt 4: Drucken der Spannweiten der Namen im Satz
Das find() Methode der NameFinderMEKlasse gibt ein Array von Objekten vom Typ Span zurück. Die Klasse namens Span of theopennlp.tools.util Paket wird verwendet, um die zu speichern start und end Ganzzahl von Mengen.
Sie können die vom find() Methode im Span-Array und drucken Sie sie aus, wie im folgenden Codeblock gezeigt.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
Es folgt das Programm, das den angegebenen Satz liest und die Spannweiten der Namen der darin enthaltenen Personen erkennt. Speichern Sie dieses Programm in einer Datei mit dem NamenNameFinderME_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());
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:
javac NameFinderME_Example.java
java NameFinderME_Example
Bei der Ausführung liest das obige Programm den angegebenen String (Rohtext), erkennt die Namen der Personen darin und zeigt ihre Positionen (Bereiche) an, wie unten gezeigt.
[0..1) person
[2..3) person
Namen zusammen mit ihren Positionen
Das substring() Methode der String-Klasse akzeptiert die begin und die end offsetsund gibt die entsprechende Zeichenfolge zurück. Mit dieser Methode können wir die Namen und ihre Bereiche (Positionen) zusammen drucken, wie im folgenden Codeblock gezeigt.
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
Das folgende Programm erkennt die Namen aus dem angegebenen Rohtext und zeigt sie zusammen mit ihren Positionen an. Speichern Sie dieses Programm in einer Datei mit dem NamenNameFinderSentences.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()]);
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:
javac NameFinderSentences.java
java NameFinderSentences
Bei der Ausführung liest das obige Programm den angegebenen String (Rohtext), erkennt die Namen der Personen darin und zeigt ihre Positionen (Bereiche) wie unten gezeigt an.
[0..1) person Mike
Suchen der Namen des Standorts
Durch Laden verschiedener Modelle können Sie verschiedene benannte Entitäten erkennen. Es folgt ein Java-Programm, das das lädten-ner-location.binmodelliert und erkennt die Ortsnamen im angegebenen Satz. Speichern Sie dieses Programm in einer Datei mit dem NamenLocationFinder.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()]);
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:
javac LocationFinder.java
java LocationFinder
Bei der Ausführung liest das obige Programm den angegebenen String (Rohtext), erkennt die Namen der Personen darin und zeigt ihre Positionen (Bereiche) an, wie unten gezeigt.
[4..5) location Hyderabad
NameFinder Wahrscheinlichkeit
Das probs()Methode der NameFinderME Klasse wird verwendet, um die Wahrscheinlichkeiten der zuletzt decodierten Sequenz zu erhalten.
double[] probs = nameFinder.probs();
Es folgt das Programm zum Drucken der Wahrscheinlichkeiten. Speichern Sie dieses Programm in einer Datei mit dem NamenTokenizerMEProbs.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]);
}
}
Kompilieren Sie die gespeicherte Java-Datei und führen Sie sie an der Eingabeaufforderung mit den folgenden Befehlen aus:
javac TokenizerMEProbs.java
java TokenizerMEProbs
Bei der Ausführung liest das obige Programm den angegebenen String, markiert die Sätze und druckt sie aus. Außerdem werden die Wahrscheinlichkeiten der zuletzt decodierten Sequenz zurückgegeben, wie unten gezeigt.
[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