2009-09-22 109 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