[Alg] Huisnummerherkenning *

Pagina: 1
Acties:
  • 582 views sinds 30-01-2008
  • Reageer

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 16:11
Ik ben op zoek naar een zo goed mogelijk algoritme om huisnummers uit straatnamen te herkennen. 'Niks aan' zou je op eerste gezicht zeggen, maar het algoritme moet - naast de eenvoudige Kerkstraat 1 - kunnen functioneren met o.a. de volgende mogelijkheden:
  • Kerkstraat 1 3 hoog
  • Kerkstraat 14-16
  • Plein 40-45 5
  • Plein 40-45 5 2hg
  • 3de van der Helststraat 5
  • Rijksweg N73 10
En alle mogelijke combinatorische mogelijkheden.

Ik heb een tabel tot mijn beschikking met daarin alle voorkomende postcode/huisnummer combinaties van Nederland (ZONDER straatnaam, alleen huisnummer en postcode), maar een opzoekactie kost tijd (bijna 10 miljoen records), dat moet dus geminimaliseerd worden.

Momenteel heb ik een algoritme wat het volgende principe toepast:
  • Alle nummersequenties uit een straatnaam halen
  • Indien er te weinig voor het eerste nummer staat, deze weggooien (de 3 uit 3de van der Helststraat)
  • Alle numerieke waarden tegen de tabel houden en de eerste hit accepteren
Dit algoritme gaat (meestal) goed bij plein 40-45 en aanverwanten omdat dit geen geldige huisnummer/postcode combinaties zijn en er is meestal ook al een hit voordat de verdiepingsaanduidingen aan bod komen.

Maar dit algoritme is dus vooral op dit punt niet waterdicht en ik ben dus op zoek naar mogelijke uitbreidingen/verbeteringen op dit algoritme.

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

In jouw voorbeelden zie ik de volgende mogelijkheid:

Pak het getal dat is omgeven door spaties. Of het getal dat een spatie voor zich heeft en niets meer achter zich.

edit:
Shit.. gaat niet goed bij kerkstraat 14-16

[ Voor 15% gewijzigd door Varienaja op 19-09-2003 15:24 ]

