OpenNLP - фрагменты предложений
Разделение предложений на части относится к разбиению / разделению предложения на части слов, такие как группы слов и группы глаголов.
Разделение предложения с использованием OpenNLP
Для обнаружения предложений OpenNLP использует модель, файл с именем en-chunker.bin. Это предопределенная модель, которая обучена разбивать предложения в заданном исходном тексте.
В opennlp.tools.chunker Пакет содержит классы и интерфейсы, которые используются для поиска нерекурсивных синтаксических аннотаций, таких как фрагменты именных фраз.
Вы можете разбить предложение, используя метод chunk() из ChunkerMEкласс. Этот метод принимает в качестве параметров токены предложения и теги POS. Поэтому, прежде чем начать процесс разбиения на фрагменты, в первую очередь вам необходимо токенизировать предложение и сгенерировать его POS-теги.
Чтобы разбить предложение с использованием библиотеки OpenNLP, вам необходимо:
Обозначьте предложение.
Создайте для него теги POS.
Загрузите en-chunker.bin модель с использованием ChunkerModel класс
Создайте экземпляр ChunkerME класс.
Разделите предложения, используя chunk() метод этого класса.
Ниже приведены шаги, которые необходимо выполнить, чтобы написать программу для фрагментов предложений из заданного необработанного текста.
Шаг 1. Обозначение предложения
Обозначьте предложения, используя tokenize() метод whitespaceTokenizer class, как показано в следующем блоке кода.
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
Шаг 2: Создание тегов POS
Создайте теги POS предложения, используя tag() метод POSTaggerME class, как показано в следующем блоке кода.
//Generating the POS tags
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
Шаг 3: загрузка модели
Модель разбиения предложения на части представлена классом с именем ChunkerModel, который принадлежит пакету opennlp.tools.chunker.
Чтобы загрузить модель обнаружения предложений -
Создать InputStream объект модели (создайте экземпляр FileInputStream и передайте путь модели в строковом формате ее конструктору).
Создайте экземпляр ChunkerModel класс и пройти InputStream (объект) модели в качестве параметра ее конструктора, как показано в следующем блоке кода -
//Loading the chunker model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel chunkerModel = new ChunkerModel(inputStream);
Шаг 4. Создание экземпляра класса chunkerME
В chunkerME класс пакета opennlp.tools.chunkerсодержит методы разбиения предложений на части. Это блокировка на основе максимальной энтропии.
Создайте экземпляр этого класса и передайте объект модели, созданный на предыдущем шаге.
//Instantiate the ChunkerME class
ChunkerME chunkerME = new ChunkerME(chunkerModel);
Шаг 5: разбейте предложение
В chunk() метод ChunkerMEclass используется для фрагментации предложений в переданном ему необработанном тексте. Этот метод принимает в качестве параметров два массива String, представляющих токены и теги.
Вызовите этот метод, передав в качестве параметров массив токенов и массив тегов, созданные на предыдущих шагах.
//Generating the chunks
String result[] = chunkerME.chunk(tokens, tags);
Example
Ниже приводится программа для разбивки предложений в данном исходном тексте. Сохраните эту программу в файл с названиемChunkerExample.java.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerModel;
import opennlp.tools.cmdline.postag.POSModelLoader;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class ChunkerExample{
public static void main(String args[]) throws IOException {
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating the POS tags
//Load the parts of speech model
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
//Loading the chunker model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel chunkerModel = new ChunkerModel(inputStream);
//Instantiate the ChunkerME class
ChunkerME chunkerME = new ChunkerME(chunkerModel);
//Generating the chunks
String result[] = chunkerME.chunk(tokens, tags);
for (String s : result)
System.out.println(s);
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующую команду -
javac ChunkerExample.java
java ChunkerExample
При выполнении вышеупомянутая программа считывает данную строку, разбивает на части предложения в ней и отображает их, как показано ниже.
Loading POS Tagger model ... done (1.040s)
B-NP
I-NP
B-VP
I-VP
Определение позиций жетонов
Мы также можем определять позиции или промежутки фрагментов, используя chunkAsSpans() метод ChunkerMEкласс. Этот метод возвращает массив объектов типа Span. Класс с именем Span of theopennlp.tools.util пакет используется для хранения start и end целое число множеств.
Вы можете сохранить пролеты, возвращенные chunkAsSpans() в массиве Span и распечатайте их, как показано в следующем блоке кода.
//Generating the tagged chunk spans
Span[] span = chunkerME.chunkAsSpans(tokens, tags);
for (Span s : span)
System.out.println(s.toString());
Example
Ниже приводится программа, которая обнаруживает предложения в данном исходном тексте. Сохраните эту программу в файл с названиемChunkerSpansEample.java.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerModel;
import opennlp.tools.cmdline.postag.POSModelLoader;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.Span;
public class ChunkerSpansEample{
public static void main(String args[]) throws IOException {
//Load the parts of speech model
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
//Loading the chunker model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel chunkerModel = new ChunkerModel(inputStream);
ChunkerME chunkerME = new ChunkerME(chunkerModel);
//Generating the tagged chunk spans
Span[] span = chunkerME.chunkAsSpans(tokens, tags);
for (Span s : span)
System.out.println(s.toString());
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:
javac ChunkerSpansEample.java
java ChunkerSpansEample
При выполнении вышеупомянутая программа считывает данную строку и промежутки фрагментов в ней и отображает следующий вывод:
Loading POS Tagger model ... done (1.059s)
[0..2) NP
[2..4) VP
Обнаружение вероятности чанкера
В probs() метод ChunkerME class возвращает вероятности последней декодированной последовательности.
//Getting the probabilities of the last decoded sequence
double[] probs = chunkerME.probs();
Ниже приводится программа для вывода вероятностей последней декодированной последовательности chunker. Сохраните эту программу в файл с названиемChunkerProbsExample.java.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerModel;
import opennlp.tools.cmdline.postag.POSModelLoader;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class ChunkerProbsExample{
public static void main(String args[]) throws IOException {
//Load the parts of speech model
File file = new File("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModelLoader().load(file);
//Constructing the tagger
POSTaggerME tagger = new POSTaggerME(model);
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating tags from the tokens
String[] tags = tagger.tag(tokens);
//Loading the chunker model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-chunker.bin");
ChunkerModel cModel = new ChunkerModel(inputStream);
ChunkerME chunkerME = new ChunkerME(cModel);
//Generating the chunk tags
chunkerME.chunk(tokens, tags);
//Getting the probabilities of the last decoded sequence
double[] probs = chunkerME.probs();
for(int i = 0; i<probs.length; i++)
System.out.println(probs[i]);
}
}
Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды:
javac ChunkerProbsExample.java
java ChunkerProbsExample
При выполнении вышеупомянутая программа считывает данную строку, разбивает ее на части и печатает вероятности последней декодированной последовательности.
0.9592746040797778
0.6883933131241501
0.8830563473996004
0.8951150529746051