3

コサイン類似度: 2 つのドキュメントを相互に比較するときによく使用されます。2 つのベクトル間の角度を測定します。値がゼロの場合、2 つのベクトル間の角度は 90 度であり、項を共有しません。値が 1 の場合、2 つのベクトルは大きさを除いて同じです。コサインは、データがまばらで非対称であり、特性が不足しているという類似性がある場合に使用されます。

2 つのベクトル (ドキュメント) にコサインを使用すると、次の表に従って結果が得られます。

id        Doc1(TF)  Doc2 (TF)
London        5        3
Is            2        2
Nice         10        3
City          0        1

次に、その正規化を最後まで取得します。次に、コサイン Cos(v1,v2)= 90% を取得します。

しかし、10個のドキュメントがある場合、それは取得したことを意味します

Cos(v1,v2)= ? 
Cos(v1,v3)= ?
Cos(v1,v5)= ?
Cos(v1,v6)= ?
Cos(v1,v7)= ?
Cos(v1,v8)= ?
Cos(v1,v9)= ?
Cos(v2,v3)= ? 
Cos(v2,v4)= ?
Cos(v2,v5)= ?

And so o n 

Until 

Cos(v9,v10)= ?

次に、結果を比較する必要があります。

速い方法はありますか?cos を 10 個以上のドキュメントに取得するにはどうすればよいですか。

2 つのドキュメントの余弦を取得する方法は知っていますが、さらに多くのドキュメントを取得するにはどうすればよいでしょうか? 数学的方法が欲しい。

4

2 に答える 2

1

見落としがちなかなりトリッキーな最適化があります。

ほとんどの場合、ベクトルはsparseになります。コサイン類似度の式を見ると、ベクトルの長さが変わらないことに注意してください。したがって、それらを事前に計算できます。

内積の場合、ベクトルが次元の 10% で非ゼロの場合、両方とも次元のわずか 1% で非ゼロになることに注意してください。したがって、ゼロ以外の次元の積のみを計算する必要があります。あなたの例では、たとえば、単語をスキップしたいと考えていますCity

次に、データを列ベースのレイアウトに転置し、そこにゼロをドロップすると、これを分散方式で非常に迅速に計算できます。たとえば、ドキュメントv1が列にありません。City次に、各列のペアワイズ積を計算し、対応するドキュメント ペアに出力します。最後に、これらの合計をベクトルの長さの合計で正規化します。Mahoutはすでにこの方法を採用しているはずなので、このアプローチの詳細については、Mahout に関する優れた書籍を参照してください (申し訳ありませんが、適切な指針がありません)。

大量のテキストを処理するための重要なアイデアは、スパース性を活用することです。いずれにせよ、値が 0 になる計算は避けるようにしてください。

于 2013-01-01T12:23:58.870 に答える
0

ここにいくつかの最適化があります。ペアごとの距離の行列は対角線について対称であるため、行列の上三角のみを計算します。さらに、実際のクラスタリングを行うには、ペアごとの距離の行列があれば、n-1 回の反復でこれを行うことができます。ペアごとの距離の行列を計算する高速な方法は、並列プログラミング (GPU など) を使用することです。結果は、GPU でのペアワイズ距離の計算が CPU よりも 64 高速であることを示しています。ただし、単一リンク階層クラスタリングのようなクラスタリング アルゴリズムの場合、実際のクラスタリングは CPU 上で実行する必要があります。

于 2012-12-25T17:25:57.143 に答える