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 
廣告
© . All rights reserved.