使用空间MySQL功能加快文本比较(特征向量)

时间:2009-09-22 14:59:49

标签: mysql comparison spatial similarity

我有一个函数,它接受两个包含两个文本的标记/单词的数组,并给出余弦相似度值,显示两个文本之间的关系。

该函数采用数组$ 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)
  • 列出了可能的类型here
  • here是我以后选择数据的方式[例如MultiPointFromText()或AsText()]
  • 您插入如下值:INSERT INTO clmnName VALUES(GeomFromText('POINT(1 1)'))

但你怎么用这个来解决我的问题?

PS:我正在寻找减少算法in this question的比较次数的方法。 Vinko Vrsalovic告诉我,我应该为空间特征打开另一个问题。

2 个答案:

答案 0 :(得分:1)

事实上,您只有 75 * 74/2 = 2775 比较。您将每个单词与其他单词进行比较,但您不需要将word1与word2进行比较,再将word2与word1进行比较。因此,它使一半的比较更少

答案 1 :(得分:1)

虽然R-Trees通常可以使用任意数量的维度对数据进行索引,但MySQL空间能力仅限于Geometry种类型(2维度)。

如果你的向量是2 - 维,你可以将它们标准化,然后执行以下操作:

  • 将圆圈分成适合您差异的角度数的两倍
  • 从每个扇区的中心找到具有给定余弦差的向量的MBR
  • 查找MBR
  • 中的所有向量
  • 进行精细过滤以获得精确差异。

但是,在这种情况下,最好只是预先计算值的角度,并使用普通的B-Tree索引对其进行索引。