OpenNLP - 分詞



將給定句子分解成更小部分(標記)的過程稱為分詞。通常,給定的原始文字是基於一組分隔符(主要是空格)進行分詞的。

分詞用於拼寫檢查、搜尋處理、詞性識別、句子檢測、文件分類等任務。

使用 OpenNLP 進行分詞

opennlp.tools.tokenize 包包含用於執行分詞的類和介面。

為了將給定的句子分解成更簡單的片段,OpenNLP 庫提供了三個不同的類:

  • SimpleTokenizer - 此類使用字元類對給定的原始文字進行分詞。

  • WhitespaceTokenizer - 此類使用空格對給定的文字進行分詞。

  • TokenizerME - 此類將原始文字轉換成單獨的標記。它使用最大熵來做出決策。

SimpleTokenizer

要使用SimpleTokenizer類對句子進行分詞,您需要:

  • 建立相應類的物件。

  • 使用tokenize()方法對句子進行分詞。

  • 列印標記。

以下是編寫對給定原始文字進行分詞的程式需要遵循的步驟:

步驟 1 - 例項化相應類

在這兩個類中,都沒有可用的建構函式來例項化它們。因此,我們需要使用靜態變數INSTANCE來建立這些類的物件。

SimpleTokenizer tokenizer = SimpleTokenizer.INSTANCE;   

步驟 2 - 對句子進行分詞

這兩個類都包含一個名為tokenize()的方法。此方法接受字串格式的原始文字。呼叫此方法後,它會對給定的字串進行分詞,並返回一個字串陣列(標記)。

使用如下所示的tokenizer()方法對句子進行分詞。

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence); 

步驟 3 - 列印標記

對句子進行分詞後,您可以使用for迴圈列印標記,如下所示。

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

示例

以下是使用 SimpleTokenizer 類對給定句子進行分詞的程式。將此程式儲存到名為SimpleTokenizerExample.java的檔案中。

import opennlp.tools.tokenize.SimpleTokenizer;  
public class SimpleTokenizerExample { 
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Tokenizing the given sentence 
      String tokens[] = simpleTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens) {         
         System.out.println(token);  
      }       
   }  
}

使用以下命令從命令提示符編譯並執行儲存的 Java 檔案:

javac SimpleTokenizerExample.java 
java SimpleTokenizerExample

執行後,上述程式讀取給定的字串(原始文字),對其進行分詞,並顯示以下輸出:

Hi 
. 
How 
are 
you 
? 
Welcome 
to 
Tutorialspoint 
. 
We 
provide 
free 
tutorials 
on 
various 
technologies 

WhitespaceTokenizer

要使用WhitespaceTokenizer類對句子進行分詞,您需要:

  • 建立相應類的物件。

  • 使用tokenize()方法對句子進行分詞。

  • 列印標記。

以下是編寫對給定原始文字進行分詞的程式需要遵循的步驟:

步驟 1 - 例項化相應類

在這兩個類中,都沒有可用的建構函式來例項化它們。因此,我們需要使用靜態變數INSTANCE來建立這些類的物件。

WhitespaceTokenizer tokenizer = WhitespaceTokenizer.INSTANCE; 

步驟 2 - 對句子進行分詞

這兩個類都包含一個名為tokenize()的方法。此方法接受字串格式的原始文字。呼叫此方法後,它會對給定的字串進行分詞,並返回一個字串陣列(標記)。

使用如下所示的tokenizer()方法對句子進行分詞。

//Tokenizing the given sentence 
 String tokens[] = tokenizer.tokenize(sentence); 

步驟 3 - 列印標記

對句子進行分詞後,您可以使用for迴圈列印標記,如下所示。

//Printing the tokens 
for(String token : tokens)       
   System.out.println(token);

示例

以下是使用WhitespaceTokenizer類對給定句子進行分詞的程式。將此程式儲存到名為WhitespaceTokenizerExample.java的檔案中。

import opennlp.tools.tokenize.WhitespaceTokenizer;  

public class WhitespaceTokenizerExample {  
   
   public static void main(String args[]){ 
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating whitespaceTokenizer class 
       WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Tokenizing the given paragraph 
      String tokens[] = whitespaceTokenizer.tokenize(sentence);  
       
      //Printing the tokens 
      for(String token : tokens)     
         System.out.println(token);        
   } 
}

使用以下命令從命令提示符編譯並執行儲存的 Java 檔案:

javac WhitespaceTokenizerExample.java 
java WhitespaceTokenizerExample 

執行後,上述程式讀取給定的字串(原始文字),對其進行分詞,並顯示以下輸出。

Hi. 
How 
are 
you? 
Welcome 
to 
Tutorialspoint. 
We 
provide 
free 
tutorials 
on 
various 
technologies

