Link

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

※記事を追加すると、インデクスの断片化が起こり計算の性能が十分に発揮できなくなります。ある程度の記事を追加するごとに、インデクス全体を作成し直してください。