При обработке естественного языка решение о начале и конце предложений является одной из проблем, требующих решения. Этот процесс известен как S entence Boundary D isambiguation (SBD) или просто разрыв предложения.
Методы, которые мы используем для обнаружения предложений в данном тексте, зависят от языка текста.
Обнаружение предложения с использованием Java
Мы можем обнаружить предложения в данном тексте на языке Java, используя регулярные выражения и набор простых правил.
Например, давайте предположим, что точка, знак вопроса или восклицательный знак заканчивают предложение в данном тексте, а затем мы можем разделить предложение с помощью метода split () класса String . Здесь мы должны передать регулярное выражение в формате String.
Ниже приводится программа, которая определяет предложения в данном тексте с использованием регулярных выражений Java (метод split) . Сохраните эту программу в файле с именем 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 () этого класса.
Загрузите модель en-sent.bin, используя класс SentenceModel
Создание экземпляра класса SentenceDetectorME .
Определите предложения, используя метод sentDetect () этого класса.
Ниже приведены шаги, которые необходимо выполнить, чтобы написать программу, которая обнаружит предложения из заданного необработанного текста.
Шаг 1: Загрузка модели
Модель для определения предложения представлена классом с именем SentenceModel , который принадлежит пакету opennlp.tools.sentdetect .
Чтобы загрузить модель определения предложения —
-
Создайте объект InputStream модели (создайте экземпляр FileInputStream и передайте путь модели в формате String ее конструктору).
-
Создайте экземпляр класса SentenceModel и передайте InputStream (объект) модели в качестве параметра ее конструктору, как показано в следующем блоке кода:
Создайте объект InputStream модели (создайте экземпляр FileInputStream и передайте путь модели в формате String ее конструктору).
Создайте экземпляр класса 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);
пример
Ниже приводится программа, которая обнаруживает предложения в заданном необработанном тексте. Сохраните эту программу в файле с именем 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 .
Ниже приведены шаги, которые необходимо выполнить, чтобы написать программу, которая определяет позиции предложений из заданного необработанного текста.
Шаг 1: Загрузка модели
Модель для определения предложения представлена классом с именем SentenceModel , который принадлежит пакету opennlp.tools.sentdetect .
Чтобы загрузить модель определения предложения —
-
Создайте объект InputStream модели (создайте экземпляр FileInputStream и передайте путь модели в формате String ее конструктору).
-
Создайте экземпляр класса SentenceModel и передайте InputStream (объект) модели в качестве параметра ее конструктору, как показано в следующем блоке кода.
Создайте объект InputStream модели (создайте экземпляр FileInputStream и передайте путь модели в формате String ее конструктору).
Создайте экземпляр класса 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 возвращает массив объектов типа Span . Класс с именем Span пакета opennlp.tools.util используется для хранения начального и конечного целого числа наборов.
Вы можете сохранить диапазоны, возвращенные методом sentPosDetect (), в массиве Span и распечатать их, как показано в следующем блоке кода.
//Printing the sentences and their spans of a sentence for (Span span : spans) System.out.println(paragraph.substring(span);
пример
Ниже приводится программа, которая обнаруживает предложения в заданном необработанном тексте. Сохраните эту программу в файле с именем 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 принимает смещения начала и конца и возвращает соответствующую строку. Мы можем использовать этот метод для печати предложений и их интервалов (позиций), как показано в следующем блоке кода.
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 возвращает вероятности, связанные с самыми последними вызовами метода 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 (), как показано ниже.