- OpenNLP 教程
- OpenNLP - 首頁
- OpenNLP - 概述
- OpenNLP - 環境配置
- OpenNLP - 參考 API
- OpenNLP - 句子檢測
- OpenNLP - 分詞
- 命名實體識別
- OpenNLP - 詞性標註
- OpenNLP - 句法分析
- OpenNLP - 組塊分析
- OpenNLP - 命令列介面
- OpenNLP 有用資源
- OpenNLP - 快速指南
- OpenNLP - 有用資源
- OpenNLP - 討論
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