OpenNLP - 查找词性

使用 OpenNLP,您还可以检测给定句子的词性并打印它们。OpenNLP 不使用词性的全名,而是使用每个词性的缩写形式。下表列出了 OpenNLP 检测到的各种词性及其含义。

词性 词性含义
NN 名词,单数或集合
DT 限定词
VB 动词,基本形式
VBD 动词,过去时时态
VBZ 动词,第三人称单数现在时
IN 介词或从属连词
NNP 专有名词,单数
TO to
JJ 形容词

标记词性

为了标记句子的词性,OpenNLP 使用一个模型,即名为 en-posmaxent.bin 的文件。这是一个预定义模型,经过训练可以标记给定原始文本的词性。

opennlp.tools.postag 包中的 POSTaggerME 类用于加载此模型,并使用 OpenNLP 库标记给定原始文本的词性。为此,您需要 −

  • 使用 POSModel 类加载 en-pos-maxent.bin 模型。

  • 实例化 POSTaggerME 类。

  • 对句子进行标记。

  • 使用 tag() 方法生成标记。

  • 使用 POSSample 类打印标记和标记。

以下是编写程序的步骤,该程序使用 POSTaggerME 类标记给定原始文本中的词性。

步骤 1:加载模型

POS 标记模型由名为的类表示POSModel,属于包opennlp.tools.postag

要加载 tokenizer 模型 −

  • 创建模型的 InputStream 对象(实例化 FileInputStream 并将模型的路径以字符串格式传递给其构造函数)。

  • 实例化 POSModel 类,并将模型的 InputStream(对象)作为参数传递给其构造函数,如以下代码块所示 −

//加载词性-maxent 模型
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin");
POSModel model = new POSModel(inputStream);

步骤 2:实例化 POSTaggerME 类

opennlp.tools.postagPOSTaggerME 类用于预测给定原始文本的词性。它使用最大熵来做出决策。

实例化此类并传递上一步中创建的模型对象,如下所示 −

//实例化 POSTaggerME 类
POSTaggerME tagger = new POSTaggerME(model);

步骤 3:标记句子

whitespaceTokenizer 类的 tokenize() 方法用于标记传递给它的原始文本。此方法接受 String 变量作为参数,并返回一个字符串(标记)数组。

实例化 whitespaceTokenizer 类,并通过将句子的 String 格式传递给此方法来调用此方法。

//使用 WhitespaceTokenizer 类标记句子
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
String[] tokens = whitespaceTokenizer.tokenize(sentence);

步骤 4:生成标签

whitespaceTokenizer 类的 tag() 方法将 POS 标签分配给标记句子。此方法接受标记数组(字符串)作为参数并返回标记(数组)。

通过将上一步中生成的标记传递给 tag() 方法来调用该方法。

//生成标签
String[] tags = tagger.tag(tokens);

步骤 5:打印标记和标签

POSSample 类表示带 POS 标记的句子。要实例化此类,我们需要一个标记数组(文本)和一个标记数组。

此类的 toString() 方法返回标记的句子。通过传递前面步骤中创建的标记和标记数组来实例化此类,并调用其 toString() 方法,如以下代码块所示。

//实例化 POSSample 类
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{ 
    
        //加载词性-maxent 模型
        InputStream inputStream = new
        FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin");
        POSModel model = new POSModel(inputStream);
        
        //实例化 POSTaggerME 类
        POSTaggerME tagger = new POSTaggerME(model);
        
        String sentence = "Hi welcome to Tutorialspoint";
        
        //使用 WhitespaceTokenizer 类对句子进行标记
        WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
        String[] tokens = whitespaceTokenizer.tokenize(sentence);
        
        //生成标签
        String[] tags = tagger.tag(tokens);
        
        //实例化 POSSample 类
        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{ 
        //加载词性-maxent 模型
        InputStream inputStream = new
        FileInputStream("C:/OpenNLP_models/en-pos-maxent.bin");
        POSModel model = new POSModel(inputStream);
        
        //创建 WhitespaceTokenizer 类的对象
        WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
        
        //对句子进行标记
        String sentence = "Hi welcome to Tutorialspoint";
        String[] tokens = whitespaceTokenizer.tokenize(sentence);
        
        //实例化 POSTaggerME 类
        POSTaggerME tagger = new POSTaggerME(model);
        
        //生成标签
        String[] tags = tagger.tag(tokens);
        
        //实例化 POSSample 类
        POSSample sample = new POSSample(tokens, tags);
        System.out.println(sample.toString());
        
        //监控词性标注器的性能
        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 

POS 标记器概率

POSTaggerME 类的 probs() 方法用于查找最近标记的句子的每个标记的概率。

//获取最近调用 tokenizePos() 方法的概率
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{ 
      
        //加载词性-maxent 模型
        InputStream inputStream = new FileInputStream("C:/OpenNLP_mdl/en-pos-maxent.bin");
        POSModel model = new POSModel(inputStream);
        
        //创建 WhitespaceTokenizer 类的对象
        WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE;
        
        //对句子进行标记
        String sentence = "Hi welcome to Tutorialspoint";
        String[] tokens = whitespaceTokenizer.tokenize(sentence);
        
        //实例化 POSTaggerME 类
        POSTaggerME tagger = new POSTaggerME(model);
        
        //生成标签
        String[] tags = tagger.tag(tokens);
        
        //实例化 POSSample 类
        POSSample sample = new POSSample(tokens, tags);
        System.out.println(sample.toString());
        
        //最后一个标记句子的每个标记的概率。
        double [] probs = tagger.probs();
        System.out.println(" ");
        
        //打印概率
        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