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