Blog It’s a date! Geautomatiseerd een datum opsporen in bijvoorbeeld een boekingstekst

It’s a date! Geautomatiseerd een datum opsporen in bijvoorbeeld een boekingstekst

Waarom zou je willen weten of een boekingstekst een datum bevat? Stel, je hebt twee facturen. Op de ene staat: “Inhuur meneer Jansen week 42 tot en met week 46”. Op de andere factuur staat: “Inhuur meneer Jansen week 45 tot en met week 48”. De factuurdatum is anders, het bedrag is anders en toch betaal je – als je niet oppast – de weken 45 en 46 dubbel. Wil je maximale impact maken met data-analyses, dan moet je analyse-systeem de inhoud van boekingsteksten gaan snappen. Hoe beter je systeem dat kan, hoe meer geavanceerd je analyses kunnen worden. En alleen dan kun je echt met een gerust hart automatisch gaan boeken. Bij wijcontrolerenjedata.nl stoppen we (heel) veel tijd en energie in de ontwikkeling van een taalmodel. Een model dat stap voor stap de inhoud van een boekingstekst gaat snappen. Eerder schreven we er dit blog over. Vandaag richten we ons op het herkennen en begrijpen van een datum in een boekingstekst.

Op hoeveel verschillende manieren kun je een datum schrijven?

Ken je het spreekwoord: “Een gek kan meer vragen, dan 10 wijzen kunnen beantwoorden”? Dat geldt ook voor het administreren van data. Je kunt 10 wijzen bij elkaar zetten om de mogelijke manieren om een datum op te schrijven vooraf uit te denken. En in de praktijk kom je altijd varianten tegen waar je niet aan had gedacht. 31-3-2020, 31/3/2020, 31/03/2020, 31 maart 2020, 31.3-2020, enzovoorts liggen voor de hand. Maar denk ook aan exotische varianten, zoals: 31/320, 2017: 11 t/m 2018: 01, 23\1/’18 of 21_Q2.

We begonnen met heel veel handwerk

Wil je dit echt goed doen? Dan moet je bereid zijn om heel erg veel tijd te stoppen in het vooraf labelen van data. In overleg met een aantal van onze klanten hebben we zo’n 25.000 boekingsteksten opgeknipt in losse ‘tokens’. Een token is eigenlijk een los stukje tekst. In ons voorbeeld: “Inhuur meneer Jansen week 42 tot en met week 46” is “Inhuur” een token, “meneer” ook, enzovoorts. We hebben letterlijk honderdduizenden tokens (met de hand) gelabeld: “Jansen” is een naam. “Week 42 tot en met week 46” is een datum. Enzovoorts. In 25.000 boekingsteksten konden we op die manier 1848 unieke manieren om een datum op te schrijven herkennen.

Patronen herkennen in gelabelde data

Het is belangrijk om je te realiseren dat in onze dataset van 25.000 boekingsteksten niet alle dagen van het jaar opgenomen zijn. Het is dus niet zo dat de gevonden 1848 manieren gedeeld kunnen worden door 365 dagen, om zo uit te komen op gemiddeld vijf manieren om een specifieke dag op te schrijven. Toch zat er wel overlap in. 27-06-2018 en 26-01-2018 zijn weliswaar twee unieke manieren om een datum op te schrijven, maar het patroon is hetzelfde. Twee cijfers, streepje, twee cijfers, streepje, vier cijfers. De volgende stap was daarom om de gevonden 1848 manieren met slim programmeerwerk te vertalen naar patronen. Tot nu toe konden we 160 unieke patronen onderscheiden. Anders gezegd: iedere dag in het jaar kun je dus in ieder geval op 160 verschillende manieren opschrijven. ‘In ieder geval’, omdat niet uit te sluiten is dat in onze dataset van 25.000 boekingsteksten niet alle mogelijke manieren om een datum op te schrijven zaten. Maar, je moet ergens beginnen, nietwaar?

Het verschil tussen een datum herkennen en een datum begrijpen

Een datum herkennen is al waardevol. Zeker in de bredere context van ons taalmodel. Kort door de bocht: als je weet dat er geen datum in een boekingstekst staat, dan verkleint dat bijvoorbeeld de kans dat je met een reisdeclaratie te maken hebt, ook al snapt je model verder inhoudelijk niet wat er voor de rest wel in je boekingstekst staat. Een stap verder dan een datum herkennen is een datum begrijpen. Als er in de boekingstekst van een declaratie “30-01-21” staat en je model begrijpt dat “30” de dag is, “01” de maand en “21” het jaartal, dan kun je ook inhoudelijk gaan analyses met die datum. Dan kun je bijvoorbeeld zien dat 30 januari 2021 een zondag was en dat een zakelijke reisdeclaratie op die dag op het eerste gezicht vreemd is. Soms is dat heel makkelijk. Bijvoorbeeld bij 1-1-2020, maar het wordt al snel ingewikkelder. Bijvoorbeeld bij 1-2-2020. Een Nederlanders zal zeggen 1 februari 2020, terwijl een Amerikaan waarschijnlijk 2 januari 2020 leest. Ook hier kan de context van de zin waardevolle informatie bieden. Bevat de boekingstekst Engelse woorden, dan is de kans groter dat 2 januari bedoeld wordt. Bevat de boekingstekst verder alleen Nederlandse woorden, dan zal – kort door de bocht – 1 februari bedoeld worden.

Het vervolg

Op dit moment werken we er hard aan om ons ‘datum-extractie-model’ verder te verfijnen. Enerzijds door meer gebruik te maken van de context van de zin (daarbij helpt het dat we de 25.000 boekingsteksten volledig hebben gelabeld, niet alleen iedere datum). Daarnaast gebruiken we Machine Learning om aanvullende datum-patronen te ontdekken en onze huidige datum-patronen te toetsen. Dat doen we door een zichzelf versterkende combinatie van een ‘generative’ en een ‘discriminative’ algoritme. Over wat dat precies is en hoe dat op hoofdlijnen werkt, schrijven we een volgende keer. Vind je dit onderwerp interessent en wil je samen met ons verder innoveren aan het taalmodel dat we ontwikkelen? Laten we dan een datum prikken!