検索用ファイル作成ガイド

Last Modified: 1999-10-18

山下 達雄 Yamasita, Tatuo


Notation
$SUFRAY : SUFARYパッケージを展開したディレクトリを表します。

はじめに

SUFARY では検索対象テキストに対して以下の2種類の検索ができます。

文字列検索
検索キーワードがテキスト中の何文字目にあるかを調べます。
テキストエリア検索
テキストエリアとは、明確なタグで囲まれた部分文字列を意味します。例えば、 <atrticle>タグと</atrticle>タグとで囲まれた「記事」や、 <title>タグと</title>タグとで囲まれた「タイトル」などがこ れに当たります。テキストエリア検索は、検索キーワードを含むこれらのテキ ストエリアを探します。

どちらの検索を行うにしても、SUFARY では、 検索対象テキストごとに array ファイルを作る必要があります。

テキストエリア検索を行うためには、さらに DocID ファイルを作る必要があります。

// 検索用ファイルとそれを作成するプログラム //

検索用ファイル 使用目的 作成用プログラム
array ファイル SUFARYでの検索に必須 mkary
DocID ファイル テキストエリア検索  mkdid

SUFARY version 2.1b3 までは、array ファイルと DocID ファイルはバイトオー ダーの問題で、作成した環境 (CPU) に依存していました。version 2.1 からはバ イトオーダーは環境に依存せず常にビッグエンディアン (big endian) になって います。 2.1b3 以前の SUFARY を用いて、 リトルエンディアン環境で作成した array ファイル、DocID ファイルは 以下の方法でビッグエンディアンに変換できます。

% perl -e '$_ = join "", <>; s/(.)(.)(.)(.)/$4$3$2$1/gs; print' \
  foo.ary > foo.ary.new
% mv foo.ary.new foo.ary

array ファイルの作り方

どういう単位で検索をしたいかという要求によって、作成される array ファ イルが違ってきます。

例えば、文字単位で array ファイルを作ると、そのテキストに含まれる全て の部分文字列が検索できます。samp1.txt に対して文字単位で array ファイ ルを作ると、"YAMASITA" や "Tatuo" はもちろん、 "ASITA T" や "st-na" といっ た、半端な(?)文字列でも見つけることができます。

// samp1.txt //

YAMASITA Tatuo
tatuo-y@is.aist-nara.ac.jp
http://cl.aist-nara.ac.jp/~tatuo-y/

行単位で array ファイルを作ると、各行頭から始まる全ての文字列(prefix といいます)が検索できます。samp1.txt に対して行単位で array ファイルを 作ると、"YAMASITA", "YAM", "http" は見つかりますが、"aist" や "Tatuo" は行頭から始まる文字列ではないので、見つかりません。行単位の array ファ イルは samp2.txt のような辞書の検索に向いています。array ファイルのサ イズも文字単位のときよりも小さくなります。

// samp2.txt //

fish 魚
boy 男の子
girl 女の子

実際に array ファイルを作成するためのプログラムは $SUFARY/src/mkary です。

実行例

// 文字単位で array ファイルを作成 //

array% mkary /home/tatuo-y/data/ecoli
Save to "/home/tatuo-y/data/ecoli.ary"
Reading text file "/home/tatuo-y/data/ecoli"
++++++++++++++++++++ 1M
++++++++++++++++++++ 2M
++++++++++++++++++++ 3M
++++++++++++++++++++ 4M
++++++++++++
Sorting...
Saving...
Done.

// 行単位で array ファイルを作成 //

array% mkary -l samp2.txt
Save to "samp2.txt.ary"
Reading text file "samp2.txt.ary"
 
Sorting...
Saving...
Done.

検索結果を行単位で表示する簡単な検索プログラム sass ($SUFARY/tools/sass)を使って検索してみます。

% sass girl samp2.txt
19:0:girl 女の子
% sass boy samp2.txt
8:0:boy 男の子

書式

