OpenNLP - 标记化
将给定句子切成更小的部分(标记)的过程称为标记化。一般来说,给定的原始文本根据一组分隔符(主要是空格)进行标记。
标记化用于拼写检查、处理搜索、识别词性、句子检测、文档的文档分类等任务。
使用 OpenNLP 进行标记化
opennlp.tools.tokenize包包含用于执行标记化的类和接口。
为了将给定的句子标记为更简单的片段,OpenNLP 库提供了三个不同的类 -
SimpleTokenizer - 此类使用字符类标记给定的原始文本。
WhitespaceTokenizer - 此类使用空格来标记给定的文本。
TokenizerME - 此类将原始文本转换为单独的标记。它使用最大熵来做出决定。
简单分词器
要使用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类标记句子,您需要 -
创建相应类的对象。
使用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
分词器ME类
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 ()方法用于对传递给它的原始文本进行标记。此方法接受字符串变量作为参数,并返回字符串(标记)数组。
通过将句子的 String 格式传递给此方法来调用此方法,如下所示。
//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);
打印位置(跨度)
opennlp.tools.util包中名为Span的类用于存储集合的起始和结束整数。
您可以将tokenizePos()方法返回的 Span 存储在 Span 数组中并打印它们,如以下代码块所示。
//Retrieving the tokens Span[] tokens = tokenizer.tokenizePos(sentence); //Printing the spans of tokens for( Span token : tokens) System.out.println(token);
将代币及其位置打印在一起
String 类的 substring() 方法接受开始和结束偏移量并返回相应的字符串。我们可以使用此方法将标记及其跨度(位置)一起打印,如以下代码块所示。
//Printing the spans of tokens for(Span token : tokens) System.out.println(token +" "+sent.substring(token.getStart(), token.getEnd()));
示例(简单标记器)
以下是使用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