Процесс поиска имен, людей, мест и других объектов из заданного текста известен как N-N Entity R ecognition (NER). В этой главе мы обсудим, как выполнить NER через программу Java с использованием библиотеки OpenNLP.
Распознавание именованных объектов с использованием открытого NLP
Для выполнения различных задач NER OpenNLP использует различные предопределенные модели, а именно: en-nerdate.bn, en-ner-location.bin, en-ner-organization.bin, en-ner-person.bin и en-ner-time. бен. Все эти файлы являются предопределенными моделями, которые обучены обнаруживать соответствующие объекты в заданном необработанном тексте.
Пакет opennlp.tools.namefind содержит классы и интерфейсы, которые используются для выполнения задачи NER. Для выполнения задачи NER с использованием библиотеки OpenNLP вам необходимо:
-
Загрузите соответствующую модель, используя класс TokenNameFinderModel .
-
Создайте экземпляр класса NameFinder .
-
Найдите имена и напечатайте их.
Загрузите соответствующую модель, используя класс TokenNameFinderModel .
Создайте экземпляр класса NameFinder .
Найдите имена и напечатайте их.
Ниже приведены шаги, которые необходимо выполнить для написания программы, которая обнаруживает имена сущностей из заданного необработанного текста.
Шаг 1: Загрузка модели
Модель для определения предложения представлена классом с именем TokenNameFinderModel , который принадлежит пакету opennlp.tools.namefind .
Чтобы загрузить модель NER —
-
Создайте объект InputStream модели (создайте экземпляр FileInputStream и передайте путь соответствующей модели NER в формате String ее конструктору).
-
Создайте экземпляр класса TokenNameFinderModel и передайте InputStream (объект) модели в качестве параметра ее конструктору, как показано в следующем блоке кода.
Создайте объект InputStream модели (создайте экземпляр FileInputStream и передайте путь соответствующей модели NER в формате String ее конструктору).
Создайте экземпляр класса 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 () класса NameFinderME возвращает массив объектов типа Span. Класс с именем Span пакета opennlp.tools.util используется для хранения начального и конечного целого числа наборов.
Вы можете сохранить диапазоны, возвращенные методом find (), в массиве Span и распечатать их, как показано в следующем блоке кода.
//Printing the sentences and their spans of a sentence for (Span span : spans) System.out.println(paragraph.substring(span);
Пример NER
Ниже приводится программа, которая читает данное предложение и распознает промежутки имен людей в нем. Сохраните эту программу в файле с именем 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 принимает смещения начала и конца и возвращает соответствующую строку. Мы можем использовать этот метод для печати имен и их интервалов (позиций), как показано в следующем блоке кода.
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 используется для получения вероятностей последней декодированной последовательности.
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
При выполнении вышеупомянутая программа читает данную строку, маркирует предложения и печатает их. Кроме того, он также возвращает вероятности последней декодированной последовательности, как показано ниже.