OpenNLP - 分句



分句是指将句子分解成单词组和动词组等单词部分。

使用 OpenNLP 进行分句

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

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

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

要使用 OpenNLP 库进行分句,您需要:

  • 对句子进行分词。

  • 生成句子的词性标签。

  • 使用 **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:生成词性标签

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

//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 类

**opennlp.tools.chunker** 包中的 **chunkerME** 类包含用于分句的方法。这是一个基于最大熵的分句器。

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

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

步骤 5:分句

**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 类用于存储集合的 **start** 和 **end** 整数。

您可以将 **chunkAsSpans()** 方法返回的范围存储在 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 
广告