GETA (第2版) のまえがき

GETA (第2版) は, 汎用連想計算エンジン GETA (平成12年2月, 第1版) をベースに大幅な機能拡張を行ったものである. 以下に, GETA (第2版)で追加された主な機能について列挙し簡単な説明を付す. 各機能の詳細については対応するドキュメントを参照されたい.

・WAM の圧縮スキームの選択機能の追加
第2版では, WAM の圧縮方法について, 圧縮, 非圧縮, 非圧縮(ホストバイトオーダー)の3種を標準で提供(mkw(1))している. これにより, 大容量の主記憶を装備している計算機において, 非圧縮を選択することにより, 圧縮・伸長にかかるオーバッヘッドを回避することができる. 非圧縮(ホストバイトオーダー)では, これに加えて(little endian のアーキテクチャの場合に) バイトオーダーの変換にかかるオーバッヘッドを回避することができる.
・連想計算ライブラリ(libae)に, 高速版関数 wsh を実装 (wsh(3))
第1版では, 連想計算のために ws という関数が提供されていた. この関数を使って検索エンジンなどを構築した場合, ws 結果が膨大になることがあり, 不都合が生じていた. wsh はアルゴリズムを見直して ws に結果のサイズを制限する機能を追加したもので, 検索エンジンなどの用途に適した機能を提供するものである. なお, wsh は ws の上位互換である.
・連想計算における必須語および不要語の指定を追加 (wsh(3))
これにより, 連想検索などで, 必須語, 除外語などの指定が高速に処理可能となった. また, 検索エンジンなどに応用した場合, 容易に簡易ブーリアン検索機能を実現することが可能である.
・クラスタリングを行うライブラリ(libcs)の実装 (csb(3))
このライブラリを用いることで, 互いに似ている文書や単語を自動的にまとめることが可能になる.
・WAMセットアップツールの仕様を簡素化(mkw(1))
第1版では 2 つのコマンドからなっていた WAMセットアップツールを1つのコマンドに統合した. これによりコマンドライン引き数の一貫性の保証が容易になり, ユーザビリティも大幅に向上した.
・WAMセットアップツールの高速化
WAM セットアップツールの改良により, WAM セットアップにかかる時間が大幅に短縮された. これは, セットアップツールが内部で使用する作業用テーブルの改良および, WAM の外部表現を操作する回数を1回減らした(また, 前項のコマンドの統合に関連) ことによるものである.
・評価用 CGI クライアントの機能追加
複数のデータベースを横断的に検索するクロスデータベース検索機能および検索結果の要約を提示するための特徴語抽出機能の追加.
・GETA セットアップを自動化
第1版は FreeBSD 以外の OS にセットアップするのが非常に難しかったが, これにより, 比較的容易に各種 UNIX 系の OS にセッとアップが可能になった.

以上.

GETA (第2版) の概要

GETA (第2版) は(疎な)行列を効率的に扱うためのライブラリ libwam, 計量の差し替えが可能な連想エンジン libae, 文書クラスタリングライブラリ libae, ユーティリティーライブラリ libgetamu および支援ツール群から構成される. libwam は, 行列のデータを扱う libxr, 行列の行や列のインデクスを管理する libcw, 行列に附属するのその他の属性値を管理する libci から構成される. また, libwam が扱う行列のインスタンスを WAM と呼ぶ.

WAM には, libci により, それらを識別するためのハンドルと呼ばれる名前が付けられる. libci は, WAM ごとに属性データベース(以後, CI)を管理しており, 標準的な属性とその値以外に, 任意の属性とその値の組をユーザが付与することができる.

WAM の要素は, 数学で扱う行列の様に整数でインデクシングされる. libwam ではこのインデクシングに使う整数を ID と呼ぶ (C言語での型名は symbol_t であることに注意せよ). 全ての ID にはその外部表現としての名前(name)が付けられる. ID と name の対応表 (以後, CW) は WAM ごとに固有であり, さらに行と列で異なる表が用いられる. この対応表は libcw が管理している. libcw により name と ID の相互変換を行うためには, WAM および行, 列のいずれの CW を使用するのかを指定しなければならない. そのため, C 言語インタフェースでは, 行の CW を WAM_ROW で, 列の CW を WAM_COL で指定する (これは, libwam での指定法である, 後述).

WAM の要素は0以上の整数である(実装では, 圧縮モードで 0..227-1, 非圧縮モードで 0..231-1 まで使用可能). libxr は疎な(その要素の多くが 0 である)行列を扱うことを仮定しており, WAM の全ての行ベクタおよび列ベクタを圧縮した形式でファイルに保管している. この圧縮形式のデータ(以後, XR)には, 行 XR と列 XRとがあり, XR にアクセスする際には WAM および行, 列のいずれの XR を使用するのかを 指定しなければならない. この指定には CW と同様に, 行 XR の指定に WAM_ROW を, 列 XR の指定に WAM_COL を用いる(これは, libwam での指定法である, 後述). libxr では, 行(列)ベクタの要素のうちその値が 0 でない要素のみを, その列(行)インデクスの ID と値の組 (C言語では xr_elem 型) の配列 (C言語では附属情報を加えた xr_vec 型として宣言) を作成し, それを XR に保持している. libxr により XR にアクセスする場合, 直接的にはこの値が 0 である要素を含まない配列へのアクセスのみが可能である. WAM の行数, 列数, 全要素の和などの, 何種類かのサマリ情報も 予じめ計算されて XR に保管されており, これらの情報については libxr に, より低いコストでアクセスすることが可能である. これ以外の WAM へのアクセス方法, 例えば, ID を直接インデクスとして用いることができる(疎な)ベクタや行列, 行と列の ID 指定してのある 1 要素への直接のアクセスなどは, libxr では提供されない.

この様に, 1 つの WAM について, 2つの CW および 2 つの XR が存在する. 実装ではこれらは別々のファイルに格納されており, 都合, 1 つの WAM は 4 ファイルで構成されることになる(CI は全 WAM に共通で用いられる 1 インスタンスのみが存在するのでここでは触れない). 一つのプログラムで扱うファイル識別子の数が多くなるということは, ユーザ(プログラマ)にとって負担となり得る. libwam は libcw, libxr への統一インタフェースであり, ユーザはハンドルを指定して WAM をオープンするだけで, WAM を構成する 4 つのファイルにアクセスすることができるため, ファイル識別子を管理する負担を大幅に軽減することができる. なお, libwam で WAM に対する操作を行う際には, オープンした WAM のデスクリプタ以外に 行, 列のいずれの CW や XR にアクセスするのかを指定する必要があり, WAM_ROW を行, WAM_COL が列の指定に使用される.

通常, WAM は libwam (libcw, libxr) が高速にアクセスすることができる様に, バイナリ形式で格納されており, さらに, バイナリ形式以外にテキスト形式の外部表現が規定されている. 外部表現ではインデクスとして ID ではなく name が用いられる(name には改行および NUL バイトを含まない任意の文字列が使用可能である). WAM の外部表現は perl などのレポート作成言語で容易に生成可能であり, またホスト環境にも影響されにくく移植性が高い. この様な理由から, WAM の元データを作成するツールなどで libwam 以外の手段により WAM を操作する必要がある場合には, 外部表現を扱うことが推奨される. また, 人間可読であるため(気合いさえあれば)作成した WAM のデバッグにも有効である.

libae は計量の差し替えが可能な連想エンジンである. libae は検索式 q として与えられた行(列) IDqのリストから, 第 ID 要素が 0 でない全ての列(行) ベクタ d の IDdを集め, IDdのリストを返す. リストの各要素には d と q との類似度が付される. さらに, その上位から指定した個数だけを集めることが可能であり, 連想検索など上位いくつかの結果だけが必要な場合に, 必要最低限のメモリで連想計算を実行することができる. q の要素には必須, 不要の属性を与えることができ, 連想検索などで利用する際に, 必須語, 除外語などの指定が高速に処理可能である. また, 類似度の計算式はユーザが容易に変更することが可能である(C 言語が分からなくても良い).

libcs は, WAM にエンコードされたデータをクラスタリングするためのライブラリである. これにより, 例えば, キーワード検索の結果(文書集合)をクラスタリングし 検索結果を幾つかの意味的なまとまり(クラスタ)に分類することで これは検索結果の概観を作成したり, 単語の集合をクラスタリングることでシソーラス (単語の意味的な階層)のようなものを自動的に作る, などといったことが可能になる.