Anfänger braucht Hilfe - Texte auf Ähnlichkeit überprüfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Ich hab folgendes Problem:
Ich habe eine Access Datenbank die ich mit Python durchsuchen muss. Es gibt eine Spalte namens InfoText und eine Spalte namens InfoNr. Jeder InfoText bezieht sich auf eine InfoNr. So ist die InfoNr 13 z.b. InfoText "Schmelzen_ct1"
Jetzt muss ich mit Python diese Spalten durchsuchen und herausfinden ob der InfoText zu der InfoNr passt. Wenn jetzt jemand z.B. den InfoText falsch geschrieben hat ( "Shcmelzen_ct1" ) soll python eine Warnung ausgeben und den Schreibfehler korrigieren. Sollte allerdings der Text total unterschiedlich sein, also z.b. "Löten_ct2" soll eine Errormassage kommen und der Fehler nicht korrigiert werden.

Jetzt geht es mir aber vorerst nur um den Vergleich zweier Texte. Sagen wir einfach mal 2 strings. 2 strings werden von Tastatur eingelesen und sollte sich String 2 von String 1 nur in einem oder 2 Buchstaben unterscheiden soll String 1 überschrieben werden, wenn es mehr Unterschiede gibt sollen beide beibehalten werden und eine Nachricht ausgegeben werden. Wie geh ich das am besten an?

danke im Vorraus :oops:
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

--- Heiko.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Hallo stigi,
stigi hat geschrieben:Es gibt eine Spalte namens InfoText und eine Spalte namens InfoNr. Jeder InfoText bezieht sich auf eine InfoNr. So ist die InfoNr 13 z.b. InfoText "Schmelzen_ct1"
Schlechtes Datenbankdesign! Sagt Dir der Begriff 'Normalisierung' etwas?
http://de.wikipedia.org/wiki/Normalisie ... tenbank%29
stigi hat geschrieben:Jetzt geht es mir aber vorerst nur um den Vergleich zweier Texte. Sagen wir einfach mal 2 strings. 2 strings werden von Tastatur eingelesen und sollte sich String 2 von String 1 nur in einem oder 2 Buchstaben unterscheiden soll String 1 überschrieben werden, wenn es mehr Unterschiede gibt sollen beide beibehalten werden und eine Nachricht ausgegeben werden. Wie geh ich das am besten an?
Obwohl Du mit der zweiten Normalform (siehe Link oben) das Problem wohl gar nicht hättest: such mal nach "Levenshtein".
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

@modelnine: Interessant, dass ich für meinen Beitrag eine Minute gebraucht hab und Du für Deinen 10 Minuten. :lol:
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

Normalisierung sagt mir leider nichts, die Datenbank ist auch nicht von mir, das was ich geschrieben hatte war nur ein Beispiel und entspricht nicht dem orginial welches ich zu bearbeiten habe. Das haben andere Leute geschrieben und ich denk mal das die davon mehr Ahnung haben als ich :lol: die wollen nur das ich ne "schwierigere" aufgabe habe um mich besser in python einzulernen.

kann mir jemand ein anwendungsbeispiel geben zu dem ersten link ?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Das Modul aus:

http://svn.modelnine.org/svn/levenshtein

