AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Hausnummern aus Adressfeldern (Strassen) extrahieren

Hausnummern aus Adressfeldern (Strassen) extrahieren

Ein Thema von alzaimar · begonnen am 9. Jan 2006 · letzter Beitrag vom 10. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 9. Jan 2006, 17:23
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 9. Jan 2006, 17:38
Hallo alzaimar,

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

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
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
613 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 9. Jan 2006, 18:09
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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 9. Jan 2006, 19:02
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 9. Jan 2006, 19:55
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.536 Beiträge
 
#6

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 9. Jan 2006, 20:28
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 10. Jan 2006, 05:40
<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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 10. Jan 2006, 06:48
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 10. Jan 2006, 07:01
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.
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#10

Re: Hausnummern aus Adressfeldern (Strassen) extrahieren

  Alt 10. Jan 2006, 07:09
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf