MacでHyper Estraierを使う

2015-06-18 (木) 09:20:26 (3465d) | Topic path: Top / テキスト・マイニング / MacでHyper Estraierを使う

はじめに

Hyper Estraier」は,平林幹雄さんによって開発された全文検索システムです.

次の環境で確認しました.

  • Mac OS X 10.6.1
  • MeCab 0.98
  • zlib 1.2.3
  • QDBM 1.8.77
  • Hyper Estraier 1.4.13

必要なもの

  • make
  • gcc
  • zlib
  • QDBM
  • MeCab

MeCabはなくてもかまいません. MeCabのダウンロードとインストールについては「MacでMeCabを使う」を参照のこと.

ダウンロード

zlib

current releaseのtar.gz formatのところにある「US (www.zlib.net)」をクリックしてzlib-1.2.3.tar.gzをダウンロードします.

QDBM

ダウンロードのところにある「最新のソース・パッケージ(バーション 1.8.77)」をクリックしてqdbm-1.8.77.tar.gzをダウンロードします.

Hyper Estraier

ダウンロードのところにある「最新のソース・パッケージ(バーション1.4.13)」をクリックしてhyperestraier-1.4.13.tar.gzをダウンロードします.

インストール

zlib

ダウンロードしたzlib-1.2.3.tar.gzをダブル・クリックして展開します.

ターミナルを起動して展開されたディレクトリーに移動し,次を実行します.

./configure
make
sudo make install

QDBM

ダウンロードしたqbdm-1.8.77.tar.gzをダブル・クリックして展開します.

ターミナルを起動して展開されたディレクトリーに移動し,次を実行します.

./configure --enable-zlib
make mac
make check-mac
sudo make install-mac

Hyper Estraier

ダウンロードしたhyperestraier-1.4.13.tar.gzをダブル・クリックして展開します.

ターミナルを起動して展開されたディレクトリーに移動し,次を実行します.

./configure --enable-zlib --enable-mecab
make mac
make check-mac
sudo make install-mac

MeCabを使わない場合は--enable-mecabを省略します.

Yosemite (10.10) だと

ld: symbol(s) not found for architecture x86_64

というエラーが出てコンパイル(正確にはコンパイル後のリンク)ができなくなりました.

そこで,configureした後にMakefileの

LIBS = -lqdbm -lz -liconv -lm -lc

の行の最後に -stdlib=libstdc++ を追加し,

LIBS = -lqdbm -lz -liconv -lm -lc -stdlib=libstdc++

としたらコンパイルできました.

使い方

インデックスの作成

estcmd create -acc -xs index

-accでN-gramの替わりに形態素解析を使用,-xsで文書数が50,000件未満,indexでインデックス名を指定しています.

文書の追加

estcmd gather -ft -il ja -lt -1 -um index path

-ftでプレーン・テキストを指定,-il jaで日本語を指定,-lt -1ですべてのテキストを解析,-umでMeCabを使用,indexでインデックス名を指定,pathで文書が格納されているディレクトリーのパスを指定しています.

インデックスの最適化

estcmd optimize index

文書の検索

estcmd search -vh index '検索 OR search'

-vhでスニペット付きの見やすい形で表示,indexでインデックス名を指定,検索 OR searchで検索式を指定しています.

Xcodeによるプログラミング

プログラミング・ガイド」のプログラムがそのまま動きます.

新規プロジェクトを「Application」の「Command Line Tool」でTypeを「C」にして作成し,main.cにサンプル・プログラムを貼付けます.

プロジェクトを選択して「情報」を開き,「ビルド」の「ライブラリ検索パス」に「/usr/local/lib」,「ヘッダ検索パス」に「/usr/local/include」,「他のリンカフラグ」に「-lm -liconv -lz -lqdbm -pthread -lresolv -lestraier」を追加します*1. プログラミング・ガイドには「-lnsl」も必要と書いてありますが,Mac OS Xでは不要です.(付けるとコンパイルできません.)

実行可能ファイルを選択して「情報」を開き,インデックスがあるディレクトリーを「作業ディレクトリの設定先」に指定すれば,「ビルドと実行」ができます.

検索スコアを取得する

検索スコアを取得するプログラムを作成しました.

/*
 *  search.c
 *  search for Hyper Estraier
 *
 *
 *  ./search NAME QUERY
 *
 *  NAME   インデックス名
 *  QUERY  クエリー
 *
 *
 *  Created by Tohgoroh Matsui on 2011.05.16
 */

#include <estraier.h>
#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[]) {
  const char *name  = argv[1];  // インデックス名
  const char *query = argv[2];  // クエリー

  ESTDB *db;
  ESTCOND *cond;
  int ecode, *res, num;

  int i;

  if (!(db = est_db_open(name, ESTDBREADER, &ecode))) {
    fprintf(stderr, "Error: %s\n", est_err_msg(ecode));
    return 1;
  }

  cond = est_cond_new();                      // 検索条件
  est_cond_set_phrase(cond, query);           // クエリー
  est_cond_set_options(cond, ESTCONDSCFB);    // スコア取得オプション
  res = est_db_search(db, cond, &num, NULL);  // 検索

  for (i = 0; i < num; i++) {
    // 検索された文書のidとスコアを表示
    printf("%d, %d\n", res[i], est_cond_score(cond, i));
  }

  est_cond_delete(cond);
  free(res);

  if (!est_db_close(db, &ecode)) {
    fprintf(stderr, "Error: %s\n", est_err_msg(ecode));
    return 1;
  }

  return 0;	
}

検索スコアを取得するには,検索を実行する前に検索条件にESTCONDSCFBオプションをセットします.

参考文献


*1 「ライブラリ検索パス」と「ヘッダ検索パス」に追加するパスはzlibとQDBMのインストール先に依存します.
トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS