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:加载模型

词性标注模型由名为 **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); 

步骤 4:生成标签

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

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

//Generating tags 
String[] tags = tagger.tag(tokens); 

步骤 5:打印标记和标签

**POSSample** 类表示词性标注的句子。要实例化此类,我们需要一个文本标记数组和一个标签数组。

此类的 **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 

词性标注器性能

以下是标注给定原始文本词性的程序。它还会监控性能并显示标注器的性能。将此程序保存到名为 **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 

执行后,上述程序读取给定的文本并标注这些句子的词性,然后显示它们。此外,它还会监控词性标注器的性能并显示它。

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 
广告