Spring til indhold

Grundfast

GuideLister & synkronisering

Hvordan rydder vi op i en rodet adresseliste?

En kundeliste, der er tastet ind gennem ti år, har stavefejl, gamle postnumre, "st. tv." det forkerte sted og adresser, der ikke findes mere. Datavask sammenligner hver streng med alle adgangsadresser i DAR og giver dig de bedste kandidater og en kategori. Her er, hvordan du læser svaret, og hvordan du træffer en beslutning pr. række.

4 min læsning6 trinOpdateret
På denne side6 trin

Vask én adresse

Send strengen, som den står, i betegnelse. Svaret har kategori, antal og op til ti resultater, sorteret efter lighed fra 0 til 1. Enkeltkaldet virker på alle planer og tæller ét kald.

curl -G "https://api.grundfast.dk/v1/datavask/adgangsadresser" \
  --data-urlencode "betegnelse=raadhuspladsen 1 kbh v" \
  -H "Authorization: Bearer $GRUNDFAST_API_KEY"

Hvad A, B og C betyder

Kategorien beregnes ud fra det bedste kandidats lighed og afstanden ned til nummer to. Grænserne er i dag:

KategoriHvornårForslag til beslutning
ABedste lighed er mindst 0,98 — eller mindst 0,85 og 0,15 foran nummer to. Er der kun én kandidat, kræves 0,93.Godkend automatisk.
BBedste lighed er mindst 0,55, men ikke klart nok til A.Gennemgå — eller godkend, hvis dine egne felter bekræfter kandidaten.
C med kandidaterSvage eller flere lige gode kandidater.Gennemgå de øverste tre kandidater manuelt.
C med antal: 0Intet i registret lignede nok.Afvis, og spørg kunden.

Læs antal før kategori

kategori: "C" dækker både "usikkert" og "intet fundet". Kun antal skiller dem ad.

Vask mange på én gang

POST /v1/datavask/adgangsadresser:batch vasker en liste i ét kald: 50 strenge på Pro, 100 på Scale og 150 på Enterprise. Batch kræver Pro; på en lavere plan svarer kaldet 402. Hver unik streng tæller én enhed — også en uden match, fordi den stadig får et svar. Dubletter fjernes før optællingen.

To resultater fra datavask-batch
{
  "results": [
    {
      "input": "Rådhuspladsen 1, 1550 København V",
      "kategori": "A",
      "antal": 10,
      "resultater": [
        {
          "betegnelse": "Rådhuspladsen 1, 1550 København V",
          "adgangsadresse_id": "0a3f507a-ec01-32b8-e044-0003ba298018",
          "bfe_nummer": 6033528,
          "postnr": "1550",
          "kommunekode": "0101",
          "lighed": 1
        }
      ]
    },
    {
      "input": "Postboks 1234",
      "kategori": "C",
      "antal": 0,
      "resultater": []
    }
  ],
  "requested": 2,
  "succeeded": 2
}
  1. Resultaterne kommer efter dubletfjernelse, i den rækkefølge strengene først optrådte. Slå op på den trimmede input, ikke på positionen i din liste.

  2. Første række er et sikkert match. Anden er C med antal: 0 — intet match, ikke en fejl.

  3. Tekstlighed mellem din streng og kandidaten, 0–1 med tre decimaler. Kandidaterne er sorteret faldende.

  4. Gem adgangsadresse_id som nøgle og bfe_nummer som vejen videre til BBR og Matriklen.

  5. succeeded er altid lig med requested. Kun en ugyldig body giver 400 for hele kaldet.

Eksemplet er forkortet: hver kandidat har også vejnavn, husnr, postnrnavn og koordinat. Koden herunder deler listen op efter planens loft og lægger hver række i én af tre bunker.

import { GrundfastClient } from '@grundfast/sdk';

const gf = new GrundfastClient({ apiKey: process.env.GRUNDFAST_API_KEY });
const LOFT = 50; // Pro; 100 på Scale, 150 på Enterprise

type Beslutning = 'godkend' | 'gennemgaa' | 'afvis';

