SennaのRubyバインディングを使う

2009-06-05 (金) 10:25:35 (2945d) | Topic path: Top / テキスト・マイニング / SennaのRubyバインディングを使う

はじめに

組み込み型全文検索エンジンSennaには標準でRubyバインディングがついてきます.

ここでは,その使い方についてメモしておきます. MacへSennaをインストールする方法についてはこちらのページを参照してください.

Mac OS X 10.5.7とSenna 1.1.4とRuby 1.9.1で確認しました.

ログ

ログは/var/senna/log/senna.logに出力されます. そこで,ディレクトリーを作成し,権限を与えます.

$ sudo mkdir /var/senna/log
$ sudo chmod 755 /var/senna/log

Sennaがうまく動かないときは,このログに書き込まれたエラー・メッセージを確認して原因を推測します.

ただし,ログ・ファイルのサイズがものすごい勢いで大きくなるため,必要がないときは書き込みを禁止しておきます.

$ rm /var/senna/log/senna.log
$ touch /var/senna/log/senna.log
$ chmod 444 /var/senna/log/senna.log

ポイント

SennaのAPIが文字列の終端の判定をNULL文字で行っているため,Rubyでは文字列の最後にNULL文字(0x00)を追加する必要があります. (C言語では文字列の終端がNULL文字で表されるため,明示的に追加する必要はありません.)

def append_nullchar(s)
  return (s.unpack("C*") + [0x00]).pack("C*")
end

文字列の最初が「 」(空白)だとなぜかインデックスが作成されません.

サンプル・プログラム

インデックスを作成し,4つの文章を登録し,インデックスの内容を表示します.

インデックスの文字コードはutf-8にしています. そこで,プログラムもutf-8で作成します.

# -*- encoding: utf-8 -*-

require 'senna'

# 文字列の最後にNULL文字を追加するメソッド
def append_nullchar(s)
  return (s.unpack("C*") + [0x00]).pack("C*")
end


# インデックスtestを作成します
index = Senna::Index.create("test",0,0,0,Senna::ENC_UTF8)

# インデックスに文章を追加します
index.upd('0001', nil, append_nullchar('プログラミング言語を勉強しました.'))
index.upd('0002', nil, append_nullchar('私は言語学者ではありません.'))
index.upd('0003', nil, append_nullchar(' 私が使用している言語は日本語です.'))
index.upd('0004', nil, append_nullchar('仕事のためにこのプログラムを作りました.'))

# インデックスを検索します
rcs = index.sel(append_nullchar('言語'))
if rcs != nil
  print rcs.nhits, "\n" 
  while rcs.next != nil
    print rcs.curr_key, "\n"
  end
end

index.close;


# sen_symインスタンスを開きます
sym=Senna::Sym.open("test.SEN.l")
print "Open ", sym, "\n"

size = sym.size
print "size=", size, "\n"

# sen_symインスタンスに登録されているデータを表示します.
for i in (1..size) do
  len, s = sym.key(i)
  # printf "%d : %d : %s \n", i, len, s
  printf "%d : %d : %s : %s\n", i, len, s.unpack("H*"), s;
end

sym.close;

参考情報

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS