*はじめに [#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]]