TokenizerME 類

OpenNLP 還使用一個預定義的模型(名為 de-token.bin 的檔案)對句子進行分詞。它經過訓練可以對給定原始文字中的句子進行分詞。

opennlp.tools.tokenizer包的TokenizerME類用於載入此模型,並使用 OpenNLP 庫對給定的原始文字進行分詞。為此,您需要:

  • 使用TokenizerModel類載入en-token.bin模型。

  • 例項化TokenizerME類。

  • 使用此類的tokenize()方法對句子進行分詞。

以下是使用TokenizerME類對給定原始文字中的句子進行分詞的程式需要遵循的步驟。

步驟 1 - 載入模型

分詞模型由名為TokenizerModel的類表示,該類屬於opennlp.tools.tokenize包。

要載入分詞模型:

  • 建立模型的InputStream物件(例項化FileInputStream,並將模型的路徑(字串格式)傳遞給它的建構函式)。

  • 例項化TokenizerModel類,並將模型的InputStream(物件)作為引數傳遞給它的建構函式,如下面的程式碼塊所示。

//Loading the Tokenizer model 
InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
TokenizerModel tokenModel = new TokenizerModel(inputStream);

步驟 2 - 例項化 TokenizerME 類

opennlp.tools.tokenize包的TokenizerME類包含將原始文字分解成更小部分(標記)的方法。它使用最大熵來做出決策。

例項化此類,並將上一步中建立的模型物件作為引數傳遞,如下所示。

//Instantiating the TokenizerME class 
TokenizerME tokenizer = new TokenizerME(tokenModel);

步驟 3 - 對句子進行分詞

TokenizerME類的tokenize()方法用於對傳遞給它的原始文字進行分詞。此方法接受一個字串變數作為引數,並返回一個字串陣列(標記)。

透過將句子的字串格式傳遞給此方法來呼叫此方法,如下所示。

//Tokenizing the given raw text 
String tokens[] = tokenizer.tokenize(paragraph);

示例

以下是對給定原始文字進行分詞的程式。將此程式儲存到名為TokenizerMEExample.java的檔案中。

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel;  

public class TokenizerMEExample { 
  
   public static void main(String args[]) throws Exception{     
     
      String sentence = "Hi. How are you? Welcome to Tutorialspoint. " 
            + "We provide free tutorials on various technologies"; 
       
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
       
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel); 
       
      //Tokenizing the given raw text 
      String tokens[] = tokenizer.tokenize(sentence);       
          
      //Printing the tokens  
      for (String a : tokens) 
         System.out.println(a); 
   } 
} 

使用以下命令從命令提示符編譯並執行儲存的 Java 檔案:

javac TokenizerMEExample.java 
java TokenizerMEExample

執行後,上述程式讀取給定的字串,檢測其中的句子並顯示以下輸出:

Hi 
. 
How 
are 
you 
? 
Welcome 
to 
Tutorialspoint 
. 
We 
provide 
free 
tutorials 
on 
various 
technologie

檢索標記的位置

我們還可以使用tokenizePos()方法獲取標記的位置或跨度。這是opennlp.tools.tokenize包中Tokenizer介面的方法。由於所有(三個)Tokenizer類都實現了此介面,因此您可以在所有類中找到此方法。

此方法接受字串形式的句子或原始文字,並返回一個Span型別物件的陣列。

您可以使用tokenizePos()方法獲取標記的位置,如下所示:

//Retrieving the tokens 
tokenizer.tokenizePos(sentence); 

列印位置(跨度)

名為Span的類屬於opennlp.tools.util包,用於儲存集合的起始和結束整數。

您可以將tokenizePos()方法返回的跨度儲存在 Span 陣列中並列印它們,如下面的程式碼塊所示。

//Retrieving the tokens 
Span[] tokens = tokenizer.tokenizePos(sentence);
//Printing the spans of tokens 
for( Span token : tokens)        
   System.out.println(token);

一起列印標記及其位置

String類的substring()方法接受beginend偏移量並返回相應的字串。我們可以使用此方法一起列印標記及其跨度(位置),如下面的程式碼塊所示。

//Printing the spans of tokens 
for(Span token : tokens)  
   System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));

示例(SimpleTokenizer)

以下是使用SimpleTokenizer類檢索原始文字的標記跨度的程式。它還列印標記及其位置。將此程式儲存到名為SimpleTokenizerSpans.java的檔案中。

import opennlp.tools.tokenize.SimpleTokenizer; 
import opennlp.tools.util.Span;  

public class SimpleTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  
       
      //Retrieving the boundaries of the tokens 
      Span[] tokens = simpleTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens)
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));          
   } 
}      

使用以下命令從命令提示符編譯並執行儲存的 Java 檔案:

