📅  最后修改于: 2020-11-23 03:58:10             🧑  作者: Mango
将句子分块是指将句子分为单词部分(例如单词组和动词组)。
为了检测句子,OpenNLP使用一个名为en-chunker.bin的模型。这是一个预定义的模型,经过训练可以对给定原始文本中的句子进行分块。
opennlp.tools.chunker程序包包含用于查找非递归语法注释(例如名词短语块)的类和接口。
您可以使用ChunkerME类的方法chunk()对句子进行分块。此方法接受句子的标记和POS标签作为参数。因此,在开始分块过程之前,首先需要对句子进行标记化并生成句子的POS部分。
要使用OpenNLP库对句子进行分块,您需要-
标记句子。
为其生成POS标签。
使用ChunkerModel类加载en-chunker.bin模型
实例化ChunkerME类。
使用此类的chunk()方法将句子分块。
以下是编写程序以对给定原始文本中的句子进行分块的步骤。
使用whitespaceTokenizer类的tokenize()方法对句子进行标记,如下面的代码块所示。
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
使用POSTaggerME类的tag()方法生成句子的POS标签,如以下代码块所示。
//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);
用于分词的模型由名为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);
软件包opennlp.tools.chunker的chunkerME类包含对句子进行分块的方法。这是基于最大熵的分块器。
实例化此类并传递在上一步中创建的模型对象。
//Instantiate the ChunkerME class
ChunkerME chunkerME = new ChunkerME(chunkerModel);
ChunkerME类的chunk()方法用于对传递给它的原始文本中的句子进行分块。此方法接受两个表示标记和标签的String数组作为参数。
通过将前面步骤中创建的令牌数组和标记数组作为参数传递来调用此方法。
//Generating the chunks
String result[] = chunkerME.chunk(tokens, tags);
例
以下是将给定原始文本中的句子分块的程序。将该程序保存在名为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
我们还可以使用ChunkerME类的chunkAsSpans()方法检测块的位置或跨度。此方法返回Span类型的对象数组。 opennlp.tools.util包的名为Span的类用于存储集合的开始和结束整数。
您可以将chunkAsSpans()方法返回的跨度存储在Span数组中并进行打印,如下面的代码块所示。
//Generating the tagged chunk spans
Span[] span = chunkerME.chunkAsSpans(tokens, tags);
for (Span s : span)
System.out.println(s.toString());
例
以下是检测给定原始文本中的句子的程序。将该程序保存在名为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
在执行时,上面的程序读取给定的String和其中的块的跨度,并显示以下输出-
Loading POS Tagger model ... done (1.059s)
[0..2) NP
[2..4) VP
ChunkerME类的probs()方法返回最后一个解码序列的概率。
//Getting the probabilities of the last decoded sequence
double[] probs = chunkerME.probs();
以下为组块打印最后解码序列的概率的程序。将此程序保存在名为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
使用以下命令从命令提示符处编译并执行保存的Java文件-
javac ChunkerProbsExample.java
java ChunkerProbsExample
在执行时,上面的程序读取给定的String并将其分块,并打印最后一个解码序列的概率。
0.9592746040797778
0.6883933131241501
0.8830563473996004
0.8951150529746051