1

2つのテキストのトークン/単語を含む2つの配列を取り、両方のテキスト間の関係を示す余弦類似度値を出力する関数があります。

この関数は、配列$ tokensA(0 => house、1 =>bike、2 => man)と配列$ tokensB(0 =>bike、1 => house、2 => car)を取り、次のような類似性を計算します。浮動小数点値として返されます。

function cosineSimilarity($tokensA, $tokensB) {
    $a = $b = $c = 0;
    $uniqueTokensA = $uniqueTokensB = array();
    $uniqueMergedTokens = array_unique(array_merge($tokensA, $tokensB));
    foreach ($tokensA as $token) $uniqueTokensA[$token] = 0;
    foreach ($tokensB as $token) $uniqueTokensB[$token] = 0;
    foreach ($uniqueMergedTokens as $token) {
        $x = isset($uniqueTokensA[$token]) ? 1 : 0;
        $y = isset($uniqueTokensB[$token]) ? 1 : 0;
        $a += $x * $y;
        $b += $x;
        $c += $y;
    }
    return $b * $c != 0 ? $a / sqrt($b * $c) : 0;
}

75のテキストを相互に比較する場合、すべてのテキストを相互に比較するには、5,625の単一比較を行う必要があります。

MySQLの空間列を使用して比較の数を減らすことは可能ですか?

自分の機能やテキストの比較方法については話したくありません。比較の数を減らすことについて。

MySQLの空間列

  • 次のコマンドで空間列を作成します:CREATE TABLE abc(clmnName TYPE)
  • 可能なタイプはここにリストされています
  • 後でデータを選択する方法は次のとおりです[例:MultiPointFromText()またはAsText()]
  • 次のように値を挿入します。INSERTINTOclmnNameVALUES(GeomFromText('POINT(1 1)'))

しかし、これを私の問題にどのように使用しますか?

PS:この質問のアルゴリズムとの比較の数を減らす方法を探しています。Vinko Vrsalovicは、空間的特徴について別の質問を開く必要があると私に言いました。

4

2 に答える 2

1

実際、 75 * 74/2=2775の比較しかありません。すべての単語を他の74の単語と比較しますが、word1をword2と比較したり、word2をword1と比較したりする必要はありません。したがって、比較の半分が少なくなります。

于 2009-09-22T15:05:35.910 に答える
1

R-Trees一般に、任意の数の次元でデータにインデックスを付けることができますが、空間能力はタイプ(次元)MySQLにのみ制限されます。Geometry2

ベクトルが2次元であり、それらを正規化できる場合は、次のようにします。

  • 円をあなたの違いに合う角度の2倍の数に分割します
  • MBR各セクターの中心から与えられた正弦差を持つベクトルのを見つけます
  • 内のすべてのベクトルを検索しますMBR
  • 正確な違いのために細かいフィルタリングを行います。

ただし、この場合は、値の角度を事前に計算し、単純なB-Treeインデックスでインデックスを付ける方が適切です。

于 2009-09-22T15:06:35.160 に答える