EndemolShine

EndemolShine Nederland is onderdeel van EndemolShine Group: ‘s werelds grootste onafhankelijke producent van televisie- en digitale content. Wij hebben diverse projecten voor EndemolShine uitgevoerd. Het laatste project wat wij hebben uitgevoerd betreft een product dat automatisch benodigde factuurcomponenten zoals het totaalbedrag en BTW-nummer uit facturen extraheert om de financiële afdeling werk en tijd te besparen. Wij hebben een OCR API gebruikt om .pdf-bestanden om te zetten naar tekst en algoritmes geschreven om relevante factuurdata te extraheren uit de OCR output.

ENDEMOLSHINE INVOICE PROCESSOR.

Op de financiële afdeling van EndemolShine Nederland komen maandelijks zo’n 2.000 facturen binnen. Al deze facturen moeten worden verwerkt door verschillende factuurcomponenten (BTW-nummer, bankrekeningnummer, factuurnummer, factuurdatum, valuta, BTW-bedrag en totaalbedrag) handmatig in te voeren in een boekhoudingsprogramma. Doordat het om zulke grote aantallen facturen gaat kost dit handmatige werk in totaal nogal wat tijd! Om deze reden is bij Endemol de wens ontstaan om een model te produceren dat automatisch informatie uit facturen extraheert, waardoor veel tijd bespaard kan worden. Een voorwaarde voor het project was dat het model in productie gebracht zou worden op Amazon Web Services (AWS), omdat EndemolShine reeds gebruikmaakte van dit cloud platform.

PROBLEEM

AANPAK

Met behulp van Python, de Optical Character Recognition (OCR) API van Google Cloud Platform, en de serverless computing service ‘Lambda’ van AWS hebben we een workflow gecreëerd waarmee facturen alleen nog maar geüpload hoeven te worden naar Amazon S3 (Simple Storage Service). Vervolgens wordt er automatisch een JSON-bestand met de geëxtraheerde informatie gegenereerd en opgeslagen binnen Amazon S3.

De workflow bestaat uit de volgende stappen:

1. Een factuur (.pdf of .tif waarin de tekst niet selecteerbaar is) wordt geüpload naar een Amazon S3 input bucket.

2. Een Python script in AWS Lambda wordt door deze upload getriggerd. De rest van de stappen worden uitgevoerd binnen dit script.

3. De factuur wordt verstuurd naar Google’s OCR API. Als resultaat retourneert deze API een JSON-bestand met hierin data die de documentstructuur (pagina’s, alinea’s, etc.) beschrijft en paginacoördinaten voor alle geëxtraheerde termen (gegroepeerde tekens).

4. De OCR-outputdata wordt geprepareerd voor analyse door middel van verschillende correcties en filters.

5. De relevante factuurcomponenten worden geëxtraheerd uit de geprepareerde data door middel van identificatie van termen aan de hand van hun inhoud, structuur, omliggende woorden en/of verscheidene andere hulpregels. Nederlandse IBANs, bijvoorbeeld, hebben altijd een vaste lengte, beginnen met ‘NL’, en hebben de overige variërende cijfers en letters altijd op dezelfde positie staan. Voor het totaalbedrag op zijn beurt wordt gezocht naar termen die dit bedrag “aankondigen” op een factuur, zoals letterlijk de term ‘totaalbedrag’. Vanaf deze aankondigende term wordt dan horizontaal en verticaal gezocht naar twee groepjes van cijfers die worden gescheiden door een komma of punt, bij voorkeur gegroepeerd met een valutasymbool.

6. De geëxtraheerde informatie wordt opgeslagen in een JSON-bestand in een Amazon S3 output bucket.

De prestaties van de invoice processor zijn samengevat in onderstaande tabel voor elke benodigde factuurcomponent. De nauwkeurigheden zijn berekend aan de hand van een testdataset van 5.000 van de facturen die EndemolShine in het verleden heeft ontvangen.

Factuurcomponent            Nauwkeurigheid

BTW-nummer                     89,9%

Bankrekeningnummer      92,8%

Factuurnummer                 82,6%

Factuurdatum                    93,7%

Valuta                                  100,0%

BTW-bedrag                      85,0%

Totaalbedrag                     92,6%

Om het product tot het volgende niveau te tillen zou er nog een interface gebouwd moeten worden waarin de geëxtraheerde informatie op een intuïtieve manier zichtbaar is naast een afbeelding van de factuur, waarbij de modelresultaten indien nodig gecorrigeerd kunnen worden.

RESULTAAT