22 Stimmen

Wie findet man die Ähnlichkeit zwischen mySQL-Zeilen?

Ich versuche, ein Skript zu erstellen, das einen passenden Prozentsatz zwischen meinen Tabellenzeilen findet. Zum Beispiel meine mySQL-Datenbank in der Tabelle Produkte enthält das Feld Name (indiziert, FULLTEXT) mit Werten wie

LG 50PK350 PLASMA TV 50" Plasma TV Full HD 600Hz 
LG TV 50PK350 PLASMA 50"
LG S24AW 24000 BTU
Aircondition LG S24AW 24000 BTU Inverter

Wie Sie sehen können, haben sie alle dasselbe Schlüsselwort. Aber der 1. Name und der 2. Name sind sich ähnlicher. Außerdem haben der 3. und 4. Name mehr ähnliche Schlüsselwörter als der 1. und 2.

Meine mySQL-DB enthält Tausende von Produktnamen. Ich möchte die Namen finden, die mehr als einen bestimmten Prozentsatz (sagen wir 60 %) an Ähnlichkeit aufweisen.

Zum Beispiel werden, wie gesagt, 1. und 2. (und jeder andere Name), die zu mehr als 60 % übereinstimmen, in einem gruppenähnlichen Format angezeigt, damit ich weiß, dass diese Produkte ähnlich sind. 3. und 4. und alle anderen, die zu mehr als 60 % übereinstimmen, werden in einer anderen Gruppe wiedergegeben, um mir mitzuteilen, dass diese Produkte übereinstimmen.

Wenn es möglich ist, wäre es toll, die Schlüsselwörter, die alle gruppierten übereinstimmenden Namen erfüllen, auszugeben. Zum Beispiel LG S24AW 24000 BTU ist das Schlüsselwort, das im 3. und 4. Namen enthalten ist.

Am Ende werde ich eine Liste mit all diesen Stichwörtern erstellen.

Was ich jetzt habe, ist die folgende Abfrage (wie Jitamaro vorgeschlagen)

Select t1.name, t2.name From products t1, products t2

die ein neues Namensfeld neben allen anderen Namen erzeugt. Entschuldigen Sie, dass ich nicht weiß, wie ich es richtig erklären soll, aber das ist, was es tut: (Die echten Werte sind Produktnamen wie oben)

Vor der Abfrage

-name-
A
B
C
D
E

Nach der Abfrage

-name- -name-
A        A
B        A
C        A
D        A
E        A
A        B
B        B
C        B
D        B
E        B
.
.
.

Gibt es eine Möglichkeit, entweder mit mySQL oder PHP, die mir die passenden Namen findet und die Schlüsselwörter extrahiert, wie ich es oben beschrieben habe? Bitte teilen Sie Code-Beispiele.

Vielen Dank an die Gemeinschaft.

0voto

Jesse Seger Punkte 901

Es scheint, dass Sie vielleicht immer die kürzeste Zeichenkette zurückgeben wollen? Das ist mehr eine Frage als alles andere. Aber dann könnte man etwas haben wie...

SELECT * FROM products LIMIT 1
WHERE product_name like '%LG%'
ORDER BY LENGTH(product_name) ASC

0voto

Micromega Punkte 12386

Wenn Sie alle Namen gegeneinander prüfen wollen, brauchen Sie einen Cross-Join in Mysql. Es gibt viele Möglichkeiten, dies zu erreichen:

1. Select a, b From t1, t2

2. Select a, b From t1 Join t2

3. Select a, b From t1 Cross Join t2

Dann können Sie das Ergebnis in einer Schleife durchgehen. Das ist dasselbe, wenn ich sage, dass ich ein 2D-Array mit n^2-(n-1) Elementen erstellen soll und jedes Element mit jedem anderen verbunden ist.

P.S.: Select t1.name, t2.name From produkte t1, produkte t2

0voto

Micromega Punkte 12386

Vielleicht wollen Sie die längste gemeinsame Teilzeichenkette aus den 2 Zeichenketten finden? Dann müssen Sie für jede Ihrer Zeichenketten einen Suffixbaum berechnen, siehe hier http://en.wikipedia.org/wiki/Longest_common_substring_problem .

0voto

Michael Mior Punkte 27045

Ihr Ansatz scheint vernünftig zu sein. Um ähnliche Produkte zu finden, würde ich eine Trigrammsuche vorschlagen. Es gibt eine ziemlich gute Erklärung, wie das funktioniert, zusammen mit dem String::Trigramm Perl-Modul.

Ich würde vorschlagen, die Trigrammsuche zu verwenden, um eine Liste von Übereinstimmungen zu erhalten, vielleicht in Verbindung mit einer manuellen Überprüfung, je nachdem, wie viele Daten Sie zu verarbeiten haben und wie häufig Sie neue Produkte hinzufügen müssen. Ich habe festgestellt, dass dieser Ansatz in der Praxis recht gut funktioniert.

-1voto

techspeque Punkte 26

Ok, ich denke, ich habe versucht, sehr viel ähnliche Sache zu implementieren. Es kann das gleiche wie das Google Chrome Adressfeld funktionieren. Wenn man die Adresse eintippt, bekommt man Vorschläge. Dies ist, was Sie versuchen zu erreichen, soweit ich betroffen bin.

Ich kann Ihnen keine genaue Lösung anbieten, aber einige Ratschläge.

  1. Sie müssen die Dropdown-Box implementieren, in die der Benutzer das gesuchte Produkt eingibt
  2. Dann müssen Sie den aktuellen Wert des Dropdowns erhalten und dann Abfrage wie Kerl oben geschrieben laufen. Das kann sein "SELECT * FROM product WHERE product_name LIKE 'LG%';"
  3. Ergebnisse der Abfrage speichern
  4. Aktualisieren Sie die Seite
  5. Fügen Sie die Ergebnisse der Abfrage in die Dropdown-Liste ein

Nota:

Sie müssen die Abfrageergebnisse irgendwo speichern, z. B. in einer Textdatei mit dem HTML-Code "option" LG TS 600"/option" (fügen Sie der Option natürlich <> Klammern hinzu). Diese Werte werden nach dem Aktualisieren der Seite zum Auffüllen Ihres Optionsfeldes verwendet. Sie müssen die Benutzersitzung für den Benutzer einrichten, um dieselben Ergebnisse für denselben Benutzer zu erhalten, andernfalls könnte es zu Konflikten kommen, wenn mehrere Benutzer die Suche gleichzeitig verwenden würden. Mit der Such-ID und der Sitzungs-ID können Sie sie dann abgleichen. Sie können sie in der Datei oder in der Tabelle speichern. Die Tabelle wäre praktischer. Es ist eigentlich in meinem Sinne das ganze Subsystem für das, wonach Sie suchen.

Ich hoffe, es hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X