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