Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Hausnummern aus Adressfeldern (Strassen) extrahieren (https://www.delphipraxis.net/60585-hausnummern-aus-adressfeldern-strassen-extrahieren.html)

alzaimar 9. Jan 2006 17:23


Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Tach auch,

Ich habe hier 50000 Adressen, wo die Disponenten blöderweise manchmal die Hausnummern nicht in das extra Feld eingetragen, sondern in das Feld 'Strassenname' eingegeben haben. Ein Allerweltsproblem. Nun will ich eine Funktion schreiben, die mir die Hausnummer extrahiert. Aber das ist ja nicht Ohne, denn es gibt z.b:

Strasse 453 (keine Hausnummer)
Vrumfondelgasse 12 (HN=12)
Foobarstr. 23a HH (HN = 23a, Zusatz = HH)
Blafaselweg 12-13 (HN = 12, Zusatz = -13)
Industriepark 20-45 (Haus 123) (HN = 20, Zusatz = "-45 (Haus 123)")

Die Liste ist nicht vollständig, und das Problem ist eben auch nicht trivial. Ich habe eine Liste fast aller Stassen in korrekter Schreibweise. Um es noch komplexer zu machen, soll ich auch noch 'Foobarstr. in 'Foobar Strasse' umwandeln, damit die Strassen, soweit möglich, 1:1 aus der Strassenliste kommen.

Ich könnte mit einem Fuzzy-Stringmatch (Levenshtein) arbeiten, oder mit Mustererkennung (Str, Weg, Strasse etc.) und dann versuchen, die Strasse in der Liste zu finden (Eben mit Levenshtein, oder einem Similarityindex).

Meine Frage lautet einfach, ob jemand sowas schonmal gemacht hat und ich von seinen Erfahrungen profitieren kann. Bin ehrlich gesagt ein klein bisserl zu faul, um mir alles nochmal zu erarbeiten.. Aber wenns sein muss, muss es halt sein.

marabu 9. Jan 2006 17:38

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Hallo alzaimar,

50.000 records klingt nach viel, aber wenn du erstmal nachzählst

SQL-Code:
select count(*) from adressen where hausnummer is null
wieviele davon unsauber erfasst wurden, dann könnten es nur noch 5.000 sein. Dann würde ich Fallgruppen bilden - unstrittige Fälle mit Hilfe von regex herausziehen und automatisiert umsetzen. %straße% und %weg% sind nur zwei Beipiele, bei denen darauf folgende Nummern eine Hausnummer repräsentieren. Ich bin sicher, dass die Zahl der manuell zu korrigierenden records zum Schluss vernachlässigbar ist.

Grüße vom marabu

gmc616 9. Jan 2006 18:09

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
So eine dankbare Aufgabe wurde mir vor geraumer auch schon gestellt.

Es ging nicht darum, dass die Hausnummern korrekt gefüllt sind, sondern das die Angaben korrekt sind und korrekt aussehen.
Richtig schriebene Strassenname, Orte, PLZ's u.s.w.

Ich hatte damals eine ähnlich große Menge an Adressen.
Und ich habe ebenfalls versucht einen Filter zu basteln, bin aber gescheitert.

Gelöst habe ich es dann einfach:
Ich habe mir ein komplettes Strassenverzeichnis Deutschlands besorgt und dann alle Adresse (bzw. Strassen) mit dem Verzeichnis abgeglichen.

Alles was "%str." hieß habe ich in "%strasse" umbenannt und alle Zahlen am Ende des Stings waren automatisch Hausnummern.

In einem zweiten Schritt habe ich mit Hilfe der Postleitzahl, dem Ort und einem Ähnlichkeitsvergleich (>70%) sogar falsch geschriebene Strassenname "reparieren" können.

Ich war erstaunt wie gut das funktioniert hat.
Am Ende hatte ich ca. 100 Adressen übrig die ich per Hand nachpflegen musste, weil die Strassenname entweder nicht zu "entziffern" waren (komplett falsch geschrieben) oder garnicht existierten.

Zum Selectieren in der DB reichen meist nur die ersten 4..5 Buchstaben des Strassennames. Außer bei sowas wie "Strasse des Bergmannes'. Aber auch des läßt sich lösen. Mit ein bissen ausbrobieren hatte ich damals alle Ausnahmen erschlagen.

In deinem Fall läßt sich bestimmt auch noch was mit "HH" und "HN" was anfangen (was auch immer das bedeutet).

In "meinem" Programm später habe ich ab der Eingabe des 4 Zeichens die DB bemüht und einen richtig geschrieben Strassenamen vorgeschlagen.
Das hat gut funktioniert und wird meines Wissens nach immernoch kräftig verwendet.

Ich suche mal, ob ich den Code noch irgendwo habe. Ist allerdings nicht in Delphi geschrieben sondern Centura mit SQL gegen Oracle.

Achja. Aus der "Foobarstr." wird eine "Foobarstrasse" und keine "Foobar Strasse". Es sein denn sie heißt "Foobarer Strasse".
Ich glaube die "Foobar Strasse" ist auch nach neuer Rechtschreibung falsch geschrieben.

Gruß
gmc

chaosben 9. Jan 2006 19:02

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Ja, da hat marabu recht. Und ich setzt noch einen drauf: ;) Ich behaupte, das du mit RegExpr 99% aller Einträge korrgieren kannst.
Ein Straßennahme besteht ja aus Buchstaben, Leerzeichen und Bindestrichen. Was danach als zusammenhängende Folge von Ziffern kommt, ist die Hausnummer. Und was danach kommt ist Zusatz. Also vielleicht so
Code:
([-a-zA-ZäöüÄÖÜß ]+) ([0-9]+)(.*)
//edit: Hoffentlich hab ich die 99% nicht zu hoh angesetzt. :stupid:

