Ich suche nach einer Fuzzy-Such-JavaScript-Bibliothek, um ein Array zu filtern. Ich habe versucht, fuzzyset.js und fuse.js zu verwenden , aber die Ergebnisse sind schrecklich (es gibt Demos, die Sie auf den verlinkten Seiten ausprobieren können).
Nachdem ich etwas über die Levenshtein-Entfernung gelesen habe, scheint es mir eine schlechte Annäherung an das zu sein, wonach Benutzer suchen, wenn sie tippen. Für diejenigen, die es nicht wissen, berechnet das System, wie viele Einfügungen , Löschungen und Ersetzungen erforderlich sind, damit zwei Zeichenfolgen übereinstimmen.
Ein offensichtlicher Fehler, der im Levenshtein-Demerau-Modell behoben ist, besteht darin, dass sowohl Blub als auch Boob der Glühbirne gleich ähnlich sind (für die jeweils zwei Substitutionen erforderlich sind). Es ist jedoch klar, dass die Glühbirne dem Blub ähnlicher ist als der Boob , und das Modell, das ich gerade erwähnte, erkennt dies, indem es Transpositionen zulässt .
Ich möchte dies im Zusammenhang mit der Textvervollständigung verwenden. Wenn ich also ein Array habe ['international', 'splint', 'tinder']
und meine Abfrage int ist , sollte International meiner Meinung nach einen höheren Rang als Schiene haben , obwohl Ersteres eine Punktzahl (höher = schlechter) von 10 hat gegen die 3 des letzteren.
Was ich also suche (und erstellen werde, wenn es nicht existiert), ist eine Bibliothek, die Folgendes tut:
- Gewichtet die verschiedenen Textmanipulationen
- Gewichtet jede Manipulation unterschiedlich, je nachdem, wo sie in einem Wort vorkommt (frühe Manipulationen sind teurer als späte Manipulationen).
- Gibt eine nach Relevanz sortierte Ergebnisliste zurück
Ist jemand auf so etwas gestoßen? Mir ist klar, dass StackOverflow nicht der richtige Ort ist, um nach Softwareempfehlungen zu fragen, aber implizit (nicht mehr!) Ist Folgendes: Denke ich richtig darüber nach?
Bearbeiten
Ich habe ein gutes Papier (pdf) zu diesem Thema gefunden. Einige Notizen und Auszüge:
Affine Bearbeitungsentfernungsfunktionen weisen einer Folge von Einfügungen oder Löschungen relativ geringere Kosten zu
die Monger-Elkan-Distanzfunktion (Monge & Elkan 1996), eine affine Variante der Smith-Waterman-Distanzfunktion (Durban et al. 1998) mit bestimmten Kostenparametern
Für die Smith-Waterman-Distanz (Wikipedia) : "Anstatt die Gesamtsequenz zu betrachten, vergleicht der Smith-Waterman-Algorithmus Segmente aller möglichen Längen und optimiert das Ähnlichkeitsmaß." Es ist der n-Gramm-Ansatz.
Eine weitgehend ähnliche Metrik, die nicht auf einem Edit-Distance-Modell basiert, ist die Jaro-Metrik (Jaro 1995; 1989; Winkler 1999). In der Literatur zu Datensatzverknüpfungen wurden gute Ergebnisse mit Varianten dieser Methode erzielt, die auf der Anzahl und Reihenfolge der gemeinsamen Zeichen zwischen zwei Zeichenfolgen basiert.
Eine Variante davon aufgrund von Winkler (1999) verwendet auch die Länge P des längsten gemeinsamen Präfixes
(scheinen hauptsächlich für kurze Saiten gedacht zu sein)
Für die Vervollständigung von Texten scheinen die Ansätze von Monger-Elkan und Jaro-Winkler am sinnvollsten zu sein. Winklers Hinzufügung zur Jaro-Metrik gewichtet die Wortanfänge effektiv stärker. Und der affine Aspekt von Monger-Elkan bedeutet, dass die Notwendigkeit, ein Wort zu vervollständigen (was einfach eine Folge von Ergänzungen ist), es nicht zu stark benachteiligt.
Fazit:
Das TFIDF-Ranking schnitt unter mehreren tokenbasierten Entfernungsmetriken am besten ab, und eine von Monge und Elkan vorgeschlagene abgestimmte affine-Gap-Editierdistanzmetrik schnitt unter mehreren String-Editierdistanzmetriken am besten ab. Eine überraschend gute Distanzmetrik ist ein schnelles heuristisches Schema, das von Jaro vorgeschlagen und später von Winkler erweitert wurde. Dies funktioniert fast so gut wie das Monge-Elkan-Schema, ist jedoch um eine Größenordnung schneller. Eine einfache Möglichkeit, die TFIDF-Methode und den Jaro-Winkler zu kombinieren, besteht darin, die in TFIDF verwendeten genauen Token-Übereinstimmungen durch ungefähre Token-Übereinstimmungen zu ersetzen, die auf dem Jaro-Winkler-Schema basieren. Diese Kombination ist im Durchschnitt etwas besser als Jaro-Winkler oder TFIDF und gelegentlich viel besser. Die Leistung kommt auch einer erlernten Kombination mehrerer der besten in diesem Dokument berücksichtigten Metriken nahe.
krole
kehrt die Eingabe nicht zurück Final Fantasy V: Krile
, obwohl ich es gerne hätte. Es erfordert, dass alle Zeichen in der Abfrage im Ergebnis in derselben Reihenfolge vorhanden sind, was ziemlich kurzsichtig ist. Es scheint, dass die einzige Möglichkeit für eine gute Fuzzy-Suche darin besteht, eine Datenbank mit gängigen Tippfehlern zu haben.