検索用ファイル作成ガイド for Ver.2.1

山下達雄(tatuo-y@cl.aist-nara.ac.jp)
last update 990629

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


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


■■■ はじめに

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

【文字列検索】

  検索キーワードがテキスト中の何文字目にあるかを調べます。

【テキストエリア検索】

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

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

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

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

array ファイル、DocID ファイルは作成した環境(OS)に依存することがありま
す。例えば、SunOS で作成されたものは Solaris でも使えますが、FreeBSD 
では使えません(バイトオーダーの問題)ので、作り直す必要があります。

■■■ array ファイルの作り方

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

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

------ samp1.txt
YAMASITA Tatuo
tatuo-y@cl.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/mkary/mkary 
です。

★実行例

------ 文字単位で 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 ファイルを作成
% 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] [-#] [-q] [-ns] [-so] [-8] [-J] [-o ARRAY_FILE]
	[-b NUM] TEXT_FILE

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

★オプション

[-o ARRAY_FILE]

array ファイル名を指定できます。デフォルトは TEXT_FILE.ary。

[-c]

文字単位で array ファイルを作ります。テキスト中のあらゆる文字列がさが
し出せます。日本語文字(EUC)は2バイトで一文字とみなします。
デフォルトです。

[-l]

行単位で array ファイルを作ります。各行頭から始まる全ての文字列(prefix 
といいます)が検索できます。辞書検索に向いています。

[-w]

単語単位で array ファイルを作ります。ここでいう単語とは、改行文字、ス
ペース、タブで区切られる文字列を指します。

[-J]

文字単位で array ファイルを作るとき、日本語文字(EUC)と '<' 以外は無視
します。日本語(EUC)以外で始まる文字列は '<' で始まるタグを除いて、検索
できなくなりますが、array ファイルのサイズは小さくなります。

[-q]

実行中にメッセージを表示しません。

[-ns]

No Sort: ソート処理を行っていない(検索には使えません)、素の array ファ
イルを作ります。

[-so]

Sort Only: 既存の array ファイルに対してソート処理を行い、完全な array 
ファイル(検索に使えます)を作ります。

[-#]

"#" で始まる行を無視します。ただし、[-l]オプションのときのみ有効。

[-8]

日本語文字(EUC)処理を行わない。[-c]オプションのときのみ有効。

[-b NUM]

テキストを分割してソートを行い、最後にマージする。
NUM で分割数を指定。メモリ不足のときには必須。

例：mkary -b 10 sample.txt


■■■ DocID ファイルの作り方

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

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

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

★実行例

ではさっそく DocID ファイルを作ってみましょう。
DocID ファイルを作るプログラムは $SUFARY/mkdid/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>
２１世紀初頭の自然言語処理システム開発への過剰な投資により、粗悪製品が
乱造され・・・（略）・・・若者の自然言語処理ばなれが深刻・・・（略）・
・・結局我々人間は歴史から何も学んでいないということを実感させられる。
</ARTICLE>
------

しかし、世の中、テキストエリアの始まりと終わりが同じタグというのが多い
のも事実です。例えば以下のようなフォーマット。
------ samp4.txt
#ID-001
形態素システム『茶筌』は２０世紀末に奈良先端大で開発された・・・（略）
・・・フリーソフトとして公開・・・（略）・・・
#ID-002
２１世紀初頭の自然言語処理システム開発への過剰な投資により、粗悪製品が
乱造され・・・（略）・・・結局我々人間は歴史から何も学んでいないという
ことを実感させられる。
#ID-003
裏自然言語処理研究会のお知らせ：本日午後３時・・・（略）・・・ふるって
御参加下さい。
------

こんなときはタグを一つだけ指定すればＯＫです。
------
% 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]

実行中にメッセージを表示しません。

