OpenNLP - обнаружение предложений

При обработке естественного языка определение начала и конца предложения является одной из проблем, требующих решения. Этот процесс известен какSпредложение Bграница Dмногозначность (SBD) или просто нарушение предложения.

Методы, которые мы используем для обнаружения предложений в данном тексте, зависят от языка текста.

Обнаружение предложений с использованием Java

Мы можем обнаружить предложения в данном тексте в Java, используя регулярные выражения и набор простых правил.

Например, предположим, что точка, вопросительный знак или восклицательный знак заканчивают предложение в данном тексте, тогда мы можем разделить предложение, используя split() метод Stringкласс. Здесь мы должны передать регулярное выражение в формате String.

Ниже приводится программа, которая определяет предложения в заданном тексте с использованием регулярных выражений Java. (split method). Сохраните эту программу в файл с названиемSentenceDetection_RE.java.

public class SentenceDetection_RE {  
   public static void main(String args[]){ 
     
      String sentence = " Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
     
      String simple = "[.?!]";      
      String[] splitString = (sentence.split(simple));     
      for (String string : splitString)   
         System.out.println(string);      
   } 
}

Скомпилируйте и выполните сохраненный файл java из командной строки, используя следующие команды.

javac SentenceDetection_RE.java 
java SentenceDetection_RE

При выполнении вышеуказанная программа создает PDF-документ, в котором отображается следующее сообщение.

Hi 
How are you 
Welcome to Tutorialspoint 
We provide free tutorials on various technologies

Обнаружение предложений с использованием OpenNLP

Для обнаружения предложений OpenNLP использует предопределенную модель, файл с именем en-sent.bin. Эта предопределенная модель обучена обнаруживать предложения в заданном необработанном тексте.

В opennlp.tools.sentdetect Пакет содержит классы и интерфейсы, которые используются для выполнения задачи обнаружения предложений.

Чтобы обнаружить предложение с использованием библиотеки OpenNLP, вам необходимо:

  • Загрузите en-sent.bin модель с использованием SentenceModel класс

  • Создайте экземпляр SentenceDetectorME класс.

  • Обнаруживайте предложения с помощью sentDetect() метод этого класса.

Ниже приведены шаги, которые необходимо выполнить, чтобы написать программу, которая обнаруживает предложения из заданного необработанного текста.

Шаг 1. Загрузка модели

Модель обнаружения предложения представлена ​​классом с именем SentenceModel, который принадлежит пакету opennlp.tools.sentdetect.

Чтобы загрузить модель обнаружения предложений -

  • Создать InputStream объект модели (создайте экземпляр FileInputStream и передайте путь модели в строковом формате ее конструктору).

  • Создайте экземпляр SentenceModel класс и пройти InputStream (объект) модели в качестве параметра для ее конструктора, как показано в следующем блоке кода -

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Шаг 2. Создание экземпляра класса SentenceDetectorME

В SentenceDetectorME класс пакета opennlp.tools.sentdetectсодержит методы для разделения необработанного текста на предложения. Этот класс использует модель максимальной энтропии для оценки символов конца предложения в строке, чтобы определить, обозначают ли они конец предложения.

Создайте экземпляр этого класса и передайте объект модели, созданный на предыдущем шаге, как показано ниже.

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Шаг 3. Определение предложения

В sentDetect() метод SentenceDetectorMEКласс используется для обнаружения предложений в переданном ему необработанном тексте. Этот метод принимает в качестве параметра строковую переменную.

Вызовите этот метод, передав ему строковый формат предложения.

//Detecting the sentence 
String sentences[] = detector.sentDetect(sentence);

Example

Ниже приводится программа, которая обнаруживает предложения в заданном необработанном тексте. Сохраните эту программу в файле с именемSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionME { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
    
      //Detecting the sentence
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);  
   } 
}

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:

javac SentenceDetectorME.java 
java SentenceDetectorME

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

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies

Определение позиций предложений

Мы также можем определить позиции предложений, используя метод sentPosDetect () объекта SentenceDetectorME class.

Ниже приведены шаги, которые необходимо выполнить, чтобы написать программу, которая определяет позиции предложений из данного исходного текста.

Шаг 1. Загрузка модели

Модель обнаружения предложения представлена ​​классом с именем SentenceModel, который принадлежит пакету opennlp.tools.sentdetect.

