OpenNLP - 标记化
将给定的句子切成更小的部分(标记)的过程称为标记化。通常,给定的原始文本基于一组分隔符(主要是空格)进行标记化。
标记化用于拼写检查、处理搜索、识别词性、句子检测、文档的文档分类等任务。
使用 OpenNLP 进行标记化
opennlp.tools.tokenize 包包含用于执行标记化的类和接口。
为了将给定的句子标记为更简单的片段,OpenNLP 库提供了三个不同的类 −
SimpleTokenizer −此类使用字符类对给定的原始文本进行标记。
WhitespaceTokenizer − 此类使用空格对给定的文本进行标记。
TokenizerME − 此类将原始文本转换为单独的标记。它使用最大熵来做出决策。
SimpleTokenizer
要使用 SimpleTokenizer 类对句子进行标记,您需要 −
创建相应类的对象。
使用 tokenize() 方法对句子进行标记。
打印标记。
以下是编写对给定原始文本进行标记的程序所要遵循的步骤。
步骤 1 − 实例化相应的类
在这两个类中,都没有可用于实例化的构造函数。因此,我们需要使用静态变量 INSTANCE 创建这些类的对象。
SimpleTokenizer tokenizer = SimpleTokenizer.INSTANCE;
步骤 2 − 对句子进行标记
这两个类都包含一个名为 tokenize() 的方法。此方法接受字符串格式的原始文本。在调用时,它会对给定的字符串进行标记并返回一个字符串(标记)数组。
使用 tokenizer() 方法对句子进行标记,如下所示。
//对给定的句子进行标记 String tokens[] = tokenizer.tokenize(sentence);
步骤 3 − 打印标记
对句子进行标记后,可以使用 for 循环 打印标记,如下所示。
//打印标记 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"; //实例化 SimpleTokenizer 类 SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE; //对给定的句子进行标记 String tokens[] = simpleTokenizer.tokenize(sentence); //打印令牌 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() 方法对句子进行标记,如下所示。
//对给定的句子进行标记 String tokens[] = tokenizer.tokenize(sentence);
步骤 3 − 打印标记
对句子进行标记后,可以使用 for 循环 打印标记,如下所示。
//打印标记 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"; //实例化 whitespaceTokenizer 类 WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE; //标记给定的段落 String tokens[] = whitespaceTokenizer.tokenize(sentence); //打印令牌 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(对象)作为参数传递给其构造函数,如以下代码块所示。
//加载标记器模型 InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); TokenizerModel tokenModel = new TokenizerModel(inputStream);
步骤 2 − 实例化 TokenizerME 类
包 opennlp.tools.tokenize 的 TokenizerME 类包含将原始文本切分为较小部分(标记)的方法。它使用最大熵来做出决策。
实例化此类并传递上一步中创建的模型对象,如下所示。
//实例化 TokenizerME 类 TokenizerME tokenizer = new TokenizerME(tokenModel);
步骤 3 −对句子进行标记化
TokenizerME 类的 tokenize() 方法用于对传递给它的原始文本进行标记化。此方法接受 String 变量作为参数,并返回一个字符串(标记)数组。
通过将句子的 String 格式传递给此方法来调用此方法,如下所示。
//对给定的原始文本进行标记化 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"; //加载 Tokenizer 模型 InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); TokenizerModel tokenModel = new TokenizerModel(inputStream); //实例化 TokenizerME 类 TokenizerME tokenizer = new TokenizerME(tokenModel); //对给定的原始文本进行标记 String tokens[] = tokenizer.tokenize(sentence); //打印标记 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() 方法获取标记的位置或 span。这是 opennlp.tools.tokenize 包的 Tokenizer 接口的方法。由于所有(三个)Tokenizer 类都实现了此接口,因此您可以在所有类中找到此方法。
此方法以字符串形式接受句子或原始文本,并返回 Span 类型的对象数组。
您可以使用 tokenizePos() 方法获取标记的位置,如下所示 −
//检索标记 tokenizer.tokenizePos(sentence);
打印位置(跨度)
opennlp.tools.util 包中名为 Span 的类用于存储集合的起始和终止整数。
您可以将 tokenizePos() 方法返回的跨度存储在 Span 数组中并打印它们,如下面的代码块所示。
//检索标记 Span[] tokens = tokenizer.tokenizePos(sentence); //打印标记的跨度 for( Span token : tokens) System.out.println(token);
一起打印标记及其位置
String 类的 substring() 方法接受 begin 和 end 偏移量并返回相应的字符串。我们可以使用此方法一起打印标记及其跨度(位置),如以下代码块所示。
//打印标记的跨度 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"; //实例化 SimpleTokenizer 类 SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE; //Retrieving the boundaries of the tokens Span[] tokens = simpleTokenizer.tokenizePos(sent); //打印标记的跨度 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"; //实例化 SimpleTokenizer 类 WhitespaceTokenizer whitespaceTokenizer = WhitespaceTokenizer.INSTANCE; //检索令牌 Span[] tokens = whitespaceTokenizer.tokenizePos(sent); //打印标记的跨度 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"; //加载Tokenizer模型 InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); TokenizerModel tokenModel = new TokenizerModel(inputStream); //实例化TokenizerME类 TokenizerME tokenizer = new TokenizerME(tokenModel); //检索标记的位置 Span tokens[] = tokenizer.tokenizePos(sent); //打印标记的跨度 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
Tokenizer 概率
TokenizerME 类的 getTokenProbabilities() 方法用于获取与最近调用 tokenizePos() 方法相关的概率。
//获取最近调用 tokenizePos() 方法的概率 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"; //加载Tokenizer模型 InputStream inputStream = new FileInputStream("C:/OpenNLP_models/en-token.bin"); TokenizerModel tokenModel = new TokenizerModel(inputStream); //实例化TokenizerME类 TokenizerME tokenizer = new TokenizerME(tokenModel); //检索标记的位置 Span tokens[] = tokenizer.tokenizePos(sent); //获取最近调用 tokenizePos() 方法的概率 double[] probs = tokenizer.getTokenProbabilities(); //打印标记的跨度 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