OpenNLP - Mã hóa

Quá trình cắt câu đã cho thành các phần nhỏ hơn (mã thông báo) được gọi là tokenization. Nói chung, văn bản thô nhất định được mã hóa dựa trên một tập hợp các dấu phân cách (chủ yếu là khoảng trắng).

Tokenization được sử dụng trong các tác vụ như kiểm tra chính tả, xử lý tìm kiếm, xác định các phần của giọng nói, phát hiện câu, phân loại tài liệu của tài liệu, v.v.

Mã hóa bằng OpenNLP

Các opennlp.tools.tokenize gói chứa các lớp và giao diện được sử dụng để thực hiện mã hóa.

Để mã hóa các câu đã cho thành các đoạn đơn giản hơn, thư viện OpenNLP cung cấp ba lớp khác nhau:

  • SimpleTokenizer - Lớp này mã hóa văn bản thô đã cho bằng cách sử dụng các lớp ký tự.

  • WhitespaceTokenizer - Lớp này sử dụng khoảng trắng để mã hóa văn bản đã cho.

  • TokenizerME- Lớp này chuyển đổi văn bản thô thành các mã thông báo riêng biệt. Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

SimpleTokenizer

Để mã hóa một câu bằng cách sử dụng SimpleTokenizer lớp học, bạn cần phải -

  • Tạo một đối tượng của lớp tương ứng.

  • Mã hóa câu bằng cách sử dụng tokenize() phương pháp.

  • In mã thông báo.

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

Step 1 - Khởi tạo lớp tương ứng

Trong cả hai lớp, không có hàm tạo nào có sẵn để khởi tạo chúng. Do đó, chúng ta cần tạo các đối tượng của các lớp này bằng cách sử dụng biến tĩnhINSTANCE.

SimpleTokenizer tokenizer = SimpleTokenizer.INSTANCE;

Step 2 - Mã hóa các câu

Cả hai lớp này đều chứa một phương thức được gọi là tokenize(). Phương thức này chấp nhận một văn bản thô ở định dạng Chuỗi. Khi gọi, nó mã hóa Chuỗi đã cho và trả về một mảng Chuỗi (mã thông báo).

Mã hóa câu bằng cách sử dụng tokenizer() như hình dưới đây.

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence);

Step 3 - In mã thông báo

Sau khi mã hóa câu, bạn có thể in mã thông báo bằng cách sử dụng for loop, như hình dưới đây.

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

Example

Sau đây là chương trình mã hóa câu đã cho bằng cách sử dụng lớp SimpleTokenizer. Lưu chương trình này trong một tệp có tênSimpleTokenizerExample.java.

import opennlp.tools.tokenize.SimpleTokenizer;  
public class SimpleTokenizerExample { 
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Tokenizing the given sentence 
      String tokens[] = simpleTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens) {         
         System.out.println(token);  
      }       
   }  
}

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

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị đầu ra sau:

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

WhitespaceTokenizer

Để mã hóa một câu bằng cách sử dụng WhitespaceTokenizer lớp học, bạn cần phải -

  • Tạo một đối tượng của lớp tương ứng.

  • Mã hóa câu bằng cách sử dụng tokenize() phương pháp.

  • In mã thông báo.

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

Step 1 - Khởi tạo lớp tương ứng

Trong cả hai lớp, không có hàm tạo nào có sẵn để khởi tạo chúng. Do đó, chúng ta cần tạo các đối tượng của các lớp này bằng cách sử dụng biến tĩnhINSTANCE.

WhitespaceTokenizer tokenizer = WhitespaceTokenizer.INSTANCE;

Step 2 - Mã hóa các câu

Cả hai lớp này đều chứa một phương thức được gọi là tokenize(). Phương thức này chấp nhận một văn bản thô ở định dạng Chuỗi. Khi gọi, nó mã hóa Chuỗi đã cho và trả về một mảng Chuỗi (mã thông báo).

Mã hóa câu bằng cách sử dụng tokenizer() như hình dưới đây.

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence);

Step 3 - In mã thông báo

Sau khi mã hóa câu, bạn có thể in mã thông báo bằng cách sử dụng for loop, như hình dưới đây.

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

Example

Sau đây là chương trình mã hóa câu đã cho bằng cách sử dụng WhitespaceTokenizerlớp học. Lưu chương trình này trong một tệp có tênWhitespaceTokenizerExample.java.

import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class WhitespaceTokenizerExample {  
   
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating whitespaceTokenizer class 
       WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Tokenizing the given paragraph 
      String tokens[] = whitespaceTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens)     
         System.out.println(token);        
   } 
}

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

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị kết quả sau.

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

Lớp TokenizerME

OpenNLP cũng sử dụng một mô hình được xác định trước, một tệp có tên de-token.bin, để mã hóa các câu. Nó được đào tạo để mã hóa các câu trong một văn bản thô nhất định.

Các TokenizerME lớp của opennlp.tools.tokenizergói được sử dụng để tải mô hình này và mã hóa văn bản thô đã cho bằng thư viện OpenNLP. Để làm như vậy, bạn cần phải -

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

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

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

Sau đây là các bước cần thực hiện để viết một chương trình mã hóa các câu từ văn bản thô đã cho bằng cách sử dụng TokenizerME lớp học.

Step 1 - Đang tải mô hình

Mô hình mã hóa được đại diện bởi lớp có tên TokenizerModel, thuộc về gói opennlp.tools.tokenize.

Để tải một mô hình tokenizer -

  • 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 TokenizerModel 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 Tokenizer model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
TokenizerModel tokenModel = new TokenizerModel(inputStream);

Step 2 - Khởi tạo lớp TokenizerME