Чтобы загрузить модель обнаружения предложений -

  • Создать InputStream объект модели (создайте экземпляр FileInputStream и передайте путь модели в строковом формате ее конструктору).

  • Создайте экземпляр SentenceModel класс и пройти InputStream (объект) модели в качестве параметра ее конструктора, как показано в следующем блоке кода.

//Loading sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Шаг 2. Создание экземпляра класса SentenceDetectorME

В SentenceDetectorME класс пакета opennlp.tools.sentdetectсодержит методы для разделения необработанного текста на предложения. Этот класс использует модель максимальной энтропии для оценки символов конца предложения в строке, чтобы определить, обозначают ли они конец предложения.

Создайте экземпляр этого класса и передайте объект модели, созданный на предыдущем шаге.

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Шаг 3. Определение позиции предложения

В sentPosDetect() метод SentenceDetectorMEКласс используется для определения позиций предложений в переданном ему необработанном тексте. Этот метод принимает в качестве параметра строковую переменную.

Вызовите этот метод, передав строковый формат предложения в качестве параметра этому методу.

//Detecting the position of the sentences in the paragraph  
Span[] spans = detector.sentPosDetect(sentence);

Шаг 4. Распечатайте отрезки предложений

В sentPosDetect() метод SentenceDetectorME class возвращает массив объектов типа Span. Класс с именем Span of theopennlp.tools.util package используется для хранения начального и конечного целых чисел наборов.

Вы можете сохранить пролеты, возвращенные sentPosDetect() в массиве Span и распечатайте их, как показано в следующем блоке кода.

//Printing the sentences and their spans of a sentence 
for (Span span : spans)         
System.out.println(paragraph.substring(span);

Example

Ниже приводится программа, которая обнаруживает предложения в данном исходном тексте. Сохраните эту программу в файле с именемSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
  
import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span;

public class SentencePosDetection { 
  
   public static void main(String args[]) throws Exception { 
   
      String paragraph = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the raw text 
      Span spans[] = detector.sentPosDetect(paragraph); 
       
      //Printing the spans of the sentences in the paragraph 
      for (Span span : spans)         
         System.out.println(span);  
   } 
}

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:

javac SentencePosDetection.java 
java SentencePosDetection

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

[0..16) 
[17..43) 
[44..93)

Предложения вместе с их должностями

В substring() метод класса String принимает begin и end offsetsи возвращает соответствующую строку. Мы можем использовать этот метод для печати предложений и их промежутков (позиций) вместе, как показано в следующем блоке кода.

for (Span span : spans)         
   System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);

Ниже приводится программа для обнаружения предложений из заданного необработанного текста и отображения их вместе с их позициями. Сохраните эту программу в файл с именемSentencesAndPosDetection.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span; 
   
public class SentencesAndPosDetection { 
  
   public static void main(String args[]) throws Exception { 
     
      String sen = "Hi. How are you? Welcome to Tutorialspoint." 
         + " We provide free tutorials on various technologies"; 
      //Loading a sentence model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the paragraph  
      Span[] spans = detector.sentPosDetect(sen);  
      
      //Printing the sentences and their spans of a paragraph 
      for (Span span : spans)         
         System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);  
   } 
}

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:

javac SentencesAndPosDetection.java 
java SentencesAndPosDetection

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

Hi. How are you? [0..16) 
Welcome to Tutorialspoint. [17..43)  
We provide free tutorials on various technologies [44..93)

Обнаружение вероятности предложения

В getSentenceProbabilities() метод SentenceDetectorME class возвращает вероятности, связанные с самыми последними вызовами метода sentDetect ().

//Getting the probabilities of the last decoded sequence       
double[] probs = detector.getSentenceProbabilities();

Ниже приводится программа для печати вероятностей, связанных с вызовами метода sentDetect (). Сохраните эту программу в файл с названиемSentenceDetectionMEProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionMEProbs { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class
      SentenceDetectorME detector = new SentenceDetectorME(model);  
      
      //Detecting the sentence 
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);   
         
      //Getting the probabilities of the last decoded sequence       
      double[] probs = detector.getSentenceProbabilities(); 
       
      System.out.println("  "); 
       
      for(int i = 0; i<probs.length; i++) 
         System.out.println(probs[i]); 
   } 
}

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:

javac SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

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

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies 
   
0.9240246995179983 
0.9957680129995953 
1.0