möglichkeit für warscheinlichstes Suchergebnis

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da kann man sicherlich irgendwie Datensätze von kommerziellen Straßenkarten-Herstellen bekommen... Tja, oder du scannst verbotener weise Karten ein und makierst die koordinaten der Straßen, was viel arbeite sein dürfte :)

Theoretisch geht das auch mit Google-Maps, allerdings ist Deutschland noch nicht mit Strassen versehen...

btw.: http://de.wikipedia.org/wiki/Google_Maps und http://moon.google.com/ :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Nur noch mal ganz kurz dazu dass der Levenshtein-Algorithmus unabhängig von der Sprache ist:

Ein Algorithmus um die Levenshtein-Distanz zweier Strings zu berechnen ist tatsächlich sprachunabhängig, ist aber nur in gewissem (relativ kleinen) maß ein Maß dafür wie verwandt die beiden Wörter sind in einer natürlichen Sprache.

Normalerweise wird aber nicht direkt eine Levenshtein-Distanz berechnet (bedenke zum Beispiel ä und ae Übereinstimmung, oder ähnliches), sondern wird zuerst eine Art Darstellung des Wortes in einer kondensierten Form gesucht (denn schließlich hat eine Sprache mit lateinischem Alphabet nur ungefähr 2.3 bit Entropie pro Byte), und auf den resultierenden String wird dann die Levenshtein-Distanz angewendet. Das ist sehr viel effektiver, und entspricht ungefähr eben dem Soundex-Algorithmus, und spart vor allen Dingen Rechenzeit, weil das Wort "komprimiert," also auch kürzer wird.

Ich hab bisher den Levenshtein-Algorithmus immer nur im Zusammenhang mit dieser "Komprimierung" gesehen (wenns darum ging Fuzzy-Searching zu machen). Und soweit ich das wußte war es bei PHP ganz genauso implementiert, ist es ja aber anscheinend nicht. :-)

Im Endeffekt: wenn's darum geht sinnvoll einen Vergleich anzustellen wird man auf eine Art von Komprimierung nicht verzichten können, weil zum Beispiel:

Hämming
Hemming
Himming

bei diesen Namen der zweite Aufgrund der Aussprache näher zum ersten verwandt ist, jedoch die Levenshtein-Distanz zwischen zweitem und erstem, und drittem und erstem gleich ist.

Alle Algorithmen die eben so eine komprimierte Form berechnen sind sprachabhängig. Genau darauf wollte ich hinaus. Und erst mit solch einem Algorithmus macht Fuzzy matching Sinn. Und zumindest im meiner Erfahrung ist Levenshtein immer direkt mit so einem Algorithmus verbunden bei ernsthaften Anwendungen.
--- Heiko.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Hämming
Hemming
Himming

bei diesen Namen der zweite Aufgrund der Aussprache näher zum ersten verwandt ist
Gilt nicht für Niederbayern :-)
Und erst mit solch einem Algorithmus macht Fuzzy matching Sinn.
Mag ja sein, aber ehrlich gesagt sehe ich Levenshtein und Soundex lieber getrennt und kombiniere sie selbst so wie ich es brauch, sofern ich es brauch. In PHP kann man da sehr schön alle Soundex-Matches per Levenshtein mit dem Original-Suchwort vergleichen um das ähnlichste Ergebnis zu bekommen. Da die Levenshtein-Funktion aber auf beliebige Strings anwendbar ist (z.B. "f0w0f47w3fjlkdjx"), macht eine vorgeschaltete Komprimierung auf die Aussprache u.U. aber gar keinen Sinn.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Hi,
ich will gerade das Levenshtein Modul ausprobieren, aber leider gibts das nicht für Python 2.4 auf einer Win32 Maschine sondern nur für Python 2.3, wie kann ich es auf 2.4 installieren?

Mfg
Damaskus
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Ich könnte mir vorstellen wenn du die Strassennamen katalogiesierst,
das du da schon ähnliche namen verknüpfst, so das später die suche nach dem richtigen namen nicht mehr so aufwendig ist.