mkary [-c|w|l|b] [-#] [-q] [-ns] [-so] [-J] [-o ARRAY_FILE]
        [-M MEGABYTE] TEXT_FILE

TEXT_FILE でテキストファイル名を指定します。デフォルトでは、 TEXT_FILE.ary という名前の array ファイルが作成されます。

-o ARRAY_FILE
array ファイル名を指定できます。デフォルトは TEXT_FILE.ary。
-c
文字単位で array ファイルを作ります。テキスト中のあらゆる文字列がさが し出せます。日本語文字(EUC)は2バイトで一文字とみなします。 デフォルトです。
-l
行単位で array ファイルを作ります。各行頭から始まる全ての文字列(prefix といいます)が検索できます。辞書検索に向いています。
-w
単語単位で array ファイルを作ります。ここでいう単語とは、改行文字、ス ペース、タブで区切られる文字列を指します。
-b
バイト単位で array ファイルを作ります。
-J
文字単位で array ファイルを作るとき、日本語文字(EUC)と '<' 以外は無視 します。日本語(EUC)以外で始まる文字列は '<' で始まるタグを除いて、検索 できなくなりますが、array ファイルのサイズは小さくなります。
-q
実行中にメッセージを表示しません。
-ns
No Sort: ソート処理を行っていない(検索には使えません)、素の array ファ イルを作ります。
-so
Sort Only: 既存の array ファイルに対してソート処理を行い、完全な array ファイル(検索に使えます)を作ります。
-#
"#" で始まる行を無視します。ただし、 -l オプションのときのみ有効。
-M MEGABYTE
テキストを分割してソートを行い、最後にマージする。 MEGABYTE で分割単位のサイズを指定。メモリ不足のときには必須。
例:mkary -M 3 sample.txt

DocID ファイルの作り方

samp3.txt のような複数の記事(<ARTICLE>タグと</ARTICLE>タグ で囲まれているテキストエリア)が含まれる記事があるとします。「文字列 『自然言語処理』を含む記事を見つけて取り出す」という検索を行うことを考 えます。

// samp3.txt //

<ARTICLE>
形態素システム『茶筌』は20世紀末に奈良先端大で開発された・・・(略)
・・・フリーソフトとして公開・・・(略)・・・
</ARTICLE>
<ARTICLE>
21世紀初頭の自然言語処理システム開発への過剰な投資により、粗悪製品が
乱造され・・・(略)・・・若者の自然言語処理ばなれが深刻・・・(略)・
・・結局我々人間は歴史から何も学んでいないということを実感させられる。
</ARTICLE>

「自然言語処理」という文字列がどこにあるかは、array ファイルがあれば見 つけることができますが、それがどの記事に含まれているかということは、 array ファイルだけでは簡単には分かりません。そこで、SUFARY では DocID ファイルというファイルを利用します。DocID ファイルには記事の開始タグと 終了タグ(この場合は<ARTICLE></ARTICLE>)の位置データが格納 されていて、これによりテキストエリア検索が効率的に行えます。 詳しいことは、 SUFARYホームページ <http://cl.aist-nara.ac.jp/lab/nlt/ss/> に ある記事取り出し処理関連ドキュメントを御参照下さい。

実行例

ではさっそく DocID ファイルを作ってみましょう。 DocID ファイルを作るプログラムは $SUFARY/src/mkdid です。

まず、なにはともあれ、array ファイルが必要なので、mkary で作ります。

% mkary samp3.txt
Save to "samp3.txt.ary"
Reading text file "samp3.txt"

Sorting...
Saving...
Done.

検索対象テキストエリア(記事)を表すタグを指定して、DocIDファイルを作り ます。デフォルトでは DocID ファイルは samp3.txt.did という名前になりま す。

% mkdid '<ARTICLE>' '</ARTICLE>' samp3.txt
Number of Documents = 2
sorting...
writting...
done.

テキストエリア検索を行う簡単なプログラム af ($SUFARY/tools/af)を使って 検索してみます。

% af '自然言語処理' samp3.txt samp3.txt.did
FOUND 1
<ARTICLE>
21世紀初頭の自然言語処理システム開発への過剰な投資により、粗悪製品が
乱造され・・・(略)・・・若者の自然言語処理ばなれが深刻・・・(略)・
・・結局我々人間は歴史から何も学んでいないということを実感させられる。
</ARTICLE>

しかし、世の中、テキストエリアの始まりと終わりが同じタグというデータフォー マットが多いのも事実です。

// samp4.txt //

#ID-001
形態素システム『茶筌』は20世紀末に奈良先端大で開発された・・・(略)
・・・フリーソフトとして公開・・・(略)・・・
#ID-002
21世紀初頭の自然言語処理システム開発への過剰な投資により、粗悪製品が
乱造され・・・(略)・・・結局我々人間は歴史から何も学んでいないという
ことを実感させられる。
#ID-003
裏自然言語処理研究会のお知らせ:本日午後3時・・・(略)・・・ふるって
御参加下さい。

こんなときはタグを一つだけ指定すればOKです。

% mkdid '#ID-' samp4.txt
Number of Documents = 3
sorting...
writting...
done.

書式

mkdid [-q] [-o DOCID_FILE] START_TAG [END_TAG] TEXT_FILE 

TEXT_FILE にテキストファイル名を指定します。TEXT_FILE.ary という名前の array ファイルも必要になります。START_TAG, END_TAG で、テキストエリア を囲むタグを指定します。END_TAG は省略できます。

-o DOCID_FILE
DocID ファイル名を指定できます。デフォルトは TEXT_FILE.did。
-q
実行中にメッセージを表示しません。

tatuo-y@is.aist-nara.ac.jp