GETA (第3版) のまえがき

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

・WAM の分割に対応
GETA (第3版) では, WAM を分割してリモートノードに配置することが可能であり, 1ノードでは扱うことができない様な巨大なコーパスを扱うことができる様になった. また, 副次的効果として, 分割により連想計算の並列化がなされるため, ある程度の高速化も達成された.
・TCP/IP, MPI 対応
WAM を分割した場合, 部分WAMは ローカルあるいはリモートノードに配置することが可能である. 集約プロセスと各部分WAMを担当するプロセスとの通信モジュールは TCP/IP を用いるものと MPI を用いるものとの2種類が提供されており, 使用目的に応じて使い分けることが可能となっている.
・WAM 分割方法のユーザ定義
WAM を分割する場合, どのような基準で分割するのかを, ユーザが指定することができる. これにより, コーパスごとにより優れた分割方法を選択することが可能となる. また, 標準で提供されるインターリーブ方式, および面積一定方式のいずれでも基本的性能は確保されており, 手軽に分散セットアップを行うことが可能である.
・巨大な補助ファイルの扱い
WAM を分割しなければならないほど大きいコーパスでは, タイトルファイルなどの補助ファイルも巨大になる. GETA 第2版までは, タイトルファイルなどの補助ファイルは 1ファイルとして扱われており, その取り扱いに支障をきたすことがあった. GETA 第3版では, タイトルファイルなどの補助ファイルも分割することができるようになった. ただし, 配置はローカルノードのみとなる. (集約プロセスしかアクセスできない)

以上.

GETA (第3版) の概要

GETA (第3版) は(疎な)行列を効率的に扱うための関数群, 計量の差し替えが可能な連想エンジン, 文書クラスタリングライブラリ, ユーティリティー関数群, および支援ツール群から構成される. これらは, すべて libdw というライブラリにより提供される. libdw は以下のモジュールから構成される. 行列のデータを扱う xr, 行列の行や列のインデクスを管理する cw, 行列に附属するのその他の属性値を管理する ci, xr, cw を集約した wam である. xr, cw は低レベル関数群を提供しており, 通常アプリケーションプログラムは wam が提供する関数を呼び出す. また, GETA では, 行列のことを WAM と呼ぶ. GETA (第3版) では, WAM を分割して複数の計算ノードに配置することが可能である. WAM を分割した場合, 連想エンジンは分割された各部分のみでの連想計算を行い 最後に各計算ノードでの結果を集約することで, 単一の場合と同一の結果を得ることが可能である. また, 行列がどの様に管理されているかは隠されており, アプリケーションプログラムからは常に単一の行列を扱っている様に見える. (低レベル関数を呼ぶことで, 分割された行列にアクセスすることも可能である.) 行WAM (行ベクトルを集めたもの) の分割では, まず, WAM の列を分割する数のグループに分ける. そして, 各行ベクトルについて, あるグループに属する列の要素以外を取り除いた行ベクトルを作成し, それを全て集めたものをそのグループに対する部分 WAM とする. 列WAMについても同様の方法で, 行方向に要素が制限された列ベクトルの集合として部分列 WAM を作成する. この様に分割することで, GETA 第2版までで用いていた連想計算が, のセマンティクスを変更することなく使用可能となる. グルーピングに関しては, ユーザが任意の方法を指定することができる. なお, クラスタリングライブラリは分割には対応しておらず, 必要なベクトルを集約ノードに一旦集めた上で分割しない場合と同様の動作を行う.

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

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

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

この様に, 1 つの WAM について, 2つの CW および 2 つの XR が存在する. 実装ではこれらは別々のファイルに格納されており, 都合, 1 つの WAM は 4 ファイルで構成されることになる(CI は全 WAM に共通で用いられる 1 インスタンスのみが存在するのでここでは触れない). さらに, WAM の分割を行った場合, その数は分割数倍になる. 通常,部分WAMは リモートノードに配置されるため, どの部分がどのノードに置かれているかを管理しなければならず, さらに, それらリモートノードとの通信路の識別子の管理も必要となる. 一つのプログラムで扱うファイル識別子の数が多くなるということは, ユーザ(プログラマ)にとって負担となり得る. 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 にエンコードされたデータをクラスタリングするためのライブラリである. これにより, 例えば, キーワード検索の結果(文書集合)をクラスタリングし 検索結果を幾つかの意味的なまとまり(クラスタ)に分類することで これは検索結果の概観を作成したり, 単語の集合をクラスタリングることでシソーラス (単語の意味的な階層)のようなものを自動的に作る, などといったことが可能になる.