OpenNLP - 查找词性
使用 OpenNLP,您还可以检测给定句子的词性并打印它们。OpenNLP 使用每个词性的缩写形式,而不是词性的全称。下表列出了 OpenNLP 检测到的各个词性及其含义。
| 词类 | 词性的含义 |
|---|---|
| 神经网络 | 名词,单数或大众 |
| DT | 限定词 |
| VB | 动词,基本形式 |
| VBD | 动词,过去式 |
| VBZ | 动词,第三人称单数现在时 |
| 在 | 介词或从属连词 |
| 国家NP | 专有名词,单数 |
| 到 | 到 |
| 杰杰 | 形容词 |
标记词性
为了标记句子的词性,OpenNLP 使用模型,即名为en-posmaxent.bin 的文件。这是一个预定义的模型,经过训练来标记给定原始文本的词性。
opennlp.tools.postag包的 POSTaggerME 类用于加载该模型,并使用 OpenNLP 库标记给定原始文本的词性。为此,您需要 -
使用POSModel类加载en-pos-maxent.bin模型。
实例化POSTaggerME类。
对句子进行标记。
使用tag()方法生成标签。
使用POSSample类打印标记和标签。
以下是编写使用POSTaggerME类标记给定原始文本中的语音部分的程序时应遵循的步骤。
第 1 步:加载模型
POS 标记的模型由名为POSModel的类表示,该类属于opennlp.tools.postag包。
加载分词器模型 -
创建模型的InputStream对象(实例化FileInputStream并将模型的路径以字符串格式传递给其构造函数)。
实例化POSModel类并将模型的InputStream (对象)作为参数传递给其构造函数,如以下代码块所示 -
//Loading Parts of speech-maxent model
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModel(inputStream);
步骤 2:实例化 POSTaggerME 类
opennlp.tools.postag包的POSTaggerME类用于预测给定原始文本的词性。它使用最大熵来做出决定。
实例化此类并传递上一步中创建的模型对象,如下所示 -
//Instantiating POSTaggerME class POSTaggerME tagger = new POSTaggerME(model);
第 3 步:对句子进行标记
whitespaceTokenizer类的tokenize ()方法用于对传递给它的原始文本进行标记。此方法接受字符串变量作为参数,并返回字符串(标记)数组。
实例化whitespaceTokenizer类并通过将句子的字符串格式传递给此方法来调用此方法。
//Tokenizing the sentence using WhitespaceTokenizer class WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; String[] tokens = whitespaceTokenizer.tokenize(sentence);
第四步:生成标签
whitespaceTokenizer类的tag ()方法将 POS 标签分配给标记的句子。此方法接受标记数组(字符串)作为参数并返回标记(数组)。
通过将上一步中生成的标记传递给tag()方法来调用该方法。
//Generating tags String[] tags = tagger.tag(tokens);
第 5 步:打印令牌和标签
POSSample类表示带有 POS 标记的句子。要实例化此类,我们需要一个(文本的)标记数组和一个标签数组。
此类的toString ()方法返回标记的句子。通过传递在前面的步骤中创建的标记和标记数组来实例化此类,并调用其toString()方法,如以下代码块所示。
//Instantiating the POSSample class POSSample sample = new POSSample(tokens, tags); System.out.println(sample.toString());
例子
以下是标记给定原始文本中的词性的程序。将此程序保存在名为PosTaggerExample.java 的文件中。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSSample;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class PosTaggerExample {
public static void main(String args[]) throws Exception{
//Loading Parts of speech-maxent model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModel(inputStream);
//Instantiating POSTaggerME class
POSTaggerME tagger = new POSTaggerME(model);
String sentence = "Hi welcome to Tutorialspoint";
//Tokenizing the sentence using WhitespaceTokenizer class
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Generating tags
String[] tags = tagger.tag(tokens);
//Instantiating the POSSample class
POSSample sample = new POSSample(tokens, tags);
System.out.println(sample.toString());
}
}
使用以下命令从命令提示符编译并执行保存的 Java 文件 -
javac PosTaggerExample.java java PosTaggerExample
执行时,上述程序读取给定的文本并检测这些句子的词性并显示它们,如下所示。
Hi_NNP welcome_JJ to_TO Tutorialspoint_VB
POS 标记器性能
以下是标记给定原始文本的词性的程序。它还监视性能并显示标记器的性能。将此程序保存在名为PosTagger_Performance.java的文件中。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.cmdline.PerformanceMonitor;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSSample;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class PosTagger_Performance {
public static void main(String args[]) throws Exception{
//Loading Parts of speech-maxent model
InputStream inputStream = new
FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModel(inputStream);
//Creating an object of WhitespaceTokenizer class
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Instantiating POSTaggerME class
POSTaggerME tagger = new POSTaggerME(model);
//Generating tags
String[] tags = tagger.tag(tokens);
//Instantiating POSSample class
POSSample sample = new POSSample(tokens, tags);
System.out.println(sample.toString());
//Monitoring the performance of POS tagger
PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent");
perfMon.start();
perfMon.incrementCounter();
perfMon.stopAndPrintFinalResult();
}
}
使用以下命令从命令提示符编译并执行保存的 Java 文件 -
javac PosTaggerExample.java java PosTaggerExample
执行时,上述程序读取给定的文本并标记这些句子的词性并显示它们。此外,它还监控 POS 标记器的性能并进行显示。
Hi_NNP welcome_JJ to_TO Tutorialspoint_VB Average: 0.0 sent/s Total: 1 sent Runtime: 0.0s
词性标注概率
POSTaggerME类的probs ()方法用于查找最近标记的句子的每个标记的概率。
//Getting the probabilities of the recent calls to tokenizePos() method double[] probs = detector.getSentenceProbabilities();
以下程序显示最后一个标记句子的每个标记的概率。将此程序保存在名为PosTaggerProbs.java的文件中。
import java.io.FileInputStream;
import java.io.InputStream;
import opennlp.tools.postag.POSModel;
import opennlp.tools.postag.POSSample;
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceTokenizer;
public class PosTaggerProbs {
public static void main(String args[]) throws Exception{
//Loading Parts of speech-maxent model
InputStream inputStream = new FileInputStream("C:/OpenNLP_mdl/en-pos-maxent.bin");
POSModel model = new POSModel(inputStream);
//Creating an object of WhitespaceTokenizer class
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
//Tokenizing the sentence
String sentence = "Hi welcome to Tutorialspoint";
String[] tokens = whitespaceTokenizer.tokenize(sentence);
//Instantiating POSTaggerME class
POSTaggerME tagger = new POSTaggerME(model);
//Generating tags
String[] tags = tagger.tag(tokens);
//Instantiating the POSSample class
POSSample sample = new POSSample(tokens, tags);
System.out.println(sample.toString());
//Probabilities for each tag of the last tagged sentence.
double [] probs = tagger.probs();
System.out.println(" ");
//Printing the probabilities
for(int i = 0; i<probs.length; i++)
System.out.println(probs[i]);
}
}
使用以下命令从命令提示符编译并执行保存的 Java 文件 -
javac TokenizerMEProbs.java java TokenizerMEProbs
执行时,上述程序读取给定的原始文本,标记其中每个标记的词性,并显示它们。此外,它还显示给定句子中每个词性的概率,如下所示。
Hi_NNP welcome_JJ to_TO Tutorialspoint_VB 0.6416834779738033 0.42983612874819177 0.8584513635863117 0.4394784478206072