OpenNLP - Câu Chunking

Chunking một câu đề cập đến việc phá vỡ / chia một câu thành các phần của từ như nhóm từ và nhóm động từ.

Chunking một câu bằng OpenNLP

Để phát hiện các câu, OpenNLP sử dụng một mô hình, một tệp có tên en-chunker.bin. Đây là một mô hình được xác định trước, được đào tạo để chia nhỏ các câu trong văn bản thô nhất định.

Các opennlp.tools.chunker gói chứa các lớp và giao diện được sử dụng để tìm chú thích cú pháp không đệ quy, chẳng hạn như các khối cụm danh từ.

Bạn có thể phân đoạn một câu bằng phương pháp chunk() sau đó ChunkerMElớp học. Phương pháp này chấp nhận mã thông báo của một câu và thẻ POS làm tham số. Do đó, trước khi bắt đầu quá trình phân khúc, trước hết bạn cần Tokenize câu đó và tạo các thẻ POS các phần của nó.

Để phân đoạn một câu bằng thư viện OpenNLP, bạn cần phải -

  • Mã hóa câu.

  • Tạo thẻ POS cho nó.

  • Tải en-chunker.bin mô hình sử dụng ChunkerModel lớp học

  • Khởi tạo ChunkerME lớp học.

  • Chunk các câu bằng cách sử dụng chunk() phương thức của lớp này.

Sau đây là các bước cần làm để viết một chương trình phân đoạn các câu từ văn bản thô đã cho.

Bước 1: Mã hóa câu

Mã hóa các câu bằng cách sử dụng tokenize() phương pháp của whitespaceTokenizer lớp, như được hiển thị trong khối mã sau đây.

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

Bước 2: Tạo thẻ POS

Tạo các thẻ POS của câu bằng cách sử dụng tag() phương pháp của POSTaggerME lớp, như được hiển thị trong khối mã sau đây.

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

Bước 3: Tải mô hình

Mô hình phân đoạn một câu được đại diện bởi lớp có tên ChunkerModel, thuộc về gói opennlp.tools.chunker.

Để tải mô hình phát hiện câu -

  • Tạo ra một InputStream đối tượng của mô hình (Khởi tạo FileInputStream và chuyển đường dẫn của mô hình ở định dạng Chuỗi đến phương thức khởi tạo của nó).

  • Khởi tạo ChunkerModel lớp và vượt qua InputStream (đối tượng) của mô hình như một tham số cho phương thức khởi tạo của nó, như được hiển thị trong khối mã sau:

//Loading the chunker model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-chunker.bin"); 
ChunkerModel chunkerModel = new ChunkerModel(inputStream);

Bước 4: Khởi tạo lớp chunkerME

Các chunkerME lớp của gói opennlp.tools.chunkerchứa các phương thức để phân đoạn các câu. Đây là một khối dựa trên entropy cực đại.

Khởi tạo lớp này và chuyển đối tượng mô hình đã tạo ở bước trước.

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

Bước 5: Cắt câu

Các chunk() phương pháp của ChunkerMElớp được sử dụng để phân đoạn các câu trong văn bản thô được chuyển cho nó. Phương thức này chấp nhận hai mảng Chuỗi đại diện cho mã thông báo và thẻ, làm tham số.

Gọi phương thức này bằng cách chuyển mảng mã thông báo và mảng thẻ đã tạo ở các bước trước dưới dạng tham số.

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

Example

Sau đây là chương trình để phân đoạn các câu trong văn bản thô đã cho. Lưu chương trình này trong một tệp có tênChunkerExample.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);         
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng lệnh sau:

javac ChunkerExample.java 
java ChunkerExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho và chia nhỏ các câu trong đó, và hiển thị chúng như hình dưới đây.

Loading POS Tagger model ... done (1.040s) 
B-NP 
I-NP 
B-VP 
I-VP

Phát hiện vị trí của mã thông báo

Chúng tôi cũng có thể phát hiện vị trí hoặc nhịp của các khối bằng cách sử dụng chunkAsSpans() phương pháp của ChunkerMElớp học. Phương thức này trả về một mảng các đối tượng có kiểu Span. Lớp có tên Span of theopennlp.tools.util gói được sử dụng để lưu trữ startend số nguyên của các bộ.

Bạn có thể lưu trữ các nhịp được trả về bởi chunkAsSpans() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

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

Example

Sau đây là chương trình phát hiện các câu trong văn bản thô nhất định. Lưu chương trình này trong một tệp có tênChunkerSpansEample.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());  
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac ChunkerSpansEample.java 
java ChunkerSpansEample

Khi thực thi, chương trình trên đọc Chuỗi đã cho và các khoảng của các phần trong đó, và hiển thị kết quả sau:

Loading POS Tagger model ... done (1.059s) 
[0..2) NP 
[2..4) VP

Phát hiện xác suất Chunker

Các probs() phương pháp của ChunkerME lớp trả về xác suất của chuỗi được giải mã cuối cùng.

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

Sau đây là chương trình để in xác suất của chuỗi được giải mã cuối cùng bằng chunker. Lưu chương trình này trong một tệp có tênChunkerProbsExample.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]);       
   }    
}

Biên dịch và thực thi tệp Java đã lưu từ Dấu nhắc lệnh bằng các lệnh sau:

javac ChunkerProbsExample.java 
java ChunkerProbsExample

Khi thực thi, chương trình trên đọc Chuỗi đã cho, phân đoạn nó và in ra xác suất của chuỗi được giải mã cuối cùng.

0.9592746040797778 
0.6883933131241501 
0.8830563473996004 
0.8951150529746051