alzaimar 9. Jan 2006 19:55

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Mensch Jungs, da habt ihr mir aber Mut gemacht:
marabu: man sieht manchmal den Wald vor lauter Bäumen nicht. Ich werd nochmal zählen, aber so ca. 5000-7000 werdes schon sein.
gmc616: Nach marabus Eingrenzung werde ich wohl auch sukkezzive die Strassen rausfiltern, die in meinem Strassenverzeichnis sind. Übrigens, woher hast Du dein komplettes Strassenverzeichnis aus D?
chaosben: 99% wohl nicht, aber die läppischen 50-100 Adressen, die manuell eingepflegt werden müssen, mach ich dann mit Links.

Danke nochmal, ich denke morgen mach ich das fertig.

alcaeus 9. Jan 2006 20:28

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Ich wuerde die Regex von Chaosben noch ein bisschen erweitern:
erstens, das erste - sollte escaped werden, denn ein - kann im Strassennamen vorkommen, ist aber ein Specialchar der Regex. Weiters wuerde ich auch den Punkt noch mit reinnehmen (es soll ja Leute geben die "Strasse" abkuerzen ;)). Hinter der Zahl dann noch ein einzelner Buchstabe, der auch wegfallen kann, und dann evtl. noch ein Zusatz, der ebenfalls wegfallen kann. So duerftest du ziemlich alles beruecksichtigt haben. Das sieht dann in etwa so aus:
Code:
([\-a-zA-ZäöüÄÖÜß \.]+) ([0-9]+)(\w)?( (.*))?
Ich hab die Regex nicht getestet, aber denke dass sie funktionieren wird ;)

Greetz
alcaeus

chaosben 10. Jan 2006 05:40

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
<OT>
Die Sache mit dem entschärften Bindestrich ist wohl Engine-abhängig. Die, die ich benutze bringt folgendes, funktionsfähiges, Beispiel mit:
[-az] findet 'a', 'z' und '-'
</OT>

Aber trotzdem danke für die Erweiterung ... an alles zu denken war noch nie meine Sache. :stupid:

alzaimar 10. Jan 2006 06:48

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Und was ist mit 'Strasse 459'. Solche Strassennamen gibt es in Berlin?

Das Problem ist, das man meint, man schreibt -wupps- mal eben einen Parser und fertig. Leider ist dem nicht so.
Z.B. sind solche Fälle wie 'Wuselstr. 3-5 (Bei Kassupke)' auch nicht einfach.

Robert Marquardt 10. Jan 2006 07:01

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Eben deshalb ist ein geschichteter Filter der richtige Ansatz.
Erst mal alle Strassennamen/Hausnummern ausfiltern, die erfolgreich mit einem Strassenverzeichnis abgeglichen werden koennen.
Den Rest zur manuellen Ueberpruefung anzeigen. Jetzt entweder von Hand aufloesen oder einen neuen Filter auf den Rest schreiben.

Grundsaetzlich ist es eben unmoeglich dies generell sicher zu loesen.
Sobald eine neue Adressliste kommt geht es wieder beim ersten Filter los.

kalmi01 10. Jan 2006 07:09

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren
 
Hallo alzaimer,

Zitat:

Das Problem ist, das man meint, man schreibt -wupps- mal eben einen Parser und fertig. Leider ist dem nicht so.
Z.B. sind solche Fälle wie 'Wuselstr. 3-5 (Bei Kassupke)' auch nicht einfach
Ich habe vor kurzem ein ähnliches Problem gehabt, 500.000 ASCII-Dateien mit einer (theorethisch) genau definierten Struktur mit 160 Feldern in eine DB überführen.
Da die Daten aus 20 Jahren Datenerfassung stammten, waren sie alles, nur nicht konsistent.

Ich bin die Sache dann recht trivial angegangen, ich habe immer dann eine Exception ausgelöst, wenn irgendetwas im Datenbestand unklar war.
Die Entscheidung für eine Exception hab ich recht "scharf" eingestellt.
Anfangs lief das Prog nur einige Datensätze weit, dann PENG.
Aber nach kurzer Zeit musste ich nur ca. alle 10.000 Datensätze eingreifen.
Teilweise hab ich eine Softwarelösung für das Problem erstellt, in anderen Fällen hab ich mich für händische Korrektur entschieden.
Die theoretische Laufzeit wäre ca. 34 Std. gewesen, die reale betrug (mit Programmierarbeiten) ca. das 4-fache.
Für diesen Weg hatte ich mich entschieden, da ich bei einem anderen Projekt die Erfahrung gemacht hatte, dass es schnell passieren kann, dass man aus falschem Ehrgeiz leicht dazu neigt, alles per Prog zu erschlagen, selbst, wenn eine händische Korrektur schneller/effektiver wäre.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz