CJKTokenizerFactory と NGramTokenizerFactory の動作の違い


祝 Lucene2.9.0 リリース!!
2009/9/25 に Lucene2.9 がようやく正式リリースされました。
便乗して久しぶりの Solr ネタです。


この記事は Lucene2.9.0 がバンドルされている 2009/09/28版の Solr をもとに書いています。
http://people.apache.org/builds/lucene/solr/nightly/solr-2009-09-28.tgz


日本語の文章をインデキシングするときによく使われるトークナイザとして CJKTokenizerFactory があります。
CJKTokenizerFactory は 基本的には 2-gram (別名 bi-gram, bigram ) なので
NGramTokenizerFactory で maxGramSize="2"としたときと
基本的には同じように動作するのですが、いくつか違うところがあります。

  • CJKTokenizerFactory は連続する英数文字は何文字であっても分解せずに1語とします。
  • CJKTokenizerFactory はアルファベットの大文字を小文字に自動で変換(ノーマライズ)してくれます。
  • 両者ともアルファベットの全角を半角に自動で変換してくれます。


以下の例文をトークナイズして見た例です。

僕はBMW318tiが好きだ

BMWは半角大文字、318は半角数字、tiは全角小文字です。

  • CJKTokenizerFactory の場合

  • 2-gram の場合 ( NGramTokenizerFactory で maxGramSize="2" minGramSize="2" にした場合 )


このテストに使ったフィールドタイプの定義例です。


 
  
 



 
  
 


1-gram ( 別名 uni-gram, unigram ) 代わりによく使われる StandardTokenizerFactory も CJKTokenizerFactory と同じようにに連続する英数文字は1語としてトークナイズします。


状況に応じて使い分けると便利ですね。


ではでは