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

steve Punkte 565

Diese Frage ist ähnlich :) wie diese:

Wie lässt sich eine Teilstringsuche in SQL am besten implementieren?

Trigramm kann leicht ähnliche Zeilen finden, und in dieser Frage habe ich eine php+mysql+trigram Lösung .

0voto

Timur Punkte 6598

Ich würde Ihnen raten, eine Volltextsuchmaschine zu verwenden, z. B. sphinx . Es bietet die Möglichkeit, jeden gewünschten Algorithmus zu implementieren. Zum Beispiel können Sie "quorom" oder "any" Suchen verwenden.

0voto

Tae-Sung Shin Punkte 19639

Hierbei handelt es sich um ein Clustering-Problem, das durch eine Data-Mining-Methode gelöst werden kann. ( http://en.wikipedia.org/wiki/Cluster_analysis ) Es erfordert viele speicher- und rechenintensive Operationen, die für eine Datenbank-Engine nicht geeignet sind. Andernfalls hätte es keine separate Data-Mining-, Text-Mining- oder Business-Analytics-Software gegeben.

0voto

Peter Sherman Punkte 304

Wenn Ihre Datenbank lediglich einen UPC-Code als eines ihrer Felder hätte und dieses Feld gut gepflegt wäre, d. h. Sie könnten sich darauf verlassen, dass es vom Datenbankverwalter korrekt eingegeben wurde und den Artikel korrekt wiedergibt, dann müssten Sie nicht all die Arbeit machen, die Sie vorschlagen.

Eine noch bessere Idee wäre es, in Ihrer nächsten Datenbank ein UPC-Feld einzurichten - und es als eindeutig zu kennzeichnen.

Datenbankbenutzer, die versuchen, ein bereits vorhandenes UPC in die Datenbank aufzunehmen, erhalten eine Fehlermeldung.

Die Datenbank bewahrt ihre Integrität.

Und wenn eine solche Datenbank ihre Integrität bewahren würde, würde sich die Notwendigkeit, das zu tun, was Sie vorschlagen, niemals ergeben.

Das hilft Ihnen wahrscheinlich nicht viel bei Ihrer aktuellen Aufgabe (Entschuldigung) - aber für eine zukünftige ähnliche Datenbank sollten Sie vielleicht darüber nachdenken...

0voto

Jeff Ferland Punkte 17180

Es hört sich so an, als hätten Sie sich die Mühe gemacht, ein komplexes Szenario zu erklären, und dann gesagt, dass Sie die optimalen Antworten ignorieren und von uns nur das "Handshake"-Protokoll erhalten wollen (alles wird mit allem verglichen, was noch nicht damit verglichen wurde). Also... Pseudocode:

select * from table order by id
while (result) {
    select * from table where id > result_id
}

Das wird genügen.

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