Siditamentis astuentis pactum.


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Dat gaat fout als je op 5a woont... :(

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • Tweeker
  • Registratie: April 2003
  • Laatst online: 01-10-2023

Tweeker

1 + 1 = 3

Varienaja schreef op 19 september 2003 @ 15:24:
In jouw voorbeelden zie ik de volgende mogelijkheid:

Pak het getal dat is omgeven door spaties. Of het getal dat een spatie voor zich heeft en niets meer achter zich.

edit:
Shit.. gaat niet goed bij kerkstraat 14-16
en deze dan?
Kerkstraat 1 3 hoog
kun je die niet gewoon apart laten invoeren? Bijna iedereen doet dat , en niet voor niets

1 + 1 = 3


Verwijderd

Varienaja schreef op 19 September 2003 @ 15:24:
In jouw voorbeelden zie ik de volgende mogelijkheid:

Pak het getal dat is omgeven door spaties. Of het getal dat een spatie voor zich heeft en niets meer achter zich.

edit:
Shit.. gaat niet goed bij kerkstraat 14-16
Dit gaat ook al bij de 1e fout: Kerkstraat 15 6 Hoog


Maar is dit een eenmalige actie?

Ik heb dit ook 's moeten doen, en ben begonnen met te definieeren welke mogelijkheden ik zeker 100% veilig kan omzetten.

Je houdt dan nog een restant over, maar daar zitten ook weer gelijkenissen in,
deze pakte ik dan 1 voor 1 aan.
Dus alles wat op x Hoog eindigt bijvoorbeeld.
Daarna alles wat op xHg eindigt etc. etc.


Een van de uitgangspunten die je kan nemen is dat het nummer, na de straatnaam komt.
Dus het eerste getal na straatnaam is in 90% v/d gevallen het huisnr.

[ Voor 12% gewijzigd door Verwijderd op 19-09-2003 15:36 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Heb je al gesearched? Er was hier nl. recent een topic waaruit bleek dat het niet kon. Zie ook Filteren van huisnummer uit adres...

Professionele website nodig?


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

omdat zoiets gewoon teveel problemen zou opleveren zou ik het gewoon apart plaatsen, als het ook maar weer is iets anders zou zijn dan herkent ie hem al niet meer.

Dit is wel te bouwen, dat is het probleem niet maar het gaat gewoon erg snel verkeerd.


edit: Curry wat noem jij recent? Dat topic is een jaar oud :P

[ Voor 12% gewijzigd door Wolfboy op 19-09-2003 15:31 ]

Blog [Stackoverflow] [LinkedIn]


  • synthdood
  • Registratie: November 2002
  • Laatst online: 16-09 20:51
Dit zou ik ook wel graag willen weten. Zoals je al zegt is het probleem een stuk lastiger dan je zo op het eerste gezicht zou denken. Ik heb al 's wat dingen geprobeerd (bijvoorbeeld van achteraf teruglezen tot het eerste karakter wat geen cijfer is en daar dan mee verdergaan), maar nog niet tot een bevredigend resultaat gekomen.

Ik ben ooit 's een document tegengekomen van een student die onderzoek had gedaan naar adresherkenning op enveloppen voor een postbedrijf. Om het echt goed op te lossen moest er nog wat wiskunde/statistiek op worden losgelaten. Een kant en klaar algoritme heb ik helaas nog nergens gevonden.

In mijn geval moet het ook nog snel werken (voor elk adres een lookup in een postcodetabel doen wil ik dus niet). Ik ga dit draadje ff goed in de gaten houden......

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Ik doelde dus op deze recente: [rml][ Jlex/CUP] adresgrammatica[/rml]

Had straks even geen tijd om goed te zoeken :D

Professionele website nodig?


Verwijderd

In geval van Plein 40-45 1 geldt:
Als je een postcode erbij hebt, kun je daarop een query uitvoeren. Dit leidt tot een verzameling straatnamen. Als je die straatnamen 1 voor een tegen je invoer houdt, kun je 'Plein 40-45' succesvol bestempelen als straatnaam en de rest als nummer.

Waar ik nog niet achter ben: gaat het om invoer? Dan zou ik toch zeker een invoerveld maken voor straatnaam, een voor nummer, en een voor toevoeging ('hoog achter')

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 00:24

Reptile209

- gers -

Wat al in een van de andere genoemde topics is gezegd: pak eerst alle makkelijke namen (dus tekst met 1 getal als huisnummer). Daarmee heb je waarschijnlijk 80% wel binnen. Voor de overige 20% kan je dan alsnog een lookup in je postcode-tabel doen, want zoveel kunnen dat er dan niet meer zijn.
Lijkt me de snelste oplossing... :)

Zo scherp als een voetbal!


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 20:31

chem

Reist de wereld rond

Het kan op zich vrij goed, mits de straatnamen op de officiele wijze is geschreven. Wij valideren/verrijken hier ook db's, en moeten dus ook huisnummers eruit halen. Dat gaat dmv een regexpje, die zo goed en kwaad als het gaat de boel checkt op cijfers, letters en vaste combinaties...
het is niet onmogelijk, maar een perfecte match gaat niet altijd lukken.

Klaar voor een nieuwe uitdaging.


  • DeBolle
  • Registratie: September 2000
  • Laatst online: 21:23

DeBolle

Volgens mij ligt dat anders

Voor wat betreft straatnamen zelf - er is ook nog een (merkwaardig) verschil tussen wat wij een straatnaam noemen zoals gebruikt door KPN Post (postcodeboek) en zoals de 'officiele' straatnaam wordt gebruikt.
Een straatnaam wordt in Nederland namelijk altijd vastgesteld bij besluit van de gemeenteraad, waarna het college van B&W de huisnummering vaststelt. Hierna gaat alles naar KPN toe, die dan alles in een postcode stopt.
Als voorbeelden kan ik bijvoorbeeld een bejaardentehuis nemen:
Het gehele tehuis ligt aan een straat (genaamd 'Straatnaam') en heeft een huisnummer ('1'). Elke bewoner heeft een eigen voordeur, wat een criterium is voor KPN om 'eigen' huisnummers te gaan hanteren. Dit past natuurlijk niet in de diverse administraties, waardoor iedere bewoner een adres krijgt als 'Straatnaam 1-20' waarbij in de gemeentelijke basisadministratie als straatnaam wordt opgenomen 'Straatnaam 1' en de kamernummers worden aangehouden als huisnummer. Dit is dan afwijkend van het officiele besluit.
Volgens het postcodeboek is het echter gewoon 'Straatnaam' als straatnaam en is het huisnummer '1-20'. KPN doet dan 'officieel', de instantie die het heeft vastgesteld wijkt af van hun eigen besluit.
Tsja.
Een omgekeerd voorbeeld is mijn eigen adres: ik woon in een wijk met genummerde straten en huisnummers. Officieel (conform gemeentelijke administratie) is mijn adres dan ook 'Wijknaam straatnummer huisnummer' ofwel 'Wijk 12-21'
In het postcodeboek is de wijknaam als straatnaam gebruikt en de straatnaam (numeriek dus) gecombineerd met het huisnummer.
Dus KPN heeft van de wijknaam de straatnaam gemaakt en de straatnaam genomen als huisnummer.
Nogmaals tsja :)

Specs ... maar nog twee jaar zes maanden en dan weer 130!


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Ik kon me ook nog zo'n topic herinneren, deze. Er wordt hier trouwens meer de onmogelijkheid dan de mogelijkheid van een sluitend algoritme besproken ;).

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 19:03

Tomatoman

Fulltime prutser

