Tech Talk: documentclassificatie en voorspellingen met een geïntegreerde applicatie (deel 2)

Miniatuur bij blogartikel: Tech Talk: documentclassificatie en voorspellingen met een geïntegreerde applicatie (deel 2)

Hoe onze applicatie voor documentclassificatie werkt met NLP-modellen op basis van deep learning en machine learning.

Hoe onze applicatie voor documentclassificatie werkt met NLP-modellen op basis van deep learning en machine learning.

Dit artikel is het vervolg van een tweedelige reeks. Hier bespreken we de workflow van ons project voor documentclassificatie. De startpagina van de app verschijnt automatisch wanneer de gebruiker het bestand main.py uitvoert.

Zoals figuur 1 toont, bieden we twee mogelijkheden. De gebruiker kan het volledige proces doorlopen, van modellen trainen tot de klasse van nieuwe documenten voorspellen. Of de gebruiker kiest alleen documentvoorspelling op basis van de specificaties van een eerder getraind model.

Figuur 1. De volledige workflow van de toepassing voor documentclassificatie en -voorspelling

Programmeren in Python voor documentclassificatie

1. RESTful Flask-API

We bouwden voor dit project twee API’s die tegelijk draaien en verschillende doelen dienen.

De hoofd-API vormt het centrale raamwerk. Ze coördineert het hele proces en de workflow en zorgt voor vlotte communicatie tussen de gebruikersinterface en de Python-objecten.

De tweede API staat in het bestand main.py. Ze haalt de variabelen op die naar het systeem worden gestuurd wanneer asynchrone verzoeken worden uitgevoerd tijdens het navigeren door de app met JavaScript. Anders konden we die informatie niet ophalen.

2. Python-objecten

Het project telt in totaal ongeveer tien Python-klasseobjecten. Hieronder bespreken we de belangrijkste.

Het klasseobject 'Extractor' in dit bestand kan met veel bestandsformaten overweg, zowel oorspronkelijke documentbestanden als scans en afbeeldingen. De ondersteunde formaten zijn:

  • Documentformaten: .txt, .pdf, .doc/.docx, .ppt/.pptx

  • Afbeeldings- en scanformaten: gescande pdf’s, .bmp, .dib, .jpeg, .jpg, .jpe, .jp2, .png, .pbm, .pgm, .ppm, .pxm, .pnm, .pfm, .sr, .ras, .exr, .hdr, .pi

De documentextractor gebruikt onder meer de bibliotheken win32com, docx, pptx, pytesseract (OCR), pdfminer en pdf2image;

Het klasseobject 'TextCleaner' gebruikt de volgende NLP-methodes om tekst op te schonen: scheidingstekens verwijderen, bijvoorbeeld '\n'; HTML-tags verwijderen; URL’s verwerken en alleen de domeinnaam behouden, bijvoorbeeld ‘cosmetic’ voor www.cosmetic.be; samengetrokken vormen uitschrijven; spelling corrigeren (optioneel); accenten, leestekens en cijfers verwijderen; lemmatiseren; stopwoorden, losse tekens en overtollige witruimte verwijderen.

Spellingcorrectie is optioneel: de gebruiker kan die in de appinterface al dan niet inschakelen, zoals in het volgende deel wordt getoond. We raden deze optie alleen aan als de tekst mogelijk van lage kwaliteit is. Denk aan socialemedia-inhoud met eigen jargon, of scans en afbeeldingen van lage kwaliteit waarbij OCR fouten kan maken. Voor teksten waarvan de kwaliteit goed is, zoals wetenschappelijke artikelen of samenvattingen, gebruikt u deze optie beter niet. We merkten dat de spellingbibliotheek soms correcte woorden door andere, vergelijkbare woorden vervangt, bijvoorbeeld 'physical' in plaats van 'topological'.

