- OpenNLP 教程
- OpenNLP - 首頁
- OpenNLP - 概述
- OpenNLP - 環境配置
- OpenNLP - 參考 API
- OpenNLP - 句子檢測
- OpenNLP - 分詞
- 命名實體識別
- OpenNLP - 詞性標註
- OpenNLP - 句子分析
- OpenNLP - 句子分塊
- OpenNLP - 命令列介面
- OpenNLP 有用資源
- OpenNLP - 快速指南
- OpenNLP - 有用資源
- OpenNLP - 討論
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()方法接受begin和end偏移量並返回相應的字串。我們可以使用此方法一起列印標記及其跨度(位置),如下面的程式碼塊所示。
//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