Hallo,
ich möchte zwei Variablen leicht unscharf vergleichen, also auch trotz leichten Schreibfehlern die Gleichheit feststellen können.
Wie geht das? Gibts da schon was vorgefertigtes?
LG Chris
unscharfer Variablenvergleiich
Ein fertiges Modul kenn ich jetzt nicht.
Du könntest die unterschiedlichen Zeichen zählen und dann vergleichen oder wenn es etwas mehr sein soll, auch einige Zeichenfolgen aus den Strings vergleichen.
Du könntest die unterschiedlichen Zeichen zählen und dann vergleichen oder wenn es etwas mehr sein soll, auch einige Zeichenfolgen aus den Strings vergleichen.
Das Problem ist die unscharfe Definition von "leicht unscharf".sprudel hat geschrieben:Hallo,
ich möchte zwei Variablen leicht unscharf vergleichen, also auch trotz leichten Schreibfehlern die Gleichheit feststellen können.
Wie geht das? Gibts da schon was vorgefertigtes?
Eventuell hilft dir das hier: http://de.wikipedia.org/wiki/Levenshtein-Distanz
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Um was handelt es sich denn? Strings? Numerische Werte?
Für erstere könnte das interessant sein:
http://de.wikipedia.org/wiki/Levenshtein-Distanz
In diesem Thread hatte Gerold dazu auch schon auf ein Python Modul verwiesen:
http://www.python-forum.de/topic-22195, ... t&start=15
Ansonsten gibts noch die Möglichkeit mit der difflib zu arbeiten.
Für erstere könnte das interessant sein:
http://de.wikipedia.org/wiki/Levenshtein-Distanz
In diesem Thread hatte Gerold dazu auch schon auf ein Python Modul verwiesen:
http://www.python-forum.de/topic-22195, ... t&start=15
Ansonsten gibts noch die Möglichkeit mit der difflib zu arbeiten.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Man kann keine "Variablen" unscharf vergleichen.
Wenn du von Strings spricht, koennte dir http://de.wikipedia.org/wiki/Levenshtein-Distanz helfen.
Edit: Seufz.
Wenn du von Strings spricht, koennte dir http://de.wikipedia.org/wiki/Levenshtein-Distanz helfen.
Edit: Seufz.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
Zur Ergänzung: http://www.guyrutenberg.com/2008/12/15/ ... in-python/
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
@philiston: Soll angeblich besser/schneller sein: http://mwh.geek.nz/2009/04/26/python-da ... -distance/
Bei SPOJ gibt es die Aufgabe Edit distance, bei der nichts anderes zu tun ist, als die Levenshtein-Distanz zwischen zwei Zeichenketten zu berechnen. In diesem Zusammenhang habe ich mir auch die beiden Implementierungen angesehen, auf die in diesem Thread hingewiesen wurde.
Fazit: Beide Implementierungen sind fehlerhaft. Beispiel: Die "Distanz" zwischen HURQBOHP und QKHOZ beträgt 7, beide Algorithmen liefern jedoch 6 als Ergebnis. Davon abgesehen, sind beide Implementierung auch ineffizient. Konkret:
[A] http://www.guyrutenberg.com/2008/12/15/ ... in-python/
http://mwh.geek.nz/2009/04/26/python-da ... -distance/
[C] Meine eigene Version (zeige ich nicht, weil sich die o.g. SPOJ-Aufgabe damit lösen lässt ...)
Nimmt man zwei Zeichenketten mit den Längen m und n, dann wird bei [A] eine mxn-Matrix aufgebaut. Sieht man sich die Funktionsweise des Algorithmus einmal genauer an, merkt man schnell, dass das überflüssig ist. Abgesehen vom überflüssigen Speicherbedarf, führt das gerade in Python, das keine echten zweidimensionalen Arrays kennt, zu sehr schlechter Performance. Dass im konkreten Fall statt verschachtelter Listen mit einem Dictionary mit Tupeln als Schlüsseln gearbeitet wird, macht die Perfomance auch nicht gerade besser.
Algorithmus ist da schon um Längen besser, weil ohne komplette Matrix gearbeitet wird. Allerdings ist die Implementierung unnötig umständlich und an einigen Stellen auch ineffizient. Und, wie ich oben schon erwähnte, ohnehin fehlerhaft.
Zum Vergleich der Performance-Unterschiede habe ich die L-Distanz zweier zufällig generierter Zeichenketten mit je 2000 Zeichen berechnet (das mag in der Praxis unrealistisch sein, aber bei der o.g. SPOJ-Aufgabe geht es um diese Größenordnung). Die Laufzeiten auf meinem (sehr alten) Rechner waren (mit Verwendung von psyco!): [A] 228 s, 2,73 s und [C]: 0,16 s.
Grundlage für meinen eigenen Code war im Übrigen der gut verständliche Pseudo-Code des Wikipedia-Artikels.
Fazit: Beide Implementierungen sind fehlerhaft. Beispiel: Die "Distanz" zwischen HURQBOHP und QKHOZ beträgt 7, beide Algorithmen liefern jedoch 6 als Ergebnis. Davon abgesehen, sind beide Implementierung auch ineffizient. Konkret:
[A] http://www.guyrutenberg.com/2008/12/15/ ... in-python/
http://mwh.geek.nz/2009/04/26/python-da ... -distance/
[C] Meine eigene Version (zeige ich nicht, weil sich die o.g. SPOJ-Aufgabe damit lösen lässt ...)
Nimmt man zwei Zeichenketten mit den Längen m und n, dann wird bei [A] eine mxn-Matrix aufgebaut. Sieht man sich die Funktionsweise des Algorithmus einmal genauer an, merkt man schnell, dass das überflüssig ist. Abgesehen vom überflüssigen Speicherbedarf, führt das gerade in Python, das keine echten zweidimensionalen Arrays kennt, zu sehr schlechter Performance. Dass im konkreten Fall statt verschachtelter Listen mit einem Dictionary mit Tupeln als Schlüsseln gearbeitet wird, macht die Perfomance auch nicht gerade besser.
Algorithmus ist da schon um Längen besser, weil ohne komplette Matrix gearbeitet wird. Allerdings ist die Implementierung unnötig umständlich und an einigen Stellen auch ineffizient. Und, wie ich oben schon erwähnte, ohnehin fehlerhaft.
Zum Vergleich der Performance-Unterschiede habe ich die L-Distanz zweier zufällig generierter Zeichenketten mit je 2000 Zeichen berechnet (das mag in der Praxis unrealistisch sein, aber bei der o.g. SPOJ-Aufgabe geht es um diese Größenordnung). Die Laufzeiten auf meinem (sehr alten) Rechner waren (mit Verwendung von psyco!): [A] 228 s, 2,73 s und [C]: 0,16 s.
Grundlage für meinen eigenen Code war im Übrigen der gut verständliche Pseudo-Code des Wikipedia-Artikels.
Beides sind aber gar keine Implementierung der Levensthein-Distanz, sondern der Damerau-Levenshtein-Distanz. Zitat von der zweiten Webseite zum obigen Beispiel:numerix hat geschrieben:Fazit: Beide Implementierungen sind fehlerhaft. Beispiel: Die "Distanz" zwischen HURQBOHP und QKHOZ beträgt 7, beide Algorithmen liefern jedoch 6 als Ergebnis.
"Both algorithms give the correct answer for that pair: delete H, U, R, replace B with K, transpose O and H, replace P with Z. Six steps."
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
Exakt. Die Damenrau-Levenshtein-Distanz liefert für das Vergleichen menschlicher Eingaben eben einen nützlicheren Wert, gerade das Vertauschen kommt doch sehr häufig vor und ist m.E. nicht 2 Operationen wert.bords0 hat geschrieben:Beides sind aber gar keine Implementierung der Levensthein-Distanz, sondern der Damerau-Levenshtein-Distanz. Zitat von der zweiten Webseite zum obigen Beispiel:numerix hat geschrieben:Fazit: Beide Implementierungen sind fehlerhaft. Beispiel: Die "Distanz" zwischen HURQBOHP und QKHOZ beträgt 7, beide Algorithmen liefern jedoch 6 als Ergebnis.
"Both algorithms give the correct answer for that pair: delete H, U, R, replace B with K, transpose O and H, replace P with Z. Six steps."
Danke euch beiden für die Korrektur und Hinweise. Mir war nicht bewusst, dass "Levensthein-Distanz" != "Damerau-Levenshtein-Distanz" gilt. Eine erhebliche Verbesserung der Performance der beiden verlinkten Algorithmen ist allerdings trotzdem möglich.
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
Wenn du das Thema Performance-Verbesserung schon ansprichst, welche Teilbereiche des Algorithmus B findest du besonders schlecht/langsam implementiert?
Mir erscheint dieser gar nicht so uneffektiv.
Diese Frage wäre sicher auch für andere User hier im Forum interessant.
Mir erscheint dieser gar nicht so uneffektiv.
Diese Frage wäre sicher auch für andere User hier im Forum interessant.