De functie om stopwoorden te verwijderen gebruikt een lijst die tijdens het proces wordt samengesteld. Die steunt deels op bestaande stopwoordenlijsten uit NLP-bibliotheken zoals sklearn, spacy, gensim en nltk. De lijst is ook gebaseerd op het corpus zelf: ze bevat alle woorden die slechts in één document voorkomen. De redenering is dat zulke zeldzame woorden geen onderscheid tussen klassen maken en als ruis kunnen worden beschouwd.

Naast het opschonen van tekst maakt TextCleaner ook de TF-IDF-vectorizer die nodig is om het XGBoost-model uit te voeren.

De twee eerder besproken modellen zijn uitgewerkt in twee andere klasseobjecten met vrijwel dezelfde structuur:

  1. Gestratificeerde opsplitsing in trainings- en validatieset

  2. Modeltraining

  3. Modelevaluatie op de validatieset, 30% van de totale steekproef

Tijdens de training moesten we zowel multiclass- als multilabeldatasets ondersteunen. Daarom kozen we voor een gestratificeerde opsplitsing in training en validatie, in plaats van een gewone opsplitsing.

Bij een multilabeldataset houdt het model tijdens de training rekening met het aantal oorspronkelijke klassen én alle aanwezige klassencombinaties. Het aantal mogelijke combinaties is daardoor veel groter dan het oorspronkelijke aantal klassen. Sommige combinaties bevatten heel weinig of zelfs geen documenten.

Figuur 2 toont de aantallen per specifieke klassencombinatie, met multiclass one-hot-encoding, voor een bepaalde dataset. Zoals eerder vermeld, ontbreken sommige combinaties in de telling, bijvoorbeeld [1 0 1 1 1 1], omdat ze geen documenten hebben. Andere bevatten er heel weinig: de combinatie [0 0 1 1 0 1] heeft bijvoorbeeld slechts één document.

Figuur 2. Aantallen per klassencombinatie in een multilabeldataset

Bij een gewone opsplitsing bestaat dan het risico dat de evaluatieset klassencombinaties bevat die het model niet tijdens de training heeft gezien. De gestratificeerde opsplitsing zorgt ervoor dat de verhouding tussen training en validatie, in ons geval 70% tegenover 30%, zo goed mogelijk binnen elke klassencombinatie behouden blijft en dat er bij de evaluatie geen ongeziene combinatie verschijnt.

Het klasseobject 'Report' biedt een gedetailleerde analyse van het model, zowel globaal als per klasse. Het bevat onder meer classificatierapporten, verwarringsmatrices, ROC-curves en precision-recallcurves. Figuur 3 toont enkele voorbeelden van de uitvoer.

Figuur 3. Voorbeelden van uitvoer uit het prestatierapport

Als de gebruiker tevreden is met de modelprestaties, kan het object ‘Prediction’ de klasse van een nieuw, ongelabeld document voorspellen. Voordat het zijn code uitvoert, roept het de objecten ‘Extractor’ en ‘Cleaner’ aan om de documenttekst op exact dezelfde manier voor te verwerken als tijdens de training.

Navigeren door de gebruikersinterface voor documentclassificatie

Om de HTML-bestanden voor de gebruikersinterface weer te geven, gebruikt dit project een Python-specifieke wrapper voor een grafische gebruikersinterface (GUI), het pakket pywebview. Daarmee waren bepaalde functies mogelijk die nodig waren om de code uit te voeren, maar niet beschikbaar waren in meer gebruikelijke browserinterfaces, zoals Google Chrome. Het systeem moest bijvoorbeeld het volledige pad van bepaalde bestanden of mappen kunnen ophalen om de documentdataset te verwerken. Dat kan met pywebview. Chrome zou in vergelijkbare gevallen het bestand uploaden en alleen de bestandsnaam zonder pad ophalen.

We ontwierpen de gebruikersinterface zo duidelijk en intuïtief mogelijk. We wilden de gebruiker bovendien controle over elke stap en goed zicht op de voortgang geven, met tussentijdse rapporten na elke stap en vóór de volgende wordt gestart. Zo krijgt de gebruiker inzicht in de data, de verwerking en de modelkwaliteit. Figuur 4 toont de startpagina van de appinterface.

