Frage

Ich habe eine Funktion, die zwei Arrays enthält die Token / Wörter von zwei Texten nimmt und den Kosinus Ähnlichkeitswert gibt aus, welche die Beziehung zwischen den beiden Texten zeigt.

Die Funktion nimmt einen Array $ tokensA (0 => Haus, 1 => Fahrrad, 2 => Mann) und ein Array $ tokensB (0 => Fahrrad, 1 => Haus, 2 => Auto) und berechnet die Ähnlichkeit, die als Fließkommawert zurück gegeben.

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;
}

Wenn ich miteinander 75 Texte vergleichen wollen, muss ich 5625 einzelne Vergleiche machen, alle Texte haben miteinander verglichen.

Ist es möglich, MySQL räumliche Spalten zu verwenden, um die Anzahl von Vergleichen zu reduzieren?

Ich will nicht über meine Funktion oder über Möglichkeiten sprechen, Texte zu vergleichen. Gerade über die Anzahl der Vergleiche zu reduzieren.

MySQL räumliche Spalten

  • Sie erstellen räumliche Spalten mit: CREATE TABLE abc (clmnName TYPE)
  • mögliche Typen aufgelistet hier
  • hier ist, wie ich wählen die Daten später [eg MultiPointFromText () oder AsText ()]
  • Sie fügen Werte wie folgt aus: INSERT INTO clmnName VALUES (GeomFromText ( 'POINT (1 1)'))

Aber wie nutzen Sie diese für mein Problem?

PS: Ich bin nach Wegen suchen, um die Anzahl von Vergleichen mit Algorithmen in dieser Frage . Vinko Vrsalovic sagte mir, dass ich noch eine Frage für die räumlichen Eigenschaften öffnen sollte.

War es hilfreich?

Lösung

Während R-Trees kann im allgemeinen Indexdaten mit einer beliebigen Anzahl von Dimensionen, MySQL räumlichen Fähigkeiten begrenzt sind nur Typen Geometry (2 Dimensionen).

Wenn Sie Ihre Vektoren 2-dimensional und Sie können sie normalisieren, dann gehen Sie wie folgt vor:

  • Split den Kreis in der doppelten Anzahl von Winkeln, die Ihre Unterschiede passen
  • Finden Sie die MBR von Vektoren mit gegebener Cosinus Differenz von der Mitte jeden Sektor
  • Alle Vektoren innerhalb des MBR
  • Sie die Feinfilterung für genauen Unterschied.

In diesem Fall wird es jedoch besser, nur den Winkel des Wertes precaculate und indiziert mit einem einfachen B-Tree Index.

Andere Tipps

In der Tat müssen Sie nur 75 * 74/2 = 2775 Vergleiche. Sie vergleichen jedes Wort mit 74 anderen, aber Sie müssen nicht mit word2 vergleichen word1 und wieder word2 mit word1. So gibt es die Hälfte Vergleiche weniger .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top