- 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