2009-09-22 94 views
1

我有一个函数,它需要两个包含两个文本的标记/词的数组,并给出显示两个文本之间关系的余弦相似度值。加快具有空间MySQL特征的文本比较(特征向量)

该函数需要一个数组$ $ 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)'))

但你如何使用我的问题? PS:我正在寻找方法来减少与算法in this question比较的数量。 Vinko Vrsalovic告诉我,我应该为空间特征打开另一个问题。

回答

1

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

如果你的载体是2可以归他们,然后执行以下操作:

  • 斯普利特圈成适合角度的两倍数量的差异
  • 找到的MBR具有与每个扇区中心给定余弦差的向量
  • 查找MBR内的所有载体
  • 对e xact差异。

然而,在这种情况下,预先设定值的角度并用普通的索引索引它会更好。

+0

我已经添加了一些关于我的功能和函数所需的矢量的细节。你认为你的方法是可行的吗? – caw 2009-09-22 15:30:54

+1

由于您的矢量位于orthotope的表面,因此如果您有固定数量的维度(这是一组固定的令牌),并且MySQL可以在其上创建一个“R-Tree”这个维数。既然这些都不可能,这个解决方案也不可行。 – Quassnoi 2009-09-22 16:13:13

+0

所以我可以用MySQL的空间特性来忘记这种方法并寻找另一种方式?没有可能? – caw 2009-09-22 18:08:49

1

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

+0

谢谢,没错。 :)但它仍然很多。我不会比较文字,而是比较文字。 – caw 2009-09-22 15:14:12