【问题标题】:Speed up text comparisons (feature vectors) with spatial MySQL features使用空间 MySQL 功能加快文本比较(特征向量)
【发布时间】:2010-11-30 10:39:20
【问题描述】:

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

该函数接受一个数组 $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 告诉我,我应该针对空间特征提出另一个问题。

【问题讨论】:

    标签: mysql comparison spatial similarity


    【解决方案1】:

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

    如果您的向量是2-维并且您可以对其进行归一化,然后执行以下操作:

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

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

    【讨论】:

    • 我添加了一些关于我的函数和函数所用向量的细节。您认为这些方法可行吗?
    • 由于您的向量位于正交表的表面上,如果您有固定数量的维度(即一组固定的标记)并且MySQL 将能够构建在这个维度上的R-Tree。由于这些都不可行,因此该解决方案也不可行。
    • 所以我可以忘记这种使用 MySQL 空间特性的方法并寻找另一种方法吗?没有可能?
    • @marco92w:当然永远不要说“从不”,但就目前而言,我看不到在这里使用MySQL的空间能力的方法。
    • 您当然可以在代码中实现 R-Tree,无论是扩展 MySQL 还是 PHP(或 PECL 扩展)。当然,这不是一件小事。
    【解决方案2】:

    事实上,您只有 75 * 74 / 2 = 2775 次比较。您将每个单词与其他 74 个单词进行比较,但您不需要将 word1 与 word2 以及 word2 与 word1 进行比较。所以它减少了一半的比较

    【讨论】:

    • 谢谢,没错。 :) 但它仍然很多。而且我不比较单词而是比较文本。
    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2013-02-26
    • 2012-06-10
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多