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ữ start và end 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