OpenNLP - 句子分块


句子分块是指将句子分解/分成单词的部分,例如单词组和动词组。

使用 OpenNLP 对句子进行分块

为了检测句子,OpenNLP 使用模型,即名为en-chunker.bin 的文件。这是一个预定义的模型,经过训练可以对给定原始文本中的句子进行分块。

opennlp.tools.chunker包包含用于查找非递归语法注释(例如名词短语块)的类和接口

您可以使用ChunkerME类的chunk()方法对句子进行分块。此方法接受句子的标记和 POS 标签作为参数。因此,在开始分块过程之前,首先需要对句子进行分词并生成其部分词性标签。

要使用 OpenNLP 库对句子进行分块,您需要 -

  • 对句子进行标记。

  • 为其生成 POS 标签。

  • 使用ChunkerModel类加载en-chunker.bin模型

  • 实例化ChunkerME类。

  • 使用此类的chunk()方法对句子进行分块。

以下是编写程序以从给定的原始文本中分块句子时应遵循的步骤。

第 1 步:对句子进行标记

使用whitespaceTokenizer类的tokenize()方法对句子进行分词,如以下代码块所示。

//Tokenizing the sentence 
String sentence = "Hi welcome to Tutorialspoint";       
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence);

第 2 步:生成 POS 标签

使用POSTaggerME类的tag()方法生成句子的 POS 标签,如以下代码块所示。

//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); 

第三步:加载模型

用于分块句子的模型由名为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 类

opennlp.tools.chunker包的chunkerME类包含对句子进行分块的方法。这是一个基于最大熵的分块器。

实例化此类并传递上一步中创建的模型对象。

//Instantiate the ChunkerME class 
ChunkerME chunkerME = new ChunkerME(chunkerModel); 

第五步:将句子分块

ChunkerME类的chunk ()方法用于对传递给它的原始文本中的句子进行分块。此方法接受两个表示标记和标签的字符串数组作为参数。

通过将前面步骤中创建的标记数组和标记数组作为参数传递来调用此方法。

//Generating the chunks 
String result[] = chunkerME.chunk(tokens, tags); 

例子

以下是对给定原始文本中的句子进行分块的程序。将此程序保存在名为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

检测代币的位置

我们还可以使用ChunkerME类的chunkAsSpans()方法来检测块的位置或跨度。此方法返回 Span 类型的对象数组。opennlp.tools.util包中名为 Span 的类用于存储集合的起始结束整数。

您可以将chunkAsSpans()方法返回的 Span 存储在 Span 数组中并打印它们,如以下代码块所示。

//Generating the tagged chunk spans 
Span[] span = chunkerME.chunkAsSpans(tokens, tags); 
       
for (Span s : span) 
   System.out.println(s.toString()); 

例子

以下是检测给定原始文本中的句子的程序。将此程序保存在名为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 

分块概率检测

ChunkerME类的probs ()方法返回最后解码序列的概率。

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

以下是打印分块器最后解码序列的概率的程序。将此程序保存在名为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