DeBolle schreef op 19 September 2003 @ 16:16:
Een omgekeerd voorbeeld is mijn eigen adres: ik woon in een wijk met genummerde straten en huisnummers. Officieel (conform gemeentelijke administratie) is mijn adres dan ook 'Wijknaam straatnummer huisnummer' ofwel 'Wijk 12-21'
In het postcodeboek is de wijknaam als straatnaam gebruikt en de straatnaam (numeriek dus) gecombineerd met het huisnummer.
Dus KPN heeft van de wijknaam de straatnaam gemaakt en de straatnaam genomen als huisnummer.
Nogmaals tsja :)
Die 'tsja' slaat dan zeker op de ambtenaar die dit superverwarrende systeem heeft verzonnen?

Een goede grap mag vrienden kosten.


  • DeBolle
  • Registratie: September 2000
  • Laatst online: 21:23

DeBolle

Volgens mij ligt dat anders

tomatoman schreef op 19 september 2003 @ 18:51:
[...]
Die 'tsja' slaat dan zeker op de ambtenaar die dit superverwarrende systeem heeft verzonnen?
Nee, het slaat op beperkingen in de bedachte systemen en databases waarin die gegevens door respectievelijk de overheid en KPN worden bijgehouden. Iemand heeft ooit eens vastgesteld dat een adres bestaat uit straatnaam en huisnummer, punt. Voor afwijkende situaties (woonboot, bungalowpark, tehuizen) is nimmer rekening gehouden in de initiele opzet van die systemen, waardoor de 'afwijkingen' op een aangepaste wijze in de systemen zijn gekomen.
Daar is het grondig mis gegaan, omdat iedere beheerder zijn 'eigen' methode heeft toegepast om de beperkingen te omzeilen.

Dat 'tsja' slaat dan ook op de bouwers/analisten van de databases omdat ze kennelijk alleen hebben gedacht aan de beperkingen van een geautomatiseerd systeem zonder rekening te houden met de werkelijkheid.

Specs ... maar nog twee jaar zes maanden en dan weer 130!


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 16:11
Na het weekend maar weer eens verder. Dank voor deze reacties, vooral de verwijzingen naar oude threads zijn verhelderend.

Even ter verduidelijking: Het gaat om database imports uit verschillende formaten die automatisch verwerkt moeten worden. Terugkoppeling naar gebruiker is dus niet mogelijk, hooguit op een 'meta' nivo dat er een melding wordt gemaakt van een te hoog uitvalspercentage.

Als ik het zo zie zit ik met mijn huidige algoritme al voorbij de initiele 90% succes voor 10% van de kosten. Ik kan nog wel verder (bijv. door gebruik te makenvan de officiele straatnaamnotering), maar de winst die ik daarmee kan behalen staat denk ik niet in verhouding tot de kosten die ervoor nodig zijn.

  • ben15243
  • Registratie: September 2003
  • Laatst online: 02-11 17:24
Probeer het eens hiermee; de regular expression parseert correct jouw voorbeelden maar faalt op "plein 1940 5". Hiervoor is tenslotte domeinkennis nodig (1940 is een jaartal en geen huisnummer). Wat je kan doen is de regex uitbreiden om alle nummers beginnent met 19.. en 18.. te laten interpreteren als deel van de straatnaam mits er nog een nummer achterkomt. Geeft natuurlijk wel weer problemen bij bv "Kinkerstraat 1937 5".

De code is in C# maar de regular expression syntax is standaard.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Text.RegularExpressions;

namespace AdressenParse
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static public Regex r;

        static void Match(string s)
        {
            Match m = r.Match(s);

            System.Console.WriteLine(s);
            System.Console.WriteLine("Straat: '{0}'", m.Groups["straat"].Value);
            System.Console.WriteLine("Nummer: '{0}'", m.Groups["nummer"].Value);
            System.Console.WriteLine("Toevoeging: '{0}'", m.Groups["toevoeging"].Value);
            System.Console.WriteLine("---");
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            string exp = 
                @"((?<straat>([0-9]*[a-z-]+([0-9]*[a-z-]*)*\s+)*[0-9]*[a-z-]+([0-9]*[a-z-]*)*)\s+(((?<nummer>\d+)(?<toevoeging>[a-z]+))|((?<nummer>\d+)\s+(?<toevoeging>([0-9]|[a-z]|\s)+))))|" +
                @"((?<straat>([0-9]*[a-z-]+([0-9]*[a-z-]*)*\s+)*[0-9]*[a-z-]+([0-9]*[a-z-]*)*)\s+(?<nummer>\d+)(?<toevoeging>[a-z]*))" ;

            r = new Regex(exp, RegexOptions.IgnoreCase);

            Match("Kerkstraat 1a");
            Match("Kerk plein 1");
            Match("Kerkstraat 1 3 hoog");
            Match("Kerkstraat 14-16");
            Match("Plein 40-45 5");
            Match("Plein 40-45 5 2hg");
            Match("3de van der Helststraat 5");
            Match("Rijksweg N73 10");

            /// Werkt niet
            Match("Plein 1940 5");
        }
    }
}
Pagina: 1