📜  OpenNLP-查找词性

📅  最后修改于: 2020-11-23 03:57:03             🧑  作者: Mango


使用OpenNLP,您还可以检测给定句子的词性并将其打印出来。 OpenNLP而不是词性的全称,而是使用词性的简短形式。下表列出了OpenNLP检测到的语音的各个部分及其含义。

Parts of Speech Meaning of parts of speech
NN Noun, singular or mass
DT Determiner
VB Verb, base form
VBD Verb, past tense
VBZ Verb, third person singular present
IN Preposition or subordinating conjunction
NNP Proper noun, singular
TO to
JJ Adjective

标记词性

为了标记句子的词性,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并将String格式的模型路径传递给其构造函数)。

  • 实例化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.postagPOSTaggerME类用于预测给定原始文本的词性。它使用最大熵来做出决策。

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

//Instantiating POSTaggerME class 
POSTaggerME tagger = new POSTaggerME(model);

步骤3:标记句子

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

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

//Tokenizing the sentence using WhitespaceTokenizer class  
WhitespaceTokenizer whitespaceTokenizer= WhitespaceTokenizer.INSTANCE; 
String[] tokens = whitespaceTokenizer.tokenize(sentence); 

步骤4:产生标记

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 Tagger性能

以下是标记给定原始文本的语音部分的程序。它还监视性能并显示标记器的性能。将该程序保存在名为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 

POS塔格机率

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

使用以下命令从命令提示符处编译并执行保存的Java文件-

javac TokenizerMEProbs.java 
java TokenizerMEProbs

在执行时,上面的程序读取给定的原始文本,在其中标记每个令牌的语音部分,并显示它们。此外,它还会显示给定句子中每个语音部分的概率,如下所示。

Hi_NNP welcome_JJ to_TO Tutorialspoint_VB    
0.6416834779738033 
0.42983612874819177 
0.8584513635863117 
0.4394784478206072