Figuur 4. Startpagina van de appinterface

De webapp voor documentvoorspelling

Zoals eerder vermeld, omvat de webapp alleen de workflow voor documentvoorspelling, niet die voor modeltraining. Ze gebruikt dezelfde Python-code als het volledige project, maar uitsluitend de klassen en functies voor voorspellingen. Voor de gebruikersinterface en implementatie zijn wel enkele aanpassingen nodig.

Wanneer de gebruiker een document uploadt, wordt de voorspelling automatisch uitgevoerd. Daarna volgt een doorverwijzing naar de rapportpagina met:

  • De naam van het document

  • Status: 'ok' of 'ko'. Dat laatste betekent dat iets misging: het bestandsformaat wordt niet ondersteund of het document staat open in een ander systeem of programma

  • De voorspelde klasse

Een ander verschil met de lokale app is dat de HTML-bestanden uit pywebview moesten worden gehaald om ze in elke webbrowser of GUI te kunnen weergeven, zie figuur 5.

Figuur 5. Startpagina van de webapp

De webapp werd op Microsoft Azure uitgerold om de werking te testen. We gebruikten Docker om de ontwikkelomgeving te maken. Daarvoor maakten we twee bestanden:

  • Met de 'Dockerfile' maken we een Docker-image van het project met alles wat nodig is om het uit te voeren, inclusief alle Python-pakketten die het systeem gebruikt.

  • Het bestand 'docker-compose.yml' geeft de hostingomgeving alle instructies om de app te starten en te laten draaien.

Travis CI is een gehoste dienst voor continue integratie waarmee softwareprojecten op GitHub worden gebouwd en getest. Naast Docker gebruikten we Travis CI om een rechtstreekse pipeline te maken tussen de lokale repository, gekloond van de huidige repository, en de webapp op Azure. Zo kunnen we het systeem voor dit project eenvoudiger bijwerken met nieuw getrainde modellen.

Conclusie en mogelijke verdere ontwikkeling voor documentclassificatie

Het project is intussen uitgegroeid tot een goed presterende en breed bruikbare toepassing, zowel voor onervaren als ervaren gebruikers. Zolang de data correct worden aangeboden, met een map voor de documentdataset en submappen met de labelnamen, kan de app verschillende bestandsformaten en datasettypes aan voor binaire, multiclass- en multilabeldocumentclassificatie.

Het project biedt dus veelzijdige tools die we aan uiteenlopende businesscases kunnen aanpassen. De mogelijke zakelijke toepassingen zijn vrijwel eindeloos. Enkele voorbeelden:

  • Bedrijfsdocumenten automatisch naar de juiste persoon of afdeling doorsturen;

  • E-mails automatisch doorsturen en sorteren

  • Zoekmachines voor document- en tekstinhoud verbeteren

  • Spam of frauduleuze en afwijkende documenten detecteren

  • Tekst uit medische dossiers verwerken om aandoeningen en comorbiditeiten op te sporen, een multilabelachtige situatie. Zo’n systeem zou wel gebaat zijn bij aanvullende medische patiëntgegevens, zoals medische beelden en testresultaten.

Klaar om uw doelen met data te bereiken?

Wilt u uw doelen bereiken door data en AI slimmer te gebruiken? Dan bent u hier op de juiste plek.

Klaar om uw doelen te bereiken met data?

Wilt u uw doelen bereiken door data en AI slimmer te gebruiken? Dan bent u hier op de juiste plaats.

Klaar om uw doelen te bereiken met data?

Wilt u uw doelen bereiken door data en AI slimmer te gebruiken? Dan bent u hier op de juiste plaats.

Klaar om uw doelen te bereiken met data?

Wilt u uw doelen bereiken door data en AI slimmer te gebruiken? Dan bent u hier op de juiste plaats.

© 2026 Agilytic

© 2026 Agilytic