OpenNLP - Rozpoznawanie nazwanych jednostek
Proces znajdowania nazwisk, osób, miejsc i innych bytów z danego tekstu jest znany jako Named Entity Rpoznanie (NER). W tym rozdziale omówimy, jak przeprowadzić NER przez program Java z wykorzystaniem biblioteki OpenNLP.
Rozpoznawanie nazwanych jednostek przy użyciu otwartego NLP
Aby wykonać różne zadania NER, OpenNLP używa różnych predefiniowanych modeli, a mianowicie en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin i en-ner-time. kosz. Wszystkie te pliki są predefiniowanymi modelami, które są uczone do wykrywania odpowiednich jednostek w danym surowym tekście.
Plik opennlp.tools.namefindpakiet zawiera klasy i interfejsy, które są używane do wykonywania zadania NER. Aby wykonać zadanie NER przy użyciu biblioteki OpenNLP, musisz -
Załaduj odpowiedni model za pomocą pliku TokenNameFinderModel klasa.
Utwórz wystąpienie NameFinder klasa.
Znajdź nazwiska i wydrukuj je.
Poniżej przedstawiono kroki, które należy wykonać, aby napisać program, który wykrywa encje nazwy z danego surowego tekstu.
Krok 1: Ładowanie modelu
Model wykrywania zdań jest reprezentowany przez nazwaną klasę TokenNameFinderModel, który należy do pakietu opennlp.tools.namefind.
Aby załadować model NER -
Stworzyć InputStream obiekt modelu (Utwórz wystąpienie FileInputStream i przekaż ścieżkę odpowiedniego modelu NER w formacie String do jego konstruktora).
Utwórz wystąpienie TokenNameFinderModel klasę i zdaj InputStream (obiekt) modelu jako parametr jego konstruktora, jak pokazano w poniższym bloku kodu.
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
Krok 2: Utworzenie wystąpienia klasy NameFinderME
Plik NameFinderME klasa pakietu opennlp.tools.namefindzawiera metody wykonywania zadań NER. Ta klasa używa modelu Maximum Entropy, aby znaleźć nazwane jednostki w danym surowym tekście.
Utwórz wystąpienie tej klasy i przekaż obiekt modelu utworzony w poprzednim kroku, jak pokazano poniżej -
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
Krok 3: Znalezienie nazwisk w zdaniu
Plik find() metoda NameFinderMEklasa służy do wykrywania nazw w przekazanym do niej nieprzetworzonym tekście. Ta metoda akceptuje zmienną typu String jako parametr.
Wywołaj tę metodę, przekazując format String zdania do tej metody.
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
Krok 4: Drukowanie rozpiętości nazw w zdaniu
Plik find() metoda NameFinderMEclass zwraca tablicę obiektów typu Span. Klasa o nazwie Span of theopennlp.tools.util pakiet służy do przechowywania pliku start i end liczba całkowita zbiorów.
Możesz przechowywać rozpiętości zwrócone przez find() w tablicy Span i wydrukuj je, jak pokazano w poniższym bloku kodu.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
Poniżej znajduje się program, który odczytuje podane zdanie i rozpoznaje rozpiętości nazwisk znajdujących się w nim osób. Zapisz ten program w pliku o nazwieNameFinderME_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());
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac NameFinderME_Example.java
java NameFinderME_Example
Podczas wykonywania powyższy program odczytuje podany String (surowy tekst), wykrywa nazwiska osób w nim i wyświetla ich pozycje (rozpiętości), jak pokazano poniżej.
[0..1) person
[2..3) person
Nazwy wraz z ich pozycjami
Plik substring() metoda klasy String akceptuje metodę begin i end offsetsi zwraca odpowiedni ciąg. Możemy użyć tej metody do wydrukowania nazw i ich rozpiętości (pozycji) razem, jak pokazano w poniższym bloku kodu.
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
Poniżej znajduje się program do wykrywania nazw z podanego surowego tekstu i wyświetlania ich wraz z ich pozycjami. Zapisz ten program w pliku o nazwieNameFinderSentences.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()]);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac NameFinderSentences.java
java NameFinderSentences
Podczas wykonywania powyższy program odczytuje podany String (surowy tekst), wykrywa nazwiska osób w nim i wyświetla ich pozycje (przęsła), jak pokazano poniżej.
[0..1) person Mike
Znajdowanie nazw lokalizacji
Ładując różne modele, możesz wykryć różne nazwane jednostki. Poniżej znajduje się program Java, który ładuje pliken-ner-location.binmodel i wykrywa nazwy lokalizacji w zadanym zdaniu. Zapisz ten program w pliku o nazwieLocationFinder.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()]);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac LocationFinder.java
java LocationFinder
Podczas wykonywania powyższy program odczytuje podany String (surowy tekst), wykrywa nazwiska osób w nim i wyświetla ich pozycje (rozpiętości), jak pokazano poniżej.
[4..5) location Hyderabad
Prawdopodobieństwo narzędzia NameFinder
Plik probs()metoda NameFinderME klasa służy do uzyskania prawdopodobieństwa ostatniej zdekodowanej sekwencji.
double[] probs = nameFinder.probs();
Poniżej znajduje się program do drukowania prawdopodobieństw. Zapisz ten program w pliku o nazwieTokenizerMEProbs.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]);
}
}
Skompiluj i uruchom zapisany plik Java z wiersza polecenia, używając następujących poleceń -
javac TokenizerMEProbs.java
java TokenizerMEProbs
Podczas wykonywania powyższy program odczytuje podany String, tokenizuje zdania i drukuje je. Ponadto zwraca również prawdopodobieństwa ostatniej zdekodowanej sekwencji, jak pokazano poniżej.
[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