Evtl über den Anfangsbuchstaben eine vorauswahl treffen.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Also ich hab gestern mal mit SOUNDEX rumgespielt und die Ergebnisse waren schonmal nicht schlecht. Dazu jetzt noch ein paar Verknüpfungen und Filter mit einbauen und dann wirds für den Anfang reichen. Wie sich das dann bei Städten mit richtig vielen Straßen verhält muss ich halt mal ausprobieren.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Kann man nicht einen Spamfilter missbrauchen?
- von denen gibt es genug (auch mit python Anbindung)
- Doku / Beispiele sollten auch genug vorhanden sein

Ich hatte die Idee Bogofilter für ein (Web)Recherchetool zu verwenden.

cu Sebastian
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Du sprichst jetzt sicherlich von einem bayesschen Filter, oder nicht? Bayes-Filter "erkennen" Kontext, kein Wort was falsch geschrieben ist. Die Anwendungsgebiete sind völlig andere (zumindest im Normalfall).
--- Heiko.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Da der Link zu dem Soundex Modul nicht mehr aktuell ist gibts hier einen Link zu einer compilierten Win32 Version.

www.python-forum.de/downloads/Levenshtein.pyd

Gruß
Damaskus
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Warum dann nicht get_close_matches aus dem Standardmodul difflib?
MfG
HWK
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

jens hat geschrieben:Theoretisch geht das auch mit Google-Maps, allerdings ist Deutschland noch nicht mit Strassen versehen...
Wie nicht mit Strassen versehen?
Also Strassenname sind drin und Routen planen ist doch auch möglich oder?

Gruss

PS: map.google.com hab ich nur in der Schweiz gebraucht, nicht Deutschland.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

rayo hat geschrieben:Wie nicht mit Strassen versehen?
Also Strassenname sind drin und Routen planen ist doch auch möglich oder?
Manchmal ist es recht hilfreich, sich einmal näher anzuschauen, wann der Beitrag erstellt wurde.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Ach immer das doofe ausgraben :) tja dann wars wohl nichts

Gruss
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Damaskus hat geschrieben:Da der Link zu dem Soundex Modul nicht mehr aktuell ist gibts hier einen Link zu einer compilierten Win32 Version.

www.python-forum.de/downloads/Levenshtein.pyd

Gruß
Damaskus
Danke für den Tipp.

Nun habe ich sie in das Verzeichnis C:\Python25\Lib\site-packages runtergeladen.

Wie bekomme ich diese Datei dann zum Laufen?

Wenn ich draufklicke, kommt nur Buchstabensalat, es wird also wohl anders zu machen sein?
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``import Levenshtein``
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
OldBoy
User
Beiträge: 41
Registriert: Samstag 12. Januar 2008, 20:39

Hier 2 Loesungen in Standard-Python:

Code: Alles auswählen

def dist_lev(a, b):
    """
    Calculates the Levenshtein distance between a and b.
    Written by Magnus Lie Hetland (hetland.org)
    """
    n, m = len(a), len(b)
    if n > m:
        a,b = b,a
        n,m = m,n

    current = range(n+1)
    dummy = [n] * (n+1)
    for i in range(1,m+1):
        previous =  current
        current = dummy[:]
        current[0] = i
        for j in range(1, n+1):
            add = previous[j]+1
            delete = current[j-1]+1
            change = previous[j-1]
            if a[j-1] != b[i-1]: change += 1
            current[j] = min(add, delete, change)
            
    return current[n]

def dist_ratio(a, b):
    s = difflib.SequenceMatcher(None, a, b)
    return s.ratio()
z.B.

Code: Alles auswählen

>>> a = 'Meier'
>>> b = 'Mayer'
>>> dist_lev(a,b)
2
>>> dist_ratio(a,b)
0.59999999999999998
>>> dist_lev(a,a)
0
>>> dist_ratio(a,a)
1.0

Noch ein paar Tipps:
  • - vor dem Vergleich die Texte normalisieren
    (Gross-/Kleinschreibung, Sonderzeichen, Vereinheitlichung ( St/Str/Strasse))
    - bei langen Namen duerfen auch die Abweichungen groesser sein
    - anwendungsspezifische Sonderfaelle pruefen
    (z.B: Alleestr./Allerstr. in Essen, Iran/Irak bei Laendern)
Wer konkrete Hilfe braucht, kann sich gerne per PN an mich wenden. Ich habe dies Aufgabenstellung in den letzten Jahren intensiv im Bereich Laenderangabe/Region/Telefongesellschaft bearbeitet.

Gruss

OldBoy
Antworten