Last Modified: 1999-10-18
山下 達雄 Yamasita, TatuoSUFARY では検索対象テキストに対して以下の2種類の検索ができます。
どちらの検索を行うにしても、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 ファイルを作ると、そのテキストに含まれる全て の部分文字列が検索できます。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 ファイルが作成されます。
例:mkary -M 3 sample.txt
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 は省略できます。