OpenNLP - Распознавание именованных сущностей
Процесс поиска имен, людей, мест и других сущностей в заданном тексте известен как NАмед Eсущность Rпознание (NER). В этой главе мы обсудим, как выполнить NER через программу Java с использованием библиотеки OpenNLP.
Распознавание именованных сущностей с использованием открытого NLP
Для выполнения различных задач NER OpenNLP использует различные предопределенные модели, а именно en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin и en-time. bin. Все эти файлы являются предопределенными моделями, которые обучены обнаруживать соответствующие объекты в заданном необработанном тексте.
В opennlp.tools.namefindПакет содержит классы и интерфейсы, которые используются для выполнения задачи NER. Чтобы выполнить задачу NER с использованием библиотеки OpenNLP, вам необходимо:
Загрузите соответствующую модель, используя TokenNameFinderModel класс.
Создайте экземпляр NameFinder класс.
Найдите имена и распечатайте их.
Ниже приведены шаги, которые необходимо выполнить, чтобы написать программу, которая обнаруживает объекты имени из заданного необработанного текста.
Шаг 1. Загрузка модели
Модель обнаружения предложения представлена классом с именем TokenNameFinderModel, который принадлежит пакету opennlp.tools.namefind.
Чтобы загрузить модель NER -
Создать InputStream объект модели (создайте экземпляр FileInputStream и передайте путь к соответствующей модели NER в строковом формате ее конструктору).
Создайте экземпляр TokenNameFinderModel класс и пройти InputStream (объект) модели в качестве параметра ее конструктора, как показано в следующем блоке кода.
//Loading the NER-person model
InputStream inputStreamNameFinder = new FileInputStream(".../en-nerperson.bin");
TokenNameFinderModel model = new TokenNameFinderModel(inputStreamNameFinder);
Шаг 2. Создание экземпляра класса NameFinderME
В NameFinderME класс пакета opennlp.tools.namefindсодержит методы для выполнения задач NER. Этот класс использует модель максимальной энтропии для поиска названных сущностей в заданном исходном тексте.
Создайте экземпляр этого класса и передайте объект модели, созданный на предыдущем шаге, как показано ниже -
//Instantiating the NameFinderME class
NameFinderME nameFinder = new NameFinderME(model);
Шаг 3. Найдите имена в предложении
В find() метод NameFinderMEКласс используется для обнаружения имен в переданном ему необработанном тексте. Этот метод принимает в качестве параметра строковую переменную.
Вызовите этот метод, передав ему строковый формат предложения.
//Finding the names in the sentence
Span nameSpans[] = nameFinder.find(sentence);
Шаг 4. Распечатайте интервалы имен в предложении
В find() метод NameFinderMEclass возвращает массив объектов типа Span. Класс с именем Span of theopennlp.tools.util пакет используется для хранения start и end целое число множеств.
Вы можете сохранить пролеты, возвращенные find() в массиве Span и распечатайте их, как показано в следующем блоке кода.
//Printing the sentences and their spans of a sentence
for (Span span : spans)
System.out.println(paragraph.substring(span);
NER Example
Ниже приводится программа, которая читает данное предложение и распознает диапазон имен лиц в нем. Сохраните эту программу в файл с названиемNameFinderME_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());
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:
javac NameFinderME_Example.java
java NameFinderME_Example
При выполнении вышеупомянутая программа считывает данную строку (необработанный текст), определяет имена людей в ней и отображает их позиции (промежутки), как показано ниже.
[0..1) person
[2..3) person
Имена вместе с их должностями
В substring() метод класса String принимает begin и end offsetsи возвращает соответствующую строку. Мы можем использовать этот метод для печати имен и их промежутков (позиций) вместе, как показано в следующем блоке кода.
for(Span s: nameSpans)
System.out.println(s.toString()+" "+tokens[s.getStart()]);
Ниже приводится программа для определения имен из заданного необработанного текста и отображения их вместе с их позициями. Сохраните эту программу в файл с названиемNameFinderSentences.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()]);
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:
javac NameFinderSentences.java
java NameFinderSentences
При выполнении вышеуказанная программа считывает данную строку (необработанный текст), определяет имена людей в ней и отображает их позиции (интервалы), как показано ниже.
[0..1) person Mike
Поиск названий местоположения
Загружая различные модели, вы можете обнаруживать различные именованные объекты. Ниже приводится программа на Java, которая загружаетen-ner-location.binмодель и определяет названия мест в данном предложении. Сохраните эту программу в файл с названиемLocationFinder.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()]);
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:
javac LocationFinder.java
java LocationFinder
При выполнении вышеупомянутая программа считывает данную строку (необработанный текст), определяет имена людей в ней и отображает их позиции (промежутки), как показано ниже.
[4..5) location Hyderabad
NameFinder Вероятность
В probs()метод NameFinderME class используется для получения вероятностей последней декодированной последовательности.
double[] probs = nameFinder.probs();
Ниже приводится программа для печати вероятностей. Сохраните эту программу в файл с названиемTokenizerMEProbs.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]);
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:
javac TokenizerMEProbs.java
java TokenizerMEProbs
При выполнении указанная выше программа считывает заданную строку, маркирует предложения и печатает их. Кроме того, он также возвращает вероятности последней декодированной последовательности, как показано ниже.
[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