📅  最后修改于: 2020-11-23 03:55:28             🧑  作者: Mango
将给定的句子切成较小的部分(令牌)的过程称为标记化。通常,给定的原始文本是基于一组定界符(主要是空白)来标记的。
令牌化用于诸如拼写检查,处理搜索,识别语音部分,句子检测,文档的文档分类等任务中。
opennlp.tools.tokenize软件包包含用于执行标记化的类和接口。
为了将给定的句子标记为更简单的片段,OpenNLP库提供了三种不同的类-
SimpleTokenizer-此类使用字符类标记给定的原始文本。
WhitespaceTokenizer-此类使用空格标记给定文本。
TokenizerME-此类将原始文本转换为单独的标记。它使用最大熵来做出决策。
要使用SimpleTokenizer类标记一个句子,您需要-
创建相应类的对象。
使用tokenize()方法对句子进行标记。
打印令牌。
以下是编写标记给定原始文本的程序所遵循的步骤。
步骤1-实例化相应的类
在这两个类中,都没有可用于实例化它们的构造函数。因此,我们需要使用静态变量INSTANCE创建这些类的对象。
SimpleTokenizer tokenizer = SimpleTokenizer.INSTANCE;
第2步-标记句子
这两个类都包含一个称为tokenize()的方法。此方法接受String格式的原始文本。调用时,它将标记给定的String并返回String(令牌)数组。
如下所示,使用tokenizer()方法对句子进行标记。
//Tokenizing the given sentence
String tokens[] = tokenizer.tokenize(sentence);
第3步-打印令牌
将句子标记化之后,可以使用for loop打印标记,如下所示。
//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
在执行时,上面的程序读取给定的String(原始文本),对其进行标记化,并显示以下输出-
Hi
.
How
are
you
?
Welcome
to
Tutorialspoint
.
We
provide
free
tutorials
on
various
technologies
要使用WhitespaceTokenizer类标记一个句子,您需要-
创建相应类的对象。
使用tokenize()方法对句子进行标记。
打印令牌。
以下是编写标记给定原始文本的程序所遵循的步骤。
步骤1-实例化相应的类
在这两个类中,都没有可用于实例化它们的构造函数。因此,我们需要使用静态变量INSTANCE创建这些类的对象。
WhitespaceTokenizer tokenizer = WhitespaceTokenizer.INSTANCE;
第2步-标记句子
这两个类都包含一个称为tokenize()的方法。此方法接受String格式的原始文本。调用时,它将标记给定的String并返回String(令牌)数组。
如下所示,使用tokenizer()方法对句子进行标记。
//Tokenizing the given sentence
String tokens[] = tokenizer.tokenize(sentence);
第3步-打印令牌
将句子标记化之后,可以使用for loop打印标记,如下所示。
//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
在执行时,上面的程序读取给定的String(原始文本),对其进行标记化,并显示以下输出。
Hi.
How
are
you?
Welcome
to
Tutorialspoint.
We
provide
free
tutorials
on
various
technologies
OpenNLP还使用预定义的模型(名为de-token.bin的文件)来标记句子。它经过训练可以将给定原始文本中的句子标记化。
opennlp.tools.tokenizer包的TokenizerME类用于加载此模型,并使用OpenNLP库标记给定的原始文本。为此,您需要-
使用TokenizerModel类加载en-token.bin模型。
实例化TokenizerME类。
使用此类的tokenize()方法对句子进行标记。
以下是编写程序的步骤,该程序使用TokenizerME类将给定原始文本中的句子标记化。
步骤1-加载模型
令牌化模型由名为TokenizerModel的类表示,该类属于包opennlp.tools.tokenize 。
加载令牌化器模型-
创建模型的InputStream对象(实例化FileInputStream并将String格式的模型路径传递给其构造函数)。
实例化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变量作为参数,并返回String(令牌)数组。
通过将句子的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
在执行时,上面的程序读取给定的String并检测其中的句子,并显示以下输出-
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数组中并进行打印,如下面的代码块所示。
//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)
以下是使用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
在执行时,上面的程序读取给定的String(原始文本),对其进行标记化,并显示以下输出-
[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
在执行时,上面的程序读取给定的String(原始文本),对其进行标记化,并显示以下输出。
[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
在执行时,上面的程序读取给定的String(原始文本),对其进行标记化,并显示以下输出-
[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
使用以下命令从命令提示符处编译并执行保存的Java文件-
javac TokenizerMEProbs.java
java TokenizerMEProbs
在执行时,上述程序读取给定的String并标记句子并打印出来。此外,它还返回与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