全文検索システムを作る(Namazu)


全文検索エンジン Namazu

Namazuは、日本語対応の全文検索エンジンであり、フリーで配布されています。 Namazuは、比較的小規模の環境において手軽に導入可能であり、またコンピュータや WWW技術、データベース技術、検索技術などに精通していなくても、非学的容易に 構築することができます。

インストール

全文検索エンジンを構築するには、最低限、以下のものが必要です。

ソフトウェア 入手先
KAKASI ftp://ftp.kusastro.kyoto-u.ac.jp/pub/baba/wais/old/
辞書 ftp://ftp.kusastro.kyoto-u.ac.jp/pub/baba/wais/old/
分かち書きパッチ ftp://ftp.kusastro.kyoto-u.ac.jp/pub/baba/wais/old/
Chasen(Kakasiでも可) http://cl.aist-nara.ac.jp/lab/nlt/chasen/
Namazu http://www.namazu.org/

また、これ以外にも、gcc,perl,nkf,patch などのツールが必要です。perlについては、 バージョン5.0以降のものが推奨されます。
なお、今回は、全文検索システムを Vine Linux 1.1 上に構築します。付属の rpmパッケージを使用して、これらのツールをあらかじめインストール しておきます。
kakasi や namazu などは、rpmのパッケージで提供されていますが、ここでは、 それらのパッケージは使わず、ソースファイルから構築することにします。
パッケージがインストールされている場合は、
# rpm -e パッケージ名
で削除しておきます。

KAKASI

日本語文書は、英語とは異なり、単語ごとにスペースで区切られておらず、また 接続詞や助詞が単語に付随して記述されているため、どこまでの文字が単語を 構成しているのかを判断することができません。
そこで、文章の前後関係などを考慮し、もとの文章から意味をなす単語群に分割する 処理(トークン化)を行う必要があります。この処理を文書フィルタリングと呼びます。 文書フィルタリングを行うプログラムを、文書フィルタと呼びますが、代表的なもの には、Kakasi と Chasen があります。文書フィルタは形態素処理という処理によって 行われますが、Kakasi は最長一致法、Chasen は形態素解析を用いています。

ここでは、Kakasi に分かち書きパッチを当てたものをインストールします。 上記のURL
ftp://ftp.kusastro.kyoto-u.ac.jp/pub/baba/wais/old/より、
kakasi-2.2.5.tar.gz と kakasi-ext.tar.gz をダウンロードし、 以下のように解凍・展開します。
% tar xvfz kakasi-2.2.5.tar.gz
% tar xvfz kakasi-ext.tar.gz
また、kakasiで用いる辞書kakasidict.940620.gz をダウンロードし、 展開しておきます。
% gunzip kakasidict.940620.gz
次に kakasi に対して、kakasi-ext に含まれる分かち書きパッチを当てます。 kakasi-2.2.5/src ディレクトリに移動して、以下のように行います。
% cd kakasi-2.2.5/src
% patch < ../kakasi-ext/patch.kakasi-2.2.5
また、先程、展開した辞書を kakasi-2.2.5/src ディレクトリに kakasidict という 名前でコピーしておきます。
% cp ../../kakasidict.940620 ./kakasidict
次に Makefile を編集します。デフォルトのコンパイラが cc になっているので、 gcc に変更します。
Makefile を編集
変更前
CC=cc
変更後
CC=gcc
次に、root で /usr/local/lib に kakasi ディレクトリを作成します。
% su
Password:
# mkdir /usr/local/lib/kakasi
# exit
その後、以下のようにしてソースコードをコンパイルし、インストールします。
% make
% su
Password:
# make install
以上で kakasi のインストールは終了です。

Chasen

Chasen は、奈良先端科学技術大学院大学で開発された文書フィルタであり、 形態素解析と呼ばれるアルゴリズムを使用して、形態素処理を行います。 以下のURL
http://cl.aist-nara.ac.jp/lab/nlt/chasen/
より、chasen-sys2.02-ipadic2.1.tar.gz をダウンロードし、以下のように 解凍・展開し、ディレクトリを移動します。
% tar xvfz chasen-sys2.02-ipadic2.1.tar.gz
% cd chasen-2.02
次に、Makefile を編集します。必要に応じて BINDIR,LIBDIR,CC,CFLAGS などの 項目を編集します。変更後、ソースファイルをコンパイルするためmakeを実行します。
% make
次に、システム辞書を作成するため、
% make dic
を実行します。
コンパイル及び辞書の作成が正常に終了したら、以下のようにインストールします。
% su
Password:
# make install
このとき、
make[1]: [install] Error 1 (ignored)
というようなメッセージが出力されるかもしれないが無視してかまいません。 以上で Chasen のインストールは終了です。
また、ユーザ専用の chasenrc ファイルを利用するには,chasen-2.02/dic/chasenrc をユーザのホームディレクトリに .chasenrc という名前でコピーし、カスタマイズ して使用します。

