Stringähnlichkeitsalgorithmen?
Muss ich 2 strings vergleichen und berechnen Sie die ähnlichkeit, filtern unten eine Liste von ähnlichen strings.
ZB. die Suche nach "Hund" zurückkehren würde,
- Hund
- doggone
- Moor
- Nebel
- neblig
ZB. die Suche nach "Riss" zurückkehren würde,
- crack
- wisecrack
- rack
- jack
- quack
Mir begegnet:
Kennen Sie eine weitere Zeichenfolge ähnlichkeit algorithmen?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es scheint, Sie brauchen eine Art von fuzzy-matching. Hier ist die java-Implementierung von einiger ähnlichkeit Metriken http://www.dcs.shef.ac.uk/~sam/stringmetrics.html. Hier finden Sie ausführlichere Erläuterung der string-Metriken http://www.cs.cmu.edu/~wcohen/postscript/ijcai-ws-2003.pdf es hängt davon ab, wie verschwommen und wie schnell die Umsetzung erfolgen muss.
InformationsquelleAutor der Antwort
Den Die Levenshtein - Entfernung ist der Algorithmus, den ich empfehlen würde. Es berechnet die minimale Anzahl von Operationen, die Sie tun müssen, zu ändern, 1 string in einem anderen. Die weniger änderungen bedeutet, die Saiten werden mehr ähnlich...
InformationsquelleAutor der Antwort Peter
Wenn der Fokus auf Leistung, würde ich implementieren einen Algorithmus basierend auf einer
trie
Struktur(funktioniert gut, um Wörter in einem text, oder um richtige Wort, aber in Ihrem Fall finden Sie schnell alle Wörter mit einem bestimmten Wort oder alle, aber ein Brief, zum Beispiel).
Folgen Sie bitte zuerst den wikipedia-link oben.
Tries
ist die Schnellste Worte Sortier-Methode (n Worte, Suche sO(n) zu erstellen, die versuchten, O(1) Suche s (oder wenn Sie es bevorzugen, wenn eine ist die Durchschnittliche Länge, O(eine) für die trie und O(s) für die Suche)).Eine schnelle und einfache Umsetzung (optimiert) von Ihrem problem (ähnliche Wörter) besteht aus
Beispiel, mit den Worten
car
vars
.Bau der Marina (großer Buchstabe bedeutet ein Wort hier zu Ende, während andere möglicherweise fortfahren). Die
>
- post-index (vorwärts gehen) und<
ist pre-index (rückwärts gehen). In einem anderen Beispiel, das wir haben können, zeigen auch die Start-Brief, es wird nicht dargestellt, hier für Klarheit.Die
<
und>
in C++ zum Beispiel wäreMystruct *previous,*next
, Bedeutung vona > c < r
Sie können direkt vona
zuc
, und Umgekehrt, auch vona
zuR
.Suchen ausschließlich für Auto die Marina bietet Ihnen Zugriff vom 1., und Sie finden Auto (Sie hätte auch alles ab Autoaber auch alles, was mit Auto-innen - ist es nicht in der Beispiel - aber Vikar zum Beispiel hätte aus
c > i > v < a < R
).Zu suchen, während es die 1-Buchstaben-falsche/fehlende Toleranz, die Sie Durchlaufen, die aus jedem Brief von sund zählen die Anzahl der aufeinander folgenden oder durch überspringen von 1 Brief - Briefe erhalten Sie von s in der trie.
suchen
car
,c
: die Suche im trie fürc < a
undc < r
(fehlende Buchstaben in s). Zu akzeptieren einen falschen Buchstaben in einem Wort wversuchen zu springen, die bei jedem Durchlauf die falschen Buchstaben zu sehen, wennar
hinter, dieser ist O(w). Mit zwei Buchstaben, O(w2) usw... aber eine andere Ebene des index Hinzugefügt werden könnten, um den trie zu berücksichtigen, die springen über Briefe - die in der Marina Komplex und gierig in Bezug auf Speicher.a
dannr
: dasselbe wie oben, aber auf der Suche nach hinten so gutDies ist nur um eine Idee über das Prinzip - das Beispiel oben kann haben einige Probleme (check ich morgen wieder).
InformationsquelleAutor der Antwort
Könnte man dies tun:
Mit matchedCharacters können Sie bestimmen den "Grad" des Spiels. Wenn es gleich der Länge von Nadelalle Zeichen in Nadel sind auch in string. Wenn Sie auch speichern Sie den offset des ersten übereinstimmenden Charakter, Sie können Sie auch Sortieren Sie das Ergebnis durch die "Dichte" der übereinstimmenden Zeichen durch die Subtraktion der offset des ersten übereinstimmenden Zeichen ab dem offset, der das Letzte passende Zeichen offset; je geringer der Unterschied, desto dichter das match.
InformationsquelleAutor der Antwort
InformationsquelleAutor der Antwort