Opennlp-tokenization

提供:Dev Guides
移動先:案内検索

OpenNLP-トークン化

与えられた文を小さな部分(トークン)に切り刻むプロセスは、*トークン化*として知られています。 一般に、指定された生のテキストは、区切り文字(ほとんどが空白)のセットに基づいてトークン化されます。

トークン化は、スペルチェック、検索処理、品詞の識別、文の検出、ドキュメントのドキュメント分類などのタスクで使用されます。

OpenNLPを使用したトークン化

*opennlp.tools.tokenize* パッケージには、トークン化の実行に使用されるクラスとインターフェースが含まれています。

与えられた文をより単純なフラグメントにトークン化するために、OpenNLPライブラリは3つの異なるクラスを提供します-

  • 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 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 finddevguides. "
         + "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
finddevguides
.
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 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 finddevguides. "
         + "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
finddevguides.
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 *-モデルの読み込み

トークン化のモデルは、 opennlp.tools.tokenize パッケージに属する TokenizerModel というクラスで表されます。

トークナイザーモデルをロードするには-

  • モデルの 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.tokenizeTokenizerME クラスには、生のテキストを小さな部分(トークン)に切り分けるメソッドが含まれています。 最大エントロピーを使用して決定を行います。

以下に示すように、このクラスをインスタンス化し、前の手順で作成したモデルオブジェクトを渡します。

//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 finddevguides. "
            + "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
finddevguides
.
We
provide
free
tutorials
on
various
technologie

トークンの位置を取得する

  • tokenizePos()メソッドを使用して、トークンの位置または*スパン*を取得することもできます。 これは、パッケージ *opennlp.tools.tokenize のTokenizerインターフェイスのメソッドです。 すべての(3つの)トークナイザークラスがこのインターフェイスを実装しているため、すべてのクラスでこのメソッドを見つけることができます。

このメソッドは、文字列の形式の文または生のテキストを受け入れ、 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()メソッドは、 *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 finddevguides. "
         + "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) finddevguides
[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 finddevguides. "
         + "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) finddevguides.
[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 finddevguides";

     //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) finddevguides

トークナイザーの確率

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 finddevguides";

     //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) finddevguides

1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0