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

| Topic path: Top / テキスト・マイニング / SennaのRubyバインディングを使う

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

ここでは,その使い方についてメモしておきます.
MacへSennaをインストールする方法については[[こちらのページ>テキスト・マイニング/MacでSennaを使う]]を参照してください.

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


*ログ [#e8c28ad3]
ログは/var/senna/log/senna.logに出力されます.
そこで,ディレクトリーを作成し,権限を与えます.
#geshi(bash){{
$ sudo mkdir /var/senna/log
$ sudo chmod 755 /var/senna/log
}}

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

ただし,ログ・ファイルのサイズがものすごい勢いで大きくなるため,必要がないときは書き込みを禁止しておきます.
#geshi(bash){{
$ rm /var/senna/log/senna.log
$ touch /var/senna/log/senna.log
$ chmod 444 /var/senna/log/senna.log
}}


*ポイント [#x73a562f]

SennaのAPIが文字列の終端の判定をNULL文字で行っているため,Rubyでは文字列の最後にNULL文字(0x00)を追加する必要があります.
(C言語では文字列の終端がNULL文字で表されるため,明示的に追加する必要はありません.)
#geshi(ruby){{
def append_nullchar(s)
  return (s.unpack("C*") + [0x00]).pack("C*")
end
}}

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


*サンプル・プログラム [#q70c7782]

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

インデックスの文字コードはutf-8にしています.
そこで,プログラムもutf-8で作成します.
#geshi(ruby){{
# -*- 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;
}}


*参考情報 [#r65c9d27]

-[[Senna 組み込み型全文検索エンジン:http://qwik.jp/senna/FrontPageJ.html]]
-[[RubyでSennaを使って全文検索を行う -STBBS.NET blog:http://www.stbbs.net/blog/2007/11/ruby-senna.html]]
-[[RubySenna - Greenbear Laboratory:http://mono.kmc.gr.jp/~yhara/w/?RubySenna]]
-[[senna&mecab - junoのへたれサーバ管理日記:http://juno106.seesaa.net/category/2042908-1.html]]
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS