Link

類似度計算について

GETAssocでは、ベクトル間の類似度の計算式を任意に指定することができます。 現在、GETAssocでは、(内積)、(Cosine類似度)、Smart[ref]、(Okapi[ref])、が 予め組込まれている類似度として登録されており、デフォルトではSmartが使われます。登録されている類似度の指定方法はgss3プロトコルをご覧ください。

新しい類似度計算式の追加

GETAssocでは、次のようにして簡単に新しい類似度が追加できます。

  • configure に –enable-dlsim=yes を渡し、GETAssocを共有ライブラリ有りでインストールしておきます。 SolarisやMac OS Xの場合にはMakefileを編集してリンカフラグも変更する必要があります。
  • 最初に類似度の計算式をテキストファイルで用意します。実際の類似度計算式の例を以下に掲載します。

    • Cosine類似度 この方法では記述できません。

    • Smart

smart ::=
    aveTFq = TF(.|q) / DF(.|q),
    avelen = DF(w) / Nr(w),
    slope = .2,
    norm = (avelen + slope * (DF(.|d) - avelen)) * (1 + log(TF(.|d) / DF(.|d))),
    1 / norm \sum_t (1 + log(TF(t|q))) / (1 + log(aveTFq)) * idf(t) * (1 + log(TF(t|d))) .

それぞれの変数の意味は、[[類似度計算に必要な変数>類似度の計算/類似度の定義で使用可能な記号]]をご覧ください。 先頭の記号(::=の直前)が類似度の名前になります。 類似度の名前と、ファイル名の.simを除いた部分とは一致しなければなりません。 式は,(コンマ)で区切ります。 式は上から順に計算されます。 すべての計算は倍精度で行なわれます。 \sum_tは、その被演算子中のtをdに現れるすべてのtについて計算し、その合計を返します。 \sum_tは、最後の式に、1回しか使うことができません。 \sum_tが一回も現れなくても構いません。

  • 次にこの類似度をmakeを使って.so形式に変換し、それを $GETAROOT/lib にコピーします。 作業は、GETAssocのソースディレクトリで行います。

      make smart.so
      cp smart.so $GETAROOT/lib
    
  • 使い方 コピーした類似度の名前の前に.(ドット)を付けたものが使えるようになります。例:

<assoc target="ja_document" narticles="10"
       nkeywords="10" a-props="title,link" 
       stage1-sim=".smart"> ...
  • 分散版の場合 すべての計算ノードに同じ共有ライブラリをコピーしてください。

新しい類似度計算式の追加2

上述の方法では、.simファイルの記法の制限から、複雑な類似度の記述が困難だったり、不可能だったりします。 その場合、simdef.cに新たな定義を追加することで、より複雑な類似度が利用可能になります。


Table of contents