Các TokenizerME lớp của gói opennlp.tools.tokenizechứa các phương thức để cắt văn bản thô thành các phần nhỏ hơn (mã thông báo). Nó sử dụng Maximum Entropy để đưa ra quyết định của mình.

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 TokenizerME class 
TokenizerME tokenizer = new TokenizerME(tokenModel);

Step 3 - Mã hóa câu

Các tokenize() phương pháp của TokenizerMElớp được sử dụng để mã hóa 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ố và trả về một mảng Chuỗi (mã thông báo).

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, như sau.

//Tokenizing the given raw text 
String tokens[] = tokenizer.tokenize(paragraph);

Example

Sau đây là chương trình mã hóa văn bản thô đã cho. Lưu chương trình này trong một tệp có tênTokenizerMEExample.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel;  

public class TokenizerMEExample { 
  
   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 the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
       
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel); 
       
      //Tokenizing the given raw text 
      String tokens[] = tokenizer.tokenize(sentence);       
          
      //Printing the tokens  
      for (String a : tokens) 
         System.out.println(a); 
   } 
}

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

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 
technologie

Lấy vị trí của các mã thông báo

Chúng tôi cũng có thể nhận được các vị trí hoặc spans của các mã thông báo bằng cách sử dụng tokenizePos()phương pháp. Đây là phương thức của giao diện Tokenizer của góiopennlp.tools.tokenize. Vì tất cả (ba) lớp Tokenizer đều triển khai giao diện này, bạn có thể tìm thấy phương thức này trong tất cả chúng.

Phương thức này chấp nhận câu hoặc văn bản thô ở dạng một chuỗi và trả về một mảng đối tượng kiểu Span.

Bạn có thể nhận vị trí của các mã thông báo bằng cách sử dụng tokenizePos() phương pháp, như sau:

//Retrieving the tokens 
tokenizer.tokenizePos(sentence);

In các vị trí (nhịp)

Lớp có tên Span sau đó opennlp.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 tokenizePos() trong mảng Span và in chúng, như được hiển thị trong khối mã sau.

//Retrieving the tokens 
Span[] tokens = tokenizer.tokenizePos(sentence);
//Printing the spans of tokens 
for( Span token : tokens)        
   System.out.println(token);

In mã thông báo và vị trí của chúng cùng nhau

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

//Printing the spans of tokens 
for(Span token : tokens)  
   System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));

Example(SimpleTokenizer)

Sau đây là chương trình lấy các khoảng mã thông báo của văn bản thô bằng cách sử dụng SimpleTokenizerlớp học. Nó cũng in các mã thông báo 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ênSimpleTokenizerSpans.java.

import opennlp.tools.tokenize.SimpleTokenizer; 
import opennlp.tools.util.Span;  

public class SimpleTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Retrieving the boundaries of the tokens 
      Span[] tokens = simpleTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens)
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));          
   } 
}

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

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị đầu ra sau:

[0..2) Hi 
[2..3) . 
[4..7) How 
[8..11) are 
[12..15) you 
[15..16) ? 
[17..24) Welcome 
[25..27) to 
[28..42) Tutorialspoint 
[42..43) . 
[44..46) We 
[47..54) provide 
[55..59) free 
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

Example (WhitespaceTokenizer)

Sau đây là chương trình lấy các khoảng mã thông báo của văn bản thô bằng cách sử dụng WhitespaceTokenizerlớp học. Nó cũng in các mã thông báo 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ênWhitespaceTokenizerSpans.java.

import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.Span; 
public class WhitespaceTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Retrieving the tokens 
      Span[] tokens = whitespaceTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens) 
         System.out.println(token +" 
            "+sent.substring(token.getStart(), token.getEnd()));        
   } 
}

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

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị kết quả sau.

[0..3) Hi. 
[4..7) How 
[8..11) are 
[12..16) you? 
[17..24) Welcome 
[25..27) to 
[28..43) Tutorialspoint. 
[44..46) We 
[47..54) provide 
[55..59) free
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

Example (TokenizerME)

Sau đây là chương trình lấy các khoảng mã thông báo của văn bản thô bằng cách sử dụng TokenizerMElớp học. Nó cũng in các mã thông báo 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ênTokenizerMESpans.java.

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span;  

public class TokenizerMESpans { 
   public static void main(String args[]) throws Exception{     
      String sent = "Hello John how are you welcome to Tutorialspoint"; 
       
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
       
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel); 
       
      //Retrieving the positions of the tokens 
      Span tokens[] = tokenizer.tokenizePos(sent); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
   } 
}

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

Khi thực thi, chương trình trên đọc Chuỗi đã cho (văn bản thô), mã hóa nó và hiển thị đầu ra sau:

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint

Xác suất Tokenizer

Phương thức getTokenProbabilities () của lớp TokenizerME được sử dụng để lấy các xác suất liên quan đến các cuộc gọi gần đây nhất đến phương thức tokenizePos ().

//Getting the probabilities of the recent calls to tokenizePos() method 
double[] probs = detector.getSentenceProbabilities();

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

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span;  

public class TokenizerMEProbs { 
   
   public static void main(String args[]) throws Exception{     
      String sent = "Hello John how are you welcome to Tutorialspoint"; 
      
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
      
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel);
      
      //Retrieving the positions of the tokens 
      Span tokens[] = tokenizer.tokenizePos(sent); 
       
      //Getting the probabilities of the recent calls to tokenizePos() method 
      double[] probs = tokenizer.getTokenProbabilities(); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
         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 TokenizerMEProbs.java 
java TokenizerMEProbs

Khi thực thi, chương trình trên đọc Chuỗi đã cho và mã hóa 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 tokenizerPos ().

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint 
   
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0