javac SimpleTokenizerSpans.java 
java SimpleTokenizerSpans 

執行後,上述程式讀取給定的字串(原始文字),對其進行分詞,並顯示以下輸出:

[0..2) Hi 
[2..3) . 
[4..7) How 
[8..11) are 
[12..15) you 
[15..16) ? 
[17..24) Welcome 
[25..27) to 
[28..42) Tutorialspoint 
[42..43) . 
[44..46) We 
[47..54) provide 
[55..59) free 
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies 

示例(WhitespaceTokenizer)

以下是使用WhitespaceTokenizer類檢索原始文字的標記跨度的程式。它還列印標記及其位置。將此程式儲存到名為WhitespaceTokenizerSpans.java的檔案中。

import opennlp.tools.tokenize.WhitespaceTokenizer;
import opennlp.tools.util.Span; 
public class WhitespaceTokenizerSpans {  
   public static void main(String args[]){ 
     
      String sent = "Hi. How are you? Welcome to Tutorialspoint. " 
         + "We provide free tutorials on various technologies"; 
    
      //Instantiating SimpleTokenizer class 
      WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE;  
       
      //Retrieving the tokens 
      Span[] tokens = whitespaceTokenizer.tokenizePos(sent);  
       
      //Printing the spans of tokens 
      for( Span token : tokens) 
         System.out.println(token +" 
            "+sent.substring(token.getStart(), token.getEnd()));        
   } 
} 

使用以下命令從命令提示符編譯並執行儲存的 java 檔案

javac WhitespaceTokenizerSpans.java 
java WhitespaceTokenizerSpans

執行後,上述程式讀取給定的字串(原始文字),對其進行分詞,並顯示以下輸出。

[0..3) Hi. 
[4..7) How 
[8..11) are 
[12..16) you? 
[17..24) Welcome 
[25..27) to 
[28..43) Tutorialspoint. 
[44..46) We 
[47..54) provide 
[55..59) free
[60..69) tutorials 
[70..72) on 
[73..80) various 
[81..93) technologies

示例(TokenizerME)

以下是使用TokenizerME類檢索原始文字的標記跨度的程式。它還列印標記及其位置。將此程式儲存到名為TokenizerMESpans.java的檔案中。

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span;  

public class TokenizerMESpans { 
   public static void main(String args[]) throws Exception{     
      String sent = "Hello John how are you welcome to Tutorialspoint"; 
       
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
       
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel); 
       
      //Retrieving the positions of the tokens 
      Span tokens[] = tokenizer.tokenizePos(sent); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
   } 
} 

使用以下命令從命令提示符編譯並執行儲存的 Java 檔案:

javac TokenizerMESpans.java 
java TokenizerMESpans

執行後,上述程式讀取給定的字串(原始文字),對其進行分詞,並顯示以下輸出:

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint 

分詞機率

TokenizerME 類的 getTokenProbabilities() 方法用於獲取與最近對 tokenizePos() 方法的呼叫相關的機率。

//Getting the probabilities of the recent calls to tokenizePos() method 
double[] probs = detector.getSentenceProbabilities(); 

以下是列印與對 tokenizePos() 方法的呼叫相關的機率的程式。將此程式儲存到名為TokenizerMEProbs.java的檔案中。

import java.io.FileInputStream; 
import java.io.InputStream; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span;  

public class TokenizerMEProbs { 
   
   public static void main(String args[]) throws Exception{     
      String sent = "Hello John how are you welcome to Tutorialspoint"; 
      
      //Loading the Tokenizer model 
      InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); 
      TokenizerModel tokenModel = new TokenizerModel(inputStream); 
      
      //Instantiating the TokenizerME class 
      TokenizerME tokenizer = new TokenizerME(tokenModel);
      
      //Retrieving the positions of the tokens 
      Span tokens[] = tokenizer.tokenizePos(sent); 
       
      //Getting the probabilities of the recent calls to tokenizePos() method 
      double[] probs = tokenizer.getTokenProbabilities(); 
       
      //Printing the spans of tokens 
      for(Span token : tokens) 
         System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));      
         System.out.println("  "); 
         for(int i = 0; i<probs.length; i++) 
            System.out.println(probs[i]);          
   } 
}      

使用以下命令從命令提示符編譯並執行儲存的 Java 檔案:

javac TokenizerMEProbs.java 
java TokenizerMEProbs 

執行後,上述程式讀取給定的字串並對句子進行分詞並列印它們。此外,它還返回與最近對 tokenizerPos() 方法的呼叫相關的機率。

[0..5) Hello 
[6..10) John 
[11..14) how 
[15..18) are 
[19..22) you 
[23..30) welcome 
[31..33) to 
[34..48) Tutorialspoint 
   
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0
廣告
© . All rights reserved.