OpenNLP - ประโยคแบ่งส่วน

การแบ่งประโยคหมายถึงการแบ่ง / แบ่งประโยคออกเป็นส่วน ๆ ของคำเช่นกลุ่มคำและกลุ่มคำกริยา

การแบ่งประโยคโดยใช้ OpenNLP

ในการตรวจจับประโยค OpenNLP ใช้โมเดลไฟล์ชื่อ en-chunker.bin. นี่คือรูปแบบที่กำหนดไว้ล่วงหน้าซึ่งได้รับการฝึกฝนให้แยกประโยคในข้อความดิบที่กำหนด

opennlp.tools.chunker แพคเกจประกอบด้วยคลาสและอินเทอร์เฟซที่ใช้เพื่อค้นหาคำอธิบายประกอบวากยสัมพันธ์ที่ไม่เรียกซ้ำเช่นกลุ่มวลีคำนาม

คุณสามารถแบ่งประโยคโดยใช้วิธีการ chunk() ของ ChunkerMEชั้นเรียน วิธีนี้ยอมรับโทเค็นของประโยคและแท็ก POS เป็นพารามิเตอร์ ดังนั้นก่อนที่จะเริ่มกระบวนการแยกชิ้นส่วนก่อนอื่นคุณต้องสร้างประโยคให้เป็นโทเค็นและสร้างแท็ก POS ของส่วนนั้น

ในการแยกประโยคโดยใช้ไลบรารี OpenNLP คุณต้อง -

  • Tokenize ประโยค

  • สร้างแท็ก POS สำหรับมัน

  • โหลดไฟล์ en-chunker.bin แบบจำลองโดยใช้ ChunkerModel ชั้นเรียน

  • เริ่มต้นไฟล์ ChunkerME ชั้นเรียน

  • แยกประโยคโดยใช้ chunk() วิธีการของคลาสนี้

ต่อไปนี้เป็นขั้นตอนที่ต้องปฏิบัติตามเพื่อเขียนโปรแกรมเพื่อเรียงประโยคจากข้อความดิบที่กำหนด

ขั้นตอนที่ 1: การแปลงประโยค

Tokenize ประโยคโดยใช้ tokenize() วิธีการของ whitespaceTokenizer คลาสดังที่แสดงในบล็อกรหัสต่อไปนี้

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

ขั้นตอนที่ 2: การสร้างแท็ก POS

สร้างแท็ก POS ของประโยคโดยใช้ tag() วิธีการของ POSTaggerME คลาสดังที่แสดงในบล็อกรหัสต่อไปนี้

//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 และส่งเส้นทางของโมเดลในรูปแบบ String ไปยังตัวสร้าง)

  • เริ่มต้นไฟล์ 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() วิธีการของ ChunkerMEคลาสใช้เพื่อแยกประโยคในข้อความดิบที่ส่งผ่านไป วิธีนี้ยอมรับอาร์เรย์สตริงสองรายการที่แสดงโทเค็นและแท็กเป็นพารามิเตอร์

เรียกใช้เมธอดนี้โดยส่งอาร์เรย์โทเค็นและอาร์เรย์แท็กที่สร้างในขั้นตอนก่อนหน้าเป็นพารามิเตอร์

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

ในการดำเนินการโปรแกรมด้านบนจะอ่าน String ที่กำหนดและแยกประโยคในนั้นและแสดงดังที่แสดงด้านล่าง

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

Chunker Probability Detection

probs() วิธีการของ ChunkerME คลาสส่งคืนความน่าจะเป็นของลำดับที่ถอดรหัสล่าสุด

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