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