auschecken, dann kompilieren, installieren (siehe den Link, für Geschwindigkeit mit -O3 kompilieren wie's da steht), und ausprobieren:

Code: Alles auswählen

print levenshtein.levenshtein("test","temp")
Der Levenshtein-Algorithmus gibt eine Distanz zurück, die die Ähnlichkeit zwischen zwei Strings ausdrückt. Je kleiner die Distanz, desto ähnlicher sind sie. Für eine genauere Beschreibung was der Algorithmus macht und was er zurückliefert, siehe (z.B.) Wikipedia.

Vielleicht solltest Du die beiden Strings vorher noch "normalisieren," bevor Du sie durch Levenshtein durchjagst, da Groß-/Kleinschreibung als unterschiedliche Werte angesehen werden, bei manchen RDBMs aber als Spalten-/Tabellenname dieses eben irrelevant ist.
--- Heiko.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

PS: Wenn's Dir nicht um Geschwindigkeit geht kannst Du den Levenshtein-Algorithmus natürlich auch in Python implementieren (oder nach einer Implementierung suchen), dann hast Du keine äußeren Abhängigkeiten.
--- Heiko.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

hab das jetzt mal versucht, sicherlich komplett falsch, deswegen gehts auch net ;P

folgender fehler kommt in der commandline

Y:\Mitarbeiter\mustermapa\pythonwin>setup.py -vv -s "import levenshtein" \ "lev
enshtein.levenshtein(\"hello\",\"heike\")"
File "Y:\Mitarbeiter\mustermapa\pythonwin\setup.py", line 1
from distutils.core import setup Extension
^
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Ich versteh nicht ganz was Du da machst... Hast Du einen C-Compiler installiert? Wenn ja, dann solltest Du über distutils die Erweiterung installieren können, wenn nein, dann nicht. Dann mußt Du, wie ich in meinem letzten Beitrag sagte, entweder den Levenshtein-Algorithmus in purem Python suchen (auch nicht weiter schwer, siehe zum Beispiel Google), oder aber ihn selbst implementieren (genausowenig schwer, siehe zum Beispiel Wikipedia für eine Beschreibung des Algorithmus), auch in Pure-Python.
--- Heiko.
BlackJack

stigi hat geschrieben:Jetzt muss ich mit Python diese Spalten durchsuchen und herausfinden ob der InfoText zu der InfoNr passt. Wenn jetzt jemand z.B. den InfoText falsch geschrieben hat ( "Shcmelzen_ct1" ) soll python eine Warnung ausgeben und den Schreibfehler korrigieren. Sollte allerdings der Text total unterschiedlich sein, also z.b. "Löten_ct2" soll eine Errormassage kommen und der Fehler nicht korrigiert werden.
Das automatische korrigieren würde ich lassen. Man sollte Nutzer gar nicht erst daran gewöhnen, das "kleine" Fehler durchgehen. Dann sehen die keine Veranlassung ihre Eingabe zu Korrigieren. Warnungen werden gerne ignoriert wenn das richtige Ergebnis am Ende herauskommt.

Ausserdem musst Du natürlich aufpassen, dass Du nichts "falsch" korrigierst.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

das programm soll nicht parallel zur eingabe laufen. die user schreiben tagsüber ihre daten in die access tabelle und über nacht läuft das python programm drüber, korrigiert wenn nötig und gibt eine logfile dazu aus. die user selbst bekommen davon nichts mit
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

stigi hat geschrieben:das programm soll nicht parallel zur eingabe laufen.
Die zeitliche Verschiebung ändert überhaupt nichts an der von BlackJack angesprochenen Problematik.
stigi hat geschrieben:die user selbst bekommen davon nichts mit
Eben. Wie gesagt: sauber normalisieren und das Problem mit falschen Schlüsseln tritt erst gar nicht auf.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ja für die zukunft is das ja ok mit dem normalisieren, aber die datenbanken existieren nunmal schon - mit den fehlern - und die müssen behoben werden.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ich hab mir jetzt diese file
http://trific.ath.cx/Ftp//python/levens ... 0.1.tar.gz

runtergeladen, ich weiß leider trotzdem nicht wie ich sie verwenden soll :oops:
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

OT: Interessanterweise bekomme ich da auch den transformation_error. Hab's aber gerade nochmal bei sourceforge getestet. Dort kann ich tar.gz-Dateien problemlos runterladen. :?:

Was mir bei dieser URL grad auffällt ist der Doppelslash nach "Ftp"...
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ich hab die file runtergeladen, aber wie importiere ich die jetzt in mein pythonwin ?

immer wenn ich schreib:

>>> from Levenshtein import *

kommt:

Traceback (most recent call last):
File "<interactive input>", line 1, in ?
ImportError: No module named Levenshtein

wo muss ich diese file hinkopieren, bzw hinextrahieren ? muss ich dann noch was mit den files da drin machen ?!
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Wie wärs mit:

*Trommelwirbel*

Python-Doku lesen?

Tschuldigung, diese Frage ist wirklich zur genüge überall (nicht nur hier im Forum) wieder und wieder beantwortet worden, und steht auch an vielen Stellen in der Python-Doku. Wenn Du nicht die Eigeninitiative besitzt Dich mal mit der Programmiersprache in der Du programmierst und Ihrer Umgebung auseinanderzusetzen, dann weiß ich nicht wie wir Dir helfen sollen...
--- Heiko.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

modelnine hat geschrieben:Python-Doku lesen?
Das ist ein Fall für die Supernanny.. ähm, nein, fascher Text.. Nochmal: Das ist ein Fall für [wiki]Modul Import[/wiki]! Wunderbar, diesmal hats geklappt ;)

An alle die es nicht verstehen: einfach ignorieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ich habs jetzt echt versucht und ich hab mich mit dem krusch auch auseinander gesetzt aber ich bekomms einfach nicht hin!

ich hab jetzt die 3 files von modelnine. levenshtein.c setup.py und runtest.txt.
wohin mit den dingern und was machen??? und bitte nich wieder fachchinesisch wie "auschecken, implementieren..." damit kann ich als anfänger nichts anfangen
ryu
User
Beiträge: 41
Registriert: Dienstag 7. Februar 2006, 19:34

stigi hat geschrieben:ich hab jetzt die 3 files von modelnine. levenshtein.c setup.py und runtest.txt.
wohin mit den dingern und was machen??? und bitte nich wieder fachchinesisch wie "auschecken, implementieren..." damit kann ich als anfänger nichts anfangen
Du tippst einfach, wenn du dich im selben Verzeichnis befindest

Code: Alles auswählen

python setup.py install
Wenn da alles geklappt hat, dann kannst du sofern du Linux (oder sonstwoher ne Bash) hast die Tests durführen und dann ist das Modul auch schon installiert.
Allerdings solltest du einen C-Compiler besitzen, da levenshtein.c, wie die Endung schon sagt, eine C Datei ist.
Antworten