OpenNLP - Phát hiện câu

Trong khi xử lý một ngôn ngữ tự nhiên, việc quyết định phần đầu và phần cuối của câu là một trong những vấn đề cần giải quyết. Quá trình này được gọi làSsự dụ dỗ Boundary Disambiguation (SBD) hoặc đơn giản là ngắt câu.

Các kỹ thuật chúng tôi sử dụng để phát hiện các câu trong văn bản đã cho, phụ thuộc vào ngôn ngữ của văn bản.

Phát hiện câu bằng Java

Chúng ta có thể phát hiện các câu trong văn bản đã cho bằng Java bằng cách sử dụng Biểu thức chính quy và một tập hợp các quy tắc đơn giản.

Ví dụ: giả sử một dấu chấm, dấu chấm hỏi hoặc dấu chấm than kết thúc một câu trong văn bản đã cho, sau đó chúng ta có thể tách câu bằng cách sử dụng split() phương pháp của Stringlớp học. Ở đây, chúng ta phải chuyển một biểu thức chính quy ở định dạng Chuỗi.

Sau đây là chương trình xác định các câu trong một văn bản nhất định bằng cách sử dụng các biểu thức chính quy Java (split method). Lưu chương trình này trong một tệp có tênSentenceDetection_RE.java.

public class SentenceDetection_RE {  
   public static void main(String args[]){ 
     
      String sentence = " Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
     
      String simple = "[.?!]";      
      String[] splitString = (sentence.split(simple));     
      for (String string : splitString)   
         System.out.println(string);      
   } 
}

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 SentenceDetection_RE.java 
java SentenceDetection_RE

Khi thực thi, chương trình trên sẽ tạo một tài liệu PDF hiển thị thông báo sau.

Hi 
How are you 
Welcome to Tutorialspoint 
We provide free tutorials on various technologies

Phát hiện câu bằng OpenNLP

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

Các opennlp.tools.sentdetect gói chứa các lớp và giao diện được sử dụng để thực hiện nhiệm vụ phát hiện câu.

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

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

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

  • Phát hiện các câu bằng cách sử dụng sentDetect() 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át hiện các câu từ văn bản thô đã cho.

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

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

Để 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 SentenceModel 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 sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/ensent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Bước 2: Khởi tạo lớp QuestionDetectorME

Các SentenceDetectorME lớp của gói opennlp.tools.sentdetectchứa các phương thức để tách văn bản thô thành các câu. Lớp này sử dụng mô hình Maximum Entropy để đánh giá các ký tự cuối câu trong một chuỗi để xác định xem chúng có biểu thị sự kết thúc của một câu hay không.

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

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Bước 3: Phát hiện câu

Các sentDetect() phương pháp của SentenceDetectorMElớp được sử dụng để phát hiệ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 một biến Chuỗi làm tham số.

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu cho phương thức này.

//Detecting the sentence 
String sentences[] = detector.sentDetect(sentence);

Example

Sau đây là chương trình phát hiện các câu trong một văn bản thô nhất định. Lưu chương trình này trong một tệp có tênSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionME { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
    
      //Detecting the sentence
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);  
   } 
}

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 SentenceDetectorME.java 
java SentenceDetectorME

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

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies

Phát hiện vị trí của câu

Chúng tôi cũng có thể phát hiện vị trí của các câu bằng cách sử dụng phương thức sentPosDetect () của SentenceDetectorME class.

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

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

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

Để 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 SentenceModel 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 sentence detector model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
SentenceModel model = new SentenceModel(inputStream);

Bước 2: Khởi tạo lớp QuestionDetectorME

Các SentenceDetectorME lớp của gói opennlp.tools.sentdetectchứa các phương thức để tách văn bản thô thành các câu. Lớp này sử dụng mô hình Maximum Entropy để đánh giá các ký tự cuối câu trong một chuỗi để xác định xem chúng có biểu thị sự kết thúc của một câu hay không.

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

//Instantiating the SentenceDetectorME class 
SentenceDetectorME detector = new SentenceDetectorME(model);

Bước 3: Phát hiện vị trí của câu

Các sentPosDetect() phương pháp của SentenceDetectorMElớp được sử dụng để phát hiện vị trí của 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 một biến Chuỗi làm tham số.

Gọi phương thức này bằng cách chuyển định dạng Chuỗi của câu làm tham số cho phương thức này.

