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 
廣告
© . All rights reserved.