関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
<< 64ビットプラットフォームで絶対お勧めのLuceneのMMapDirectory (Uwe氏のブログより) | main | StatsComponent の標準偏差について >>
Lucene 4.4 の FST を使って FSA を構築する
Lucene 4.4(別に4.4と特定することもないのだが)のFSTを使ってFSA(有限状態オートマトン)を実装する機会があったので、簡単に使い方を紹介しよう。ここでは次のような単語をFSAに登録し、あとからFSA辞書に単語があるかどうかを問い合わせられるプログラムを作成する。

String[] KEYS = {"あいだ", "あいぼう", "あたぼう", "いいだ"};


プログラムは次の通りで、非常に簡単である。

public class TestFSA {

  public static void main(String[] args) throws IOException {
    String[] KEYS = {"あいだ", "あいぼう", "あたぼう", "いいだ"};     // (1)
    final Object outputValue = new Object();                          // (2)
    
    NoOutputs outputs = NoOutputs.getSingleton();                     // (3)
    Builder<Object> builder = new Builder<Object>(INPUT_TYPE.BYTE4, outputs);    // (4)
    BytesRef scratchBytes = new BytesRef();
    IntsRef scratchInts = new IntsRef();
    for (String key : KEYS) {                                         // (5)
      scratchBytes.copyChars(key);
      builder.add(Util.toIntsRef(scratchBytes, scratchInts), outputValue);
    }
    FST<Object> fst = builder.finish();                               // (6)

    getAndPrint(fst, "あかだ");                                       // (7)
    getAndPrint(fst, "いまだ");
    getAndPrint(fst, "いいだ");
    getAndPrint(fst, "いいだあ");
    getAndPrint(fst, "いい");
    getAndPrint(fst, "あたぼう");
  }
  
  static void getAndPrint(FST<Object> fst, String key) throws IOException {
    Object value = Util.get(fst, new BytesRef(key));
    System.out.printf("%s is %s¥n", key, value == null ? "not accepted" : "accepted");
  }
}


以下簡単にプログラムの説明をする。
  1. FSA辞書に登録する単語一覧である。(5)のfor文の中でこの順番に登録されるが、あらかじめソートされている必要がある。
  2. FSTはもともと登録する単語に関連した値(出力)を持たせることができるが、今回は単なるFSAとして使うので、出力値は不要である。しかし、nullは指定できないので、ここで固定にダミーのObjectを生成している。
  3. 出力の不要なFSAではNoOutputsを取得する。
  4. (3)で取得したoutputsを指定してFSTのbuilderを取得する。
  5. (1)の単語をbuilderにadd()する。
  6. 単語を登録し終わったら、builderからFSTを生成する。
  7. FSA辞書を使って単語を引いてみる。実際にはfstパッケージ内のUtilクラスのget()メソッドを使って、出力を得ている。単語がない場合(FSAが文字列を受理しない場合)、結果はnullとなる。nullでなければ単語は辞書に登録されている。


実行結果は次のようになる。プログラムのコンパイルと実行には、lucene-core-4.4.0.jarがあればよい。

あかだ is not accepted
いまだ is not accepted
いいだ is accepted
いいだあ is not accepted
いい is not accepted
あたぼう is accepted
| 関口宏司 | Luceneクラス解説 | 17:13 | comments(0) | trackbacks(0) |









http://lucene.jugem.jp/trackback/475
+ Solrによるブログ内検索
+ PROFILE
 123456
78910111213
14151617181920
21222324252627
28293031   
<< May 2017 >>
+ LINKS
検索エンジン製品 - 比較のポイント
商用検索エンジンを購入した企業担当者は読まないでください。ショックを受けますから・・・
>>製品比較 10のポイント
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
Apache Solr入門 ―オープンソース全文検索エンジン
Apache Solr入門 ―オープンソース全文検索エンジン (JUGEMレビュー »)
関口 宏司,三部 靖夫,武田 光平,中野 猛,大谷 純
+ RECOMMEND
Lucene in Action
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless
FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
qrcode
+ SPONSORED LINKS