Perl Module Reference for Ver.2.1

中山宅也(takya-n@is.aist-nara.ac.jp)
last update 981115

SUFARY(http://cl.aist-nara.ac.jp/lab/nlt/ss/)


■ 表記
 $SUFRAY : SUFARYパッケージを展開したディレクトリ


■■■ はじめに

Perl は，ちょっとしたプログラムを書くのには非常に便利な言語です．ただ
し，大規模なファイルの検索などをするには，処理速度がやや遅いのが気にな
ります．そこで，SUFARY を Perl から使いたいという要望が出てくるわけで
すが，SUFARY を Perl から使うには次のような方法があります．

・パイプ処理を用いて，対話型検索プログラム array と通信する．
・Perl用の SUFARY モジュールを作って，Perl から SUFARY のライ
  ブラリに直接アクセスできるようにする．

SUFARY パッケージでは後者の方法を採用して，Perlモジュールを同梱してい
ます．

モジュールを使うには，次の記述をスクリプトの先頭付近に加えます．もちろ
ん，インストールガイド(README)に従って，先に SUFARY Perl Module をイン
ストールしておいて下さい．
------
BEGIN{
  $sufdir = "SUFARY Perl Module をインストールしたディレクトリ名";
  unshift(@INC, "$sufdir", "$sufdir/blib/lib", "$sufdir/blib/arch");
}
use SUFARY;
------

記事取り出し処理を Perl から利用する場合，BEGIN {...} に以下の行を足し
て下さい．
------
  $diddir = "DID Perl Module をインストールしたディレクトリ名";
  unshift(@INC, "$diddir", "$diddir/blib/lib", "$diddir/blib/arch");
------

変数 $sufdir, $diddir には，それぞれの環境に合わせて設定して下さい
モジュールを make install した場合は BEGIN {...} の記述は不要です．

このモジュールを使うことで，SUFARY オブジェクトが使用可能になります．
具体的な使用方法は，後述のサンプルプログラム１か，
$SUFARY/perl/SUFARY/test.perl を御参照下さい．また，記事取り出し処理の
ための DID オブジェクトも使用可能になります．具体的な使用方法は，後述
のサンプルプログラム２か，$SUFARY/perl/SUFARY/testdid.perl を御参照下
さい．

ここでは SUFARY オブジェクトと DID オブジェクトのメソッドをリストアッ
プします．

■■■ SUFARY メソッド

★new TEXT_FILE [ARRAY_FILE]

SUFARY オブジェクトを生成します．mkary を使って array ファイルを作製し
ておく必要があります．ファイルの読み込みに失敗したときは，undef を返し
ます．生成できるオブジェクト数の上限は，255です．

★reopen TEXT_FILE [ARRAY_FILE]

既に生成したオブジェクトの保持するデータファイルを変更します．ファイル
の読み込みに失敗すると，返り値が 0 に成功すると 1 になります．

★close()

特に使うことは無いと思いますが，オブジェクトが開いたファイルを閉じます．

★init()

検索対象をテキスト全体にする．$SUFARY/array/array の init と等価．

★search0(KEY)

追加検索．KEY で文字列を検索します．$SUFARY/array/array の search と等
価．検索結果は，line(), lid(), get_all_line(), get_all_lid() で取得で
きます．

★search(KEY)

通常検索．KEY で文字列を検索します．init() + search0() と等価．

★line(NUM)

検索結果の NUM 番目の結果を含む行を文字列で返します．

★lid(NUM)

検索結果の NUM 番目の結果を含む行の行ID番号を返します．行ID番号とはテ
キスト中でのその行の開始位置のことです．

★get_all_pos()

検索にマッチしたテキストの位置 を一括して取得します．返り値はマッチし
たテキストの位置の配列へのリファレンスです．

★get_all_line()

検索にマッチした行を一括して文字列として取得します．返り値はマッチ行の
配列へのリファレンスです．

★get_all_lid()

検索にマッチした行の 行ID番号 を一括して取得します．返り値はマッチ行ID
番号 の配列へのリファレンスです．行ID番号とはテキスト中でのその行の開
始位置のことです．

★getstr(IDX, LEN)

検索対象テキストの IDX 番目から LEN 文字取り出して文字列として返します．

★id2line(IDX)

検索対象テキストの IDX 番目の文字を含む行を返します．

★get_block(IDX, D1, D2)

検索対象テキストの IDX 番目の文字を含む，文字列 D1 と文字列 D2に囲まれ
たデータを，文字列で返します．

★pid2lid(IDX)

検索対象テキストの IDX 番目の文字を含む行の行ID番号を返します．行ID番
号とはテキスト中でのその行の開始位置のことです．
  
★common_prefix(KEY, SEP)

Common Prefix Search を行ないます．KEY で検索キーを，SEP で区切り文字
を指定します(詳しくは，Cライブラリの sa_common_prefix_search() の解説
を御参照下さい)．マッチしたテキストの位置の配列のリファレンスを返しま
す．

■■■ DID メソッド

★new DOCID_FILE

DID オブジェクトを生成します．mkdid を使って DocID ファイルを作製して
おく必要があります．ファイルの読み込みに失敗したときは，undef を返しま
す．生成できるオブジェクト数の上限は，255です．

★reopen DOCID_FILE

既に生成したオブジェクトの保持するデータファイルを変更します．ファイル
の読み込みに失敗すると，返り値が 0 に成功すると 1 になります．

★close()

特に使うことは無いと思いますが，オブジェクトが開いたファイルを閉じます．

★did_size()

DocID ファイルに含まれる記事の数を返します．

★didsearch(IDX)

テキスト中の IDX 文字目の文字が含まれる記事を探します．返し値は，記事
の通し番号，テキスト中での記事の開始位置，記事の文字数のリストです．該
当する記事が見つからなかった場合，記事の通し番号が -1 になります．

■■■ サンプルプログラム

★サンプルプログラム１(基本的な検索)
------
#!/usr/local/bin/perl
BEGIN {
    $sufdir = "/home/tatuo-y/work/sufary/sufary/perl/SUFARY";
    unshift(@INC, "$sufdir", "$sufdir/blib/lib", "$sufdir/blib/arch");
}
use SUFARY;

$x = SUFARY->new("/home/tatuo-y/work/sufary/sufary/sample.txt");
$nx = $x->search("歴史"); # 検索！
print "FOUND $nx\n";

# 表示 1
for ($i = 0; $i < $nx; $i++){
    print "[$i]\t",$x->line($i),"\n";
    print "\t↑この行はテキストの先頭から数えて ",$x->lid($i)," 文字目から始まります\n";
}

# 表示 2
$tmp = $x->get_all_pos;
foreach $i (@$tmp) {
    print ">>>\t",$x->id2line($i),"\n";
    print "\t↑この行はテキストの先頭から数えて ",$x->pid2lid($i)," 文字目から始まります\n";
    print "\tキーワードはテキストの先頭から数えて $i 文字目にありました\n";
    print "\tこの行は以下の記事に含まれています\n",$x->get_block($i,'<DOC>','</DOC>'),"\n";
}

$x->close();
------

★サンプルプログラム２(DocIDを用いた検索)
------
#!/usr/local/bin/perl
BEGIN {
    $sufdir = "/home/tatuo-y/work/sufary/sufary/perl/SUFARY";
    unshift(@INC, "$sufdir", "$sufdir/blib/lib", "$sufdir/blib/arch");
    $diddir = "/home/tatuo-y/work/sufary/sufary/perl/DID";
    unshift(@INC, "$diddir", "$diddir/blib/lib", "$diddir/blib/arch");
}
use SUFARY;
use DID;

$x = SUFARY->new("/home/tatuo-y/work/sufary/sufary/sample.txt");
$d = DID->new("/home/tatuo-y/work/sufary/sufary/sample.txt.did");

# AND検索をやってみる  '自然&歴史'
$n = $x->search("自然");
$tmp = $x->get_all_pos;
foreach $i (@$tmp) {
    ($doc_no, $start, $size) = $d->didsearch($i);
    if($doc_no != -1){$check[$doc_no] = 1;}
}
$n = $x->search("歴史");
$tmp = $x->get_all_pos;
foreach $i (@$tmp) {
    ($doc_no, $start, $size) = $d->didsearch($i);
    if($doc_no != -1 && $check[$doc_no] == 1){
	print $x->getstr($start,$size),"\n";
	$check[$doc_no] = 0;
    }
}

$d->close();
$x->close();
------

