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