stp
連想計算に必要なインデックス(NWAM)ファイルを作成します。必要に応じてstmdと通信を行ない、stemmingをします。
引数の説明
stp -b $GETAROOT corpus_name properties [stemmer [itbs]]
$GETAROOT | GETAをインストールした場所です。 |
corpus_name | コーパスを識別する名前です。 |
properties | [[itbファイル>itbファイル形式]]に存在する各文書に付与されたプロパティを「,」区切りで指定します。ここで指定したプロパティだけが連想計算時に取得することができます。例: title,link |
stemmer | コーパスをstemmingする際の[[stemmer>Stemmer]]を指定します。省略時はインストール時に指定した’'’defaultstemmer’'’が使用されます。 |
itbs | itbファイルを「,」区切りで指定します。これを指定しない場合は標準入力からitbを読み込みます。stemmerは省略できません。標準のstemmerを使うときは、「default」を指定します。 |
同時に起動するstemmerの数
高速化のためデフォルトでstpは、形態素解析のためにstmdを1つだけ呼び出します。この数は経験的に「MAX(マシンのCPU数-2, 3)」のとき最も早くstemmingが完了します。起動するstmdの数をNに変更するためには、stpの最初の引数に-o,-a,Nというオプションを渡します 。,(コンマ)の前後にスペースを入れてはいけません。例:
stp -o,-a,6 -b /data/geta sample title,link
全文検索インデックス
連想検索用のインデックスに加えて、全文検索用のインデックスを作成するときには、propertisに’‘@fss’‘を付けてください。例:
title,link,@fss
分散版インデックスの作成
例えばN分割するならば、以下の例のようにします。実際には、N台の子ノードを用いて行ベクトルのみをN分割したインデクスと列ベクトルのみをN分割したインデクスが、そして親ノードにも空のインデクスが作成されるので、2N+1個のインデクスが作成されます。
stp -o,-D,4,-C/data/geta/etc/dnwam.conf -b /data/geta sample title,link
サーバのリストは、/data/geta/etc/dnwam.confというファイルに書いておきます。このファイルには、GETAssoc分散サーバを1行にひとつ記述します。各行は、hostタブportタブlocalsocketという形をしており、通常hostタブportか、localsocketのいずれかを指定します。両方指定すると、localsocket、hostタブportの順で接続を試みます。例:
server1.example.com getassoc
localhost getassoc /tmp/getassoc.sock
localhost getassoc /tmp/getassoc.sock
このファイルは前から順番に用いられ、最後まで使用したらまた最初の行から使用されます。従って、このファイルに記述したサーバ数より多い分割数を指定した場合には、2つ以上のインデクスを担当するサーバができることになります。 文書側と単語側で異なるサーバを指定するには、-Xで単語側のコンフィグファイルを指定します。 文書側と単語側で異なる分割数を指定するには、-Yで単語側の分割数を指定します。例:
stp -o,-D,4,-Y,8,-C,/tmp/row.conf,-X,/tmp/col.conf -b /data/geta sample title,link
-C、-Xのいずれかを省略すると両方同じものが、両方とも省略すると$GETAROOT/etc/dnwam.confが用いられます。 -D、-Yのいずれかを省略すると両方同じものが、両方とも省略すると-C、-Xの指定の有無にかかわらず単一CPU版になります。 分散用サーバの立て方は、[[インストール/分散版セットアップ]]の説明をご覧ください。
必要なメモリ量
インデックスの作成に必要なメモリの量は、出来上がりのインデックスデータ+数百MB程度です。この余分のメモリの大半は行列の転置を計算するために使われます。
テンポラリファイルの大きさ
インデックスの作成時に、itbの完全なコピー(標準入力から読み込んだ場合)、stemmerを通した結果すべてを保存したファイルと、行列全体を保存したファイルが $GETAROOT/tmp 以下に一時的に作成されます。これらのファイルのサイズは、それぞれ元データのサイズ、出来上がりインデクスのサイズ程度の大きさになります。
インデックス作成時間
大規模なデータにおけるstpでのインデックス作成時間の例です。 1ノードの性能は、 CPU: Dual-Core Opteron 2218 2.6GHz x 2 Mem: PC-5300 16GB ECC registerd OS: Solaris 10 u7 8分割のときは、親ノードを入れて9台を使用、そのときのネットワーク構成は
親 - NetGear GbE sw - CentreCom GbE sw - 計算ノード(0〜3)
|
+- NetGear GbE sw - CentreCom GbE sw - 計算ノード(4〜7)
なまえ | 全文一致インデクス | itbサイズ | 記事数 | 単語数 | 分割数(コア数) | 時間 |
じんぼう | 無し | 132MB | 371705 | 133243 | 1(4) | 22秒 |
じんぼう | 有り | 175MB | 371705 | 133243 | 1(4) | 56秒 |
毎日新聞2001(1年分) | 無し | 200MB | 108609 | 147977 | 1(4) | 50秒 |
毎日新聞2001(1年分) | 有り | 360MB | 108609 | 147977 | 1(4) | 5分 |
新刊じんぼう | 無し | 610MB | 2395622 | 199589 | 1(4) | 90秒(1.5分) |
新刊じんぼう | 有り | 1.5GB | 2395622 | 199589 | 1(4) | 18分 |
新刊じんぼう | 無し | 610MB | 2395622 | 199589 | 8(4x9) | 6.5分※ |
新刊じんぼう | 有り | 1.5GB | 2395622 | 199589 | 8(4x9) | 11分 |
WebcatPlus | 無し | 7.0GB | 11444856 | 3018865 | 8(4x9) | 1.4時間 |
WebcatPlus | 有り | 12GB | 11444856 | 3018865 | 8(4x9) | 2.2時間 |
※通信がボトルネックになり、分割無しより遅くなります
分散インデクス作成の中断
分散インデクス作成では、高速化の為に、pass2以降、作成完了直前までクライアント-サーバ間の通信を行いません。 そのため、pass2開始以降にインデクス作成を中断しても、サーバ側では作業を続行してしまいます。 サーバ側で作成に失敗したインデクスは終了直前に削除されるため、race conditionが発生することに注意が必要です。 サーバのCPUやファイルシステムのリソースも無駄になります。
記事を削除する
まず、削除する記事IDを各行にひとつ含んだファイルを作成します。ITB形式と異なり、IDの前に「i」はつけません。IDと改行の間にスペースなどゴミが入ってはいけません。このファイルをsample.txtとすると、以下のコマンドで記事を削除することができます。
stp -d /data/geta sample < sample.txt
記事を追加する
まず、追加したい記事のみを含むITBを作成します(仮に、add.itbとします)。同じIDの記事が既に登録されているなら、あらかじめ上述の手順にしたがって削除しておきます。属性には、既に登録しているものと同じ物を指定しなければなりません。
stp -U -b /data/geta sample title,link < add.itb
※記事を追加すると、インデクスの断片化が起こり計算の性能が十分に発揮できなくなります。ある程度の記事を追加するごとに、インデクス全体を作成し直してください。