Namazu

Namazu本体をインストールします。Namazuのホームページ
http://www.namazu.org
より、namazu-1.3.0.11.tar.gz をダウンロードし、解凍・展開し、ディレクトリを 移動します。
% tar xvfz namazu-1.3.0.11.tar.gz
% cd namazu-1.3.0.11/src
その後、プラットフォームに対応した Makefile を作成するため、configure スクリプトを実行します。
% ./configure
その後、Makefile を編集します。主な変更点を以下に示します。
24> CGIDIR CGIプログラムディレクトリのパス /usr/local/apache/htdocs/cgi-bin/ に変更
55> OPT_ADMIN_EMAIL 管理者のメールアドレス 管理者のメールアドレスに変更
106> OPT_TARGET_FILE 検索対象ファイルの拡張子列 必要に応じて追加・削除
118> OPT_DENY_FILE 非検索対象ファイルの拡張子列 必要に応じて追加・削除
146> OPT_HTDOCUMENT_ROOT ホームページのデータを置くディレクトリパス /usr/local/apache/htdocs/ に変更
156> OPT_WAKATI_DEFAULT 分かち書きモジュール(Chasen or kakasi) kakasiを指定
Makefile を編集したら、以下のようにソースファイルをコンパイルし、 インストールします。
% make
% su
Password:
# make install
# make install_cgi
以上で Namazu のインストールは終了です。

インデックスの作成

Namazu のインデックスは、/usr/local/namazu/index ディレクトリに作成します。 /usr/local/namazu/index はデフォルトのインデックスディレクトリであり、 検索時、特にインデックスディレクトリを指定しない場合には、このディレクトリに あるインデックスが使用されます。
このディレクトリでは、ドキュメントをカテゴリに分類し、カテゴリ毎に インデックスディレクトリを作成し、検索時にどのインデックスを検索するのかを ユーザに指定させるようにします。
今回は、音声認識用のソフトウェアツールキットである HTK のマニュアルである The HTK Book と、Apache のオンラインマニュアルを検索するシステムを作成 します。
まず、それぞれのドキュメントのインデックスを置くためのディレクトリを作成 します。
# mkdir /usr/share/namazu/index/HTK         The HTK Book
# mkdir /usr/local/namazu/index/Apache      Apache Online Manual
また、それぞれのドキュメントは、
The HTK Book /usr/local/HTK_V2.2_REF/HTKBook/
Apache Online Manual /usr/local/apache/htdocs/manual
に格納されています。

インデックスの作成には、mknmz コマンドを使用します。-Oオプションで インデックスの格納ディレクトリを指定して、以下のように行います。
# mknmz -O /usr/local/namazu/index/HTK /usr/local/HTK_V2.2_REF/HTKBook/         The HTK Book
# mknmz -O /usr/local/namazu/index/Apache /usr/local/apache/htdocs/manual       Apache Online Manual
以上により、インデックスの作成は終了です。

次に、実際に出力するHTMLドキュメントを作成します。デフォルトの言語は 日本語(ja)であるため、ブラウザから /cgi-bin/namazu.cgi ファイルにアクセス すると、/usr/local/namazu/index/NMZ.head.ja ファイルにアクセスします。 このファイルの内容として、以下のようなものを作成します。
< HTML >
< HEAD >
< LINK REV=MADE HREF="mailto:www@oak.eg.t.kanazawa-u.ac.jp" >
< TITLE > Namazu the full text retrieval search system < /TITLE >
< /HEAD >
< BODY LANG="ja" >
< H1 > Namazu による全文検索システム < /H1 >

< HR >

< FORM METHOD="get" ACTION="/cgi-bin/namazu.cgi" >

< P >
< STRONG >検索式:< /STRONG >
< INPUT TYPE="text" NAME="key" SIZE="70" >
< INPUT TYPE="submit" NAME="submit" VALUE="検索開始" >
< /P >

< P >
< STRONG >表示件数:< /STRONG >
< SELECT NAME="max" >
< OPTION VALUE="10" > 10
< OPTION SELECTED VALUE="20" > 20
< OPTION VALUE="30" > 30
< OPTION VALUE="50" > 50
< OPTION VALUE="100" > 100
< /SELECT >

< STRONG >要約表示:< /STRONG >
< SELECT NAME="format" >
< OPTION SELECTED VALUE="long" > ON
< OPTION VALUE="short" > OFF
< /SELECT >
< /P >

