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).
Antworten:
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.
hlep
statthelp
, 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.
quelle
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.
quelle
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
quelle
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."
quelle