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.tokenizeTokenizerME 类包含将原始文本切分为较小部分(标记)的方法。它使用最大熵来做出决策。

实例化此类并传递上一步中创建的模型对象,如下所示。

//实例化 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() 方法接受 beginend 偏移量并返回相应的字符串。我们可以使用此方法一起打印标记及其跨度(位置),如以下代码块所示。

//打印标记的跨度
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