< INPUT TYPE="hidden" NAME="whence" Value="0" >
< UL >
< LI >< INPUT TYPE="checkbox" NAME="dbname" VALUE="HTK" >The HTK Book (Version 2.2 REF)
< LI >< INPUT TYPE="checkbox" NAME="dbname" VALUE="Apache" >Apache Online Manual
< /UL >
< /FORM >
< HR >
Netscape や IE などのブラウザを立ち上げて、 http://localhost/cgi-bin/namazu.cgi にアクセス すると、上記で作成した /usr/local/namazu/index/NMZ.head.ja にアクセス します。
上記で作成した HTML ファイルより、検索インデックスに The HTK Book と Apache Online Manual が選択できるようになります。ここで、検索インデックスに The HTK Book を選択して検索を実行すると、 /usr/local/namazu/index/HTK/NMZ.head.ja が使用されます。
しかしこのヘッダファイルは、上記で作成したファイルのように インデックス選択フィールドを含んでいないので、続けて検索を行うことが できません。そこで、以下のように各インデックスディレクトリにある NMZ.head.ja を 削除して、上記で作成した NMZ.head.ja からシンボリックリンクを張ります。
# rm /usr/local/namazu/index/HTK/NMZ.head.ja             The HTK Book
# ln -s /usr/local/namazu/index/NMZ.head.ja /usr/local/namazu/index/HTK/NMZ.head.ja
# rm /usr/local/namazu/index/Apache/NMZ.head.ja          Apache Online Manual
# ln -s /usr/local/namazu/index/NMZ.head.ja /usr/local/namazu/index/Apache/NMZ.head.ja

Apacheの設定

Namazu での検索では、CGIを使用するため、Apache で CGI が使用できるようにして おきます。Apache の設定ファイル /usr/local/apache/conf/httpd.conf ファイルを 編集します。
ScriptAlias /cgi-bin/ "/usr/local/apache/htdocs/cgi-bin/"          CGIプログラムを置くディレクトリを指定

< Directory "/usr/local/apache/htdocs/cgi-bin/" >          CGIプログラムを置いてあるディレクトリを指定
Options Indexes FollowsymLinks ExecCGI          ExecCGIが無い場合は追加
AllowOverride None
Order allow,deny
Allow from all
< /Directory >

AddHandler cgi-script .cgi          # が付いている場合は # を外す
Apache の設定ファイル /usr/local/apache/conf/httpd.conf ファイルを編集したら、 httpd を再起動します。以下のように行います。
# kill -HUP `cat /usr/local/apache/log/httpd.pid`

Namazuの設定(namazu.conf)

インデックスディレクトリやデフォルト言語などの Namazu の設定は、 インストール時に Makefile で指定しますが、namazu.conf ファイルによっても 指定できます。場所は /usr/local/namazu/lib/namazu.conf です。
Namazu を用いて WWW 上で検索する場合、検索結果は、例えば The HTK Book の場合、 実際にドキュメントが置かれているディレクトリ(/usr/local/HTK_V2.2_REF/HTKBook/) 以下のファイルが表示されます。しかし、WWW上では Apache のドキュメントルート (/usr/local/apache/htdocs/)からの相対パスで表示する必要があるため、 このままではブラウザで表示しようとしても、見付かりませんというエラーが出て、 表示できません。
このため、実際にドキュメントが置かれているディレクトリを、Apache の ドキュメントルート(/usr/local/apache/htdocs/)にシンボリックリンクを張ります。 ここでは以下のようにします。
# ln -s /usr/local/HTK_V2.2_REF/HTKBook /usr/local/apache/htdocs/HTK
次に namazu.conf ファイルの REPLACE の項目を編集します。REPLACE項目は 検索結果のドキュメントパスを変換します。以下のような項目を追加します。
REPLACE /usr/local/HTK_V2.2_REF/HTKBook/        /HTK/
このようにすることにより、Namazuからの検索出力の結果が、ドキュメントの ディレクトリパスから、URLパス(/usr/local/apache/htdocs/ 以下からの相対パス) で表示されるようになります。

他にも、namazu.conf ファイルで設定できる項目には、以下のようなものがあります。
INDEX デフォルトで参照するインデックスのあるディレクトリ
REPLACE 検索結果の出力に対する置換
BASE < BASE HREF="...">を検索結果表示の際に出力させるための指定
WAKATI 分かち書き用プログラムのパス
LOGGING 検索に使われたキーワードを取る場合はON(デフォルト)、取らない場合はOFF
LANG メッセージの言語指定
Namazu のコンフィグレーションファイルは、Namazu を実行するディレクトリに .namazurc という名前のファイルに記述して設定することもできます。
また、各ユーザのホームディレクトリに .namazurc を作成して設定することも できます。

以上の作業により、Namazuによる全文検索システムが作成されます。 実際に作成した Namazu による全文検索システムは こちら になります。
戻る

sakai@oak.eg.t.kanazawa-u.ac.jp
Last modified: Wed Apr 26 19:29:02 JST 2000