Datenbank-Fuzzy-Search-Konzept


13

Ich habe darüber nachgedacht und versucht, Lösungen für die Fuzzy-Suche in einer Datenbank zu finden, wenn beispielsweise ein Benutzer einen Rechtschreibfehler eingibt. Hast du irgendwelche offensichtlichen Probleme mit der Logik dahinter? Wird es funktionieren und wurde es schon einmal gemacht?

Unseren Tisch möchten wir durchsuchen:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Daher speichern wir den Rohtextkörper für die physische Anzeige. Die anderen beiden Spalten werden für Suchvorgänge verwendet, die folgendermaßen vorberechnet werden:

Soundex

Der Körper wird in seine Worte zerlegt und in die Soundex-Version übersetzt. IE, resultierender Körper könnte ungefähr so ​​aussehen:

H252 B54 C23 E33... etc

Jemand könnte also 'dinosore' eingeben und der Artikeltext lautet 'dinosaur'. Beide werden mit B26 bewertet. Wir führen dann ein LIKE für den Soundex-Wert des Suchbegriffs aus.

Zeichencodiert

Angesichts einer Zeichenzuordnung, die Zeichen auf Primzahlen abbildet, führt IE Folgendes aus:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Wenn ein Benutzer 'hallo' eingeben wollte, aber zwei oder mehr Zeichen vertauschte, zum Beispiel 'hlelo', würde er dieselbe Zahl auswerten. Teilen Sie den Rohkörper in Wörter auf, kodieren Sie jedes Wort mit einem Primecode und speichern Sie ihn in der Datenbank. So erhalten Sie ein Feld, das wie folgt aussieht:

330 6825 330 1050... etc

Wir können diesen Wert dann gerne nach Fehlern durchsuchen.

Leistungen

  • Tippfehler geschützt gegen
  • Phonetisch falsche Schreibweisen geschützt gegen
  • Mehr nicht Muttersprachler Englisch sprechend freundlich
  • Funktioniert in jeder Sprache (wo Soundex funktioniert)

Kommentare und Gedanken? Eine Art vielschichtige Suche. Sie können natürlich die Rückgabewerte gewichten, um sie noch besser zu machen (dh eine wörtliche Textkörperübereinstimmung ist mehr wert).


Es wäre interessant zu sehen, wie dies mit Trigram Search verglichen wird.
Rich

Ich hätte gerne so etwas für WordPress ...
Kit Menke

Macht es die Verwendung von Primzahlen für Ihre Hashing-Funktion unmöglich, Wortkollisionen zu erzeugen, die keine identischen Methoden enthalten? Es scheint möglich zu sein, ein langes Wort mit vielen Buchstaben von geringem Wert zu haben, das den gleichen Wert wie ein kurzes Wort mit einigen Buchstaben von hohem Wert hat, aber ich kenne die Zahlentheorie nicht so gut Es ist wahrscheinlich gut so oder so bewiesen ...
Glenatron

1
@ Glen Afaik Multiplikation von Primzahlen erzeugt immer eine eindeutige Zahl. Anagramme werden zwar kollidieren, aber wie groß das Problem ist, das ist im Grunde der Sinn davon, Anagramme schnell zu finden.
Tom

@Glen: Siehe den einzigartigen Faktorisierungssatz für die Eindeutigkeit.
Steven Evers

Antworten:


2

Es gibt eine Reihe anderer Suchalgorithmen. Smith-Waterman ist einer der besseren für menschlichen Text, während BLAST (bisher) der beste für die Suche nach DNA-Sequenzen ist. Wenn Ihnen Text mit verschiedenen Rechtschreibfehlern angezeigt wird, z. B. hlepstatt help, suchen Sie nach dem Mindestbearbeitungsabstand .

Eine Bibliothek zum Implementieren einer Reihe dieser Funktionen in CLR in SQL Server 2005 (und höher) finden Sie im Quell-Forge-Projekt SimMetrics . Blogeintrag über SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex wurde entwickelt, weil der Hauptunterschied zwischen regionalen Sprachvariationen fast ausschließlich in den Vokalen lag - weshalb Vokale verworfen werden. Es ist nicht gut mit transponierten Briefen umzugehen.


2

Apache Solr unterstützt Synonyme und Rechtschreibkorrekturen - obwohl es an den Rändern immer noch etwas rau ist.

Fuzzy Searches können mit Ngrams implementiert werden,

Porter Stemmer: http://tartarus.org/~martin/PorterStemmer/

und eine Sprachdatenbank wie http://wordnet.princeton.edu/

... aber Projekte wie Xapian und Solr erledigen vieles für Sie.

Wenn Sie Ihre eigene Wortsuchbegriff-Analyse- / Suchmaschine erstellen möchten, würde ich empfehlen, die von Ihnen generierten Token oder Begriffe in eine vorhandene Datenbank zu stellen, die für die Durchführung einer Sprachsuche ausgelegt ist.


1

Ich habe so etwas vor einiger Zeit für Adressen gemacht, die prüften, wie viele Änderungen erforderlich waren, um eine Zeichenfolge in eine andere Zeichenfolge umzuwandeln, und einen numerischen Wert zwischen 0 und 1 zurückgaben, um festzustellen, wie genau die beiden übereinstimmten.

Es hat hervorragend geklappt, da es einen hohen Wert für Elemente wie N / North, St / Street, EastMain / MainEast usw. zurückgeben würde. Die Idee kam von diesem CodeProject-Link


Entspricht der Code, den Sie für die Adresse geschrieben haben, Open Source?
Dies ist der

@Thismatters Ich habe keinen Zugriff auf den Code, aber der Link in meiner Antwort sollte die Logik dafür liefern. Grundsätzlich möchten Sie nur sehen, wie viele Änderungen erforderlich sind, um eine Zeichenfolge in die andere zu verwandeln.
Rachel

0

Wenn Sie mit Namen, Personen oder Orten übereinstimmen, kann eine Synonymliste viel besser funktionieren.

Soundex passt nicht zu "Dick == Richard" "Kit == Christopher" oder "Ms. == Mrs."

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.