Учебники

OpenNLP — Признание названных лиц

Процесс поиска имен, людей, мест и других объектов из заданного текста известен как 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

При выполнении вышеупомянутая программа читает данную строку, маркирует предложения и печатает их. Кроме того, он также возвращает вероятности последней декодированной последовательности, как показано ниже.