function beslut(kategori: 'A' | 'B' | 'C', antal: number): Beslutning {
  if (antal === 0) return 'afvis';
  return kategori === 'A' ? 'godkend' : 'gennemgaa';
}

export async function vaskListe(raa: string[]) {
  // Trim, drop tomme og for korte, og skær ned til 128 tegn — ellers afvises hele kaldet.
  const strenge = [...new Set(raa.map((s) => s.trim().slice(0, 128)).filter((s) => s.length >= 2))];
  const svar = new Map<string, { beslutning: Beslutning; adgangsadresse_id?: string }>();
  for (let i = 0; i < strenge.length; i += LOFT) {
    const { results } = await gf.datavaskBatch(strenge.slice(i, i + LOFT));
    for (const r of results) {
      const top = r.resultater[0];
      svar.set(r.input, {
        beslutning: beslut(r.kategori, r.antal),
        ...(top ? { adgangsadresse_id: top.adgangsadresse_id } : {}),
      });
    }
  }
  return svar; // slå hver af dine rækker op på dens trimmede streng
}

Forbered strengene

  • Saml adressen i én streng: vej og husnummer, etage og dør, postnummer og by. Mangler postnummeret, så tag byen med — det hjælper meget på ligheden.
  • Fjern linjer, der ikke er adresse: "att.", "c/o", firmanavn og telefonnumre trækker ligheden ned.
  • I en batch skal hver streng være 2–128 tegn efter trim. Én streng uden for det afviser hele kaldet med 400, og det afviste kald tæller ét kald mod kvoten. Enkeltkaldet skærer selv ned til 128 tegn.
  • Del listen op efter planens loft. Sender du flere unikke strenge, end planen tager, svarer API’et 402 med navnet på den plan, der tager dem — over 150 svarer det 400 — og kaldet tæller ikke.

Når B skal gennemgås hurtigere

De fleste B’er er rigtige. Har din liste et separat postnummer- og husnummerfelt, kan du godkende en B automatisk, når kandidatens postnr og husnr er de samme som dine. Afviger husnummeret, er det næsten altid nabohuset, og så skal et menneske se på den. Vis i gennemgangen de tre øverste kandidater fra resultater med deres lighed, så den, der retter, kan vælge i stedet for at taste.

Når listen er lang

Over et par tusind rækker er et job det rette værktøj: send filen, og hent resultatet som CSV. Et datavask-job slår først op på vej, husnummer og postnummer, hvis de står i hver sin kolonne — et præcist fund får kategori A og score 1 — og vasker resten som fritekst. Bemærk to forskelle fra batch:

  • Resultatfilen har kun den bedste kandidat pr. række (gf_kategori, gf_score, gf_antal_kandidater og adressen). Til gennemgang af B og C slår du de rækker op igen med enkeltkaldet for at se alternativerne.
  • En række uden kandidater havner i fejlfilen med status 404 og koster intet. En række med kandidater — også i kategori C — står i resultatfilen og tæller. Filtrér på gf_kategori.

Var denne side nyttig?

Ofte stillede spørgsmål

A er et sikkert match, som du kan godkende automatisk. B er sandsynligt, men bør bekræftes. C er usikkert, og C med antal 0 betyder, at intet matchede.

Ja, i enkeltkald og batch tæller hver unik streng én enhed, fordi den får et svar. I et datavask-job koster en række uden kandidater intet; den havner i fejlfilen.

50 på Pro, 100 på Scale og 150 på Enterprise. Enkeltkaldet virker på alle planer. Længere lister sender du som et job.

Dubletter fjernes, før strengene vaskes. Par derfor svarene med dine rækker på feltet input, som er den trimmede streng.

A kræver høj tekstlighed og et klart forspring til nummer to, så den er bygget til automatisk godkendelse. Har du et separat postnummer, er det stadig en billig ekstra kontrol at sammenligne det med kandidatens.

Prøv det på rigtige data

En gratis nøgle giver adgang til alle registre med samme svarform. Testnøgler faktureres aldrig, så du kan bygge færdigt, før du skifter til produktion.

Gratis op til 5.000 kald/md · intet kreditkort · data fra Klimadatastyrelsen/Datafordeler, CC BY 4.0

Relateret