//Detecting the position of the sentences in the paragraph  
Span[] spans = detector.sentPosDetect(sentence);

Bước 4: In các nhịp của câu

Các sentPosDetect() phương pháp của SentenceDetectorME lớp trả về một mảng các đối tượng kiểu Span. Lớp có tên Span of theopennlp.tools.util gói được sử dụng để lưu trữ số nguyên bắt đầu và kết thúc của bộ.

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

//Printing the sentences and their spans of a sentence 
for (Span span : spans)         
System.out.println(paragraph.substring(span);

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ênSentenceDetectionME.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
  
import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span;

public class SentencePosDetection { 
  
   public static void main(String args[]) throws Exception { 
   
      String paragraph = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the raw text 
      Span spans[] = detector.sentPosDetect(paragraph); 
       
      //Printing the spans of the sentences in the paragraph 
      for (Span span : spans)         
         System.out.println(span);  
   } 
}

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 SentencePosDetection.java 
java SentencePosDetection

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

[0..16) 
[17..43) 
[44..93)

Câu cùng với vị trí của họ

Các substring() phương thức của lớp String chấp nhận beginend offsetsvà trả về chuỗi tương ứng. Chúng ta có thể sử dụng phương pháp này để in các câu và khoảng cách (vị trí) của chúng lại với nhau, như được hiển thị trong khối mã sau.

for (Span span : spans)         
   System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);

Sau đây là chương trình để phát hiện các câu từ văn bản thô đã cho và hiển thị chúng cùng với vị trí của chúng. Lưu chương trình này trong một tệp có tênSentencesAndPosDetection.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.util.Span; 
   
public class SentencesAndPosDetection { 
  
   public static void main(String args[]) throws Exception { 
     
      String sen = "Hi. How are you? Welcome to Tutorialspoint." 
         + " We provide free tutorials on various technologies"; 
      //Loading a sentence model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin"); 
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class 
      SentenceDetectorME detector = new SentenceDetectorME(model);  
       
      //Detecting the position of the sentences in the paragraph  
      Span[] spans = detector.sentPosDetect(sen);  
      
      //Printing the sentences and their spans of a paragraph 
      for (Span span : spans)         
         System.out.println(sen.substring(span.getStart(), span.getEnd())+" "+ span);  
   } 
}

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 SentencesAndPosDetection.java 
java SentencesAndPosDetection

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu cùng với vị trí của chúng và hiển thị kết quả sau.

Hi. How are you? [0..16) 
Welcome to Tutorialspoint. [17..43)  
We provide free tutorials on various technologies [44..93)

Phát hiện xác suất câu

Các getSentenceProbabilities() phương pháp của SentenceDetectorME lớp trả về các xác suất được liên kết với các cuộc gọi gần đây nhất đến phương thức sentDetect ().

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

Sau đây là chương trình để in các xác suất được liên kết với các cuộc gọi đến phương thức sentDetect (). Lưu chương trình này trong một tệp có tênSentenceDetectionMEProbs.java.

import java.io.FileInputStream; 
import java.io.InputStream;  

import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel;  

public class SentenceDetectionMEProbs { 
  
   public static void main(String args[]) throws Exception { 
   
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
       
      //Loading sentence detector model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-sent.bin");
      SentenceModel model = new SentenceModel(inputStream); 
       
      //Instantiating the SentenceDetectorME class
      SentenceDetectorME detector = new SentenceDetectorME(model);  
      
      //Detecting the sentence 
      String sentences[] = detector.sentDetect(sentence); 
    
      //Printing the sentences 
      for(String sent : sentences)        
         System.out.println(sent);   
         
      //Getting the probabilities of the last decoded sequence       
      double[] probs = detector.getSentenceProbabilities(); 
       
      System.out.println("  "); 
       
      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 SentenceDetectionMEProbs.java 
java SentenceDetectionMEProbs

Khi thực thi, chương trình trên đọc Chuỗi đã cho và phát hiện các câu và in ra. Ngoài ra, nó cũng trả về các xác suất được liên kết với các cuộc gọi gần đây nhất đến phương thức sentDetect (), như được hiển thị bên dưới.

Hi. How are you? 
Welcome to Tutorialspoint. 
We provide free tutorials on various technologies 
   
0.9240246995179983 
0.9957680129995953 
1.0