Om een machine-leesbare tekst voor te bereiden op het extraheren van data, wordt in de eerste fase die daaraan vooraf gaat de tekst verrijkt met nuttige informatie. Net als een menselijke lezer, moeten de digitale tools die je wil gebruiken de tekst kunnen begrijpen, m.a.w. de afzonderlijke paragrafen en zinnen, woorden en leestekens, de zinsopbouw en woordsoorten leren onderscheiden. Je kan kiezen uit handmatige annotatie of semiautomatische entiteitsherkenning (“named entity recognition” of NER) met natuurlijke taalverwerking (“natural language processing” of NLP), wat enige voorbewerking en daarbovenop een basiskennis van scripttaal vraagt. Beide methoden kunnen ook met elkaar gecombineerd worden. Tools voor automatische annotatie of entiteitsherkenning met een grafische gebruikersomgeving presteren voorlopig weinig succesvol op historische teksten (in het Nederlands).

Semiautomatische entiteitsherkenning

Natuurlijke taalverwerking leert computers de menselijke taal begrijpen m.b.v. kunstmatige intelligentie en machinaal leren (“machine learning”). Algoritmen maken daarbij gebruik van taalregels om de grammatica van elke zin te ontleden, en de betekenis van de woorden af te leiden uit de tekstuele context. Net als bij de eerste OCR-toepassingen, zijn de eerste algoritmen voor entiteitsherkenning regelgebaseerd en steunen ze op woordenboeken (ook: lexicons of gazetteers) voor het identificeren van relevante informatie. De ontwikkeling van neurale netwerken zorgt, net als in het veld van de handschriftherkenning, voor een doorbraak in het automatiseren van tekstannotaties. Handmatig de te identificeren gegevens definiëren is niet langer nodig: een eigen model voor entiteitsherkenning trainen op een klein deel van je data wordt dankzij machinaal leren mogelijk.    

In dit onderdeel doorlopen we de gehele “pipeline” voor entiteitsherkenning met natuurlijke taalverwerking. Inzicht in de principes van natuurlijke taalverwerking helpt om in de volgende delen te begrijpen wat je met tools voor handmatige annotatie kan bereiken, hoe automatische tools voor entiteitsherkenning werken, en hoe we hun prestaties kunnen beoordelen.  

Segmentatie en verrijking met woordsoortinformatie

In de fase van automatische tekstherkenning werd de documentscan gesegmenteerd in individuele karakters (bij OCR) of tekstregels (bij HTR). Mogelijk werden aan de XML-output structuurtags toegevoegd, die de verschillende onderdelen van de tekst (paragrafen, hoofdingen, tabellen, figuren, …) identificeren. Met data-extractie tot doel is verdere voorbewerking nodig op het niveau van zinnen en woorden, een proces dat ditmaal taalspecifiek is: segmentatie in orthografische eenheden (woorden, leestekens, symbolen, zgn. “tokens”) en verrijking met woordsoortinformatie (“part of speech tagging”).  

Tools voor natuurlijke taalverwerking doorlopen telkens de volgende stappen: segmentatie van zinnen (“sentence splitting”) en orthografische eenheden (“word tokenization”), syntactische annotatie (“part of speech tagging”), en semantische annotatie (“named entity recognition”). Het toevoegen van lemmata (“lemmatization” of “stemming”), d.w.z. het herleiden van verbogen woorden tot een basisvorm, kan in een volgende fase de extractie van informatie vergemakkelijken.

Het segmenteren van zinnen in orthografische eenheden is taalspecifiek: de Natural Language Processing tool moet samentrekkingen, afkortingen, e.d. gebruikt in de relevante natuurlijke taal (vb. Engels) kunnen onderscheiden. Figuur uit "Linguistic Features · spaCy Usage Documentation: Tokenization". Patrick Jentsch & Stephan Porada. “From Text to Data. Digitization, Text Analysis and Corpus Linguistics”, in: Silke Schwandt (red.). Digital Methods in the Humanities: Challenges, Ideas, Perspectives. Bielefeld University Press, 2021, p. 118.  

Het uitvoeren van grammaticale analyse op een tekst wordt “parsing” genoemd; een softwaretool die de processen van segmentatie en tagging integreert heet een “parser”. Tools kunnen gebaseerd zijn op regels en woordenboeken, op machinaal leren, of een combinatie van beide. Tijdens het taggen met woordsoortinformatie (“part of speech” of “PoS”) vindt al een eerste “desambiguatie” plaats: door de context van de zin in rekening te nemen, kan vastgesteld worden of een woord een zelfstandig naamwoord, bijvoeglijk naamwoord, werkwoord etc. is. Op basis van die classificatie kan het lemma, de benoemde entiteit (“named entity”), en voor plaatsnamen, later ook het juiste coördinaat, worden afgeleid.

De software beschikbaar voor het (historisch) Nederlands groeit jaar na jaar. Volg de ontwikkelingen aan het Instituut voor de Nederlandse Taal (INT), het Europese Common Language Resources and Technology Infrastructure (CLARIN), en de onderzoeksgroepen CLiPS en ACDC aan de Universiteit Antwerpen.

Op regels gebaseerde of (semi-)gesuperviseerde entiteitsherkenning

Na de voorbewerking a.d.h.v. syntactische analyse volgt het identificeren van benoemde entiteiten (grotendeels zelfstandige naamwoorden) en het categoriseren ervan in hoofd- en evt. subtypes. Diverse richtlijnen voor de annotatie van entiteiten worden gebruikt, afhankelijk van de gewenste mate van granulariteit. Over het algemeen worden drie typen annotaties onderscheiden: entiteiten (personen, organisaties, en locaties), tijdsaanduidingen (uren en data), en kwantiteiten (geldbedragen, percentages), resp. “enamex”, “timex”, en “numex” annotaties. Aan de richtlijnen, ontwikkeld in 1995 in het kader van de Message Understanding Conferences (MUC), werden in de loop van de tijd hoofdtypen toegevoegd, zoals GPE of geopolitieke eenheid naast de algemene categorie locatie, en subtypen voor locaties als adressen, grenzen, regio’s, waterlichamen, etc. (ACE richtlijnen).

Met deze richtlijnen ga je in de methode van gesuperviseerde entiteitsherkenning dan een deel van je tekstcorpus manueel annoteren. Deze “gouden standaard” gebruiken de algoritmen voor machinaal leren om de identificatie van de relevante woorden te trainen. Er bestaan drie families van algoritmen die op “named entity recognition” worden toegepast: zgn. “memory-based learning”, “support vector machines”, en “conditional random fields”. Je kan ook starten met een NER-basismodel voor het Nederlands, de output corrigeren, en het model daarop verder trainen. Hoe groter het geannoteerde training corpus, hoe beter de resultaten.

Gesuperviseerde entiteitsherkenning m.b.v. artificiële intelligentie staat tegenover regelgebaseerde entiteitsherkenning en/of entiteitsherkenning met een woordenboek. Die laatste is de meest eenvoudige methode, maar met aanzienlijke beperkingen: woorden die niet in het woordenboek staan of met een andere spelling, worden niet geïdentificeerd; woorden die meerdere malen in de lijst staan (als verschillende entiteiten, bv. een locatie en persoonsnaam) worden niet gedesambigueerd, tenzij er een probabiliteitsscore wordt toegevoegd. Het definiëren van regels toegespitst op een corpus, in combinatie met een woordenboek, kan de nauwkeurigheid verhogen maar is arbeidsintensief. Systemen die geen gebruik maken van artificiële intelligentie scoren dus beter op nauwkeurigheid (“precision”), maar minder op volledigheid (“recall”).

Recent wordt gekeken naar semi-gesuperviseerde entiteitsherkenning om de tijdsinvestering die de methoden van gesuperviseerde en regelgebaseerde NER met zich meebrengen (resp. door corpusannotatie en het handmatig opstellen van regels en lexicons) te verminderen. Bij de semi-gesuperviseerde of “hybride” methode van entiteitsherkenning wordt een kleinere training set van “seeds” (annotaties, regels, lexicons) gebruikt om het leerproces te starten. Het systeem zoekt zinnen die de “seeds” bevatten op, bepaalt met artificiële intelligentie zelf de regels ter identificatie, en hanteert die regels vervolgens om nieuwe entiteiten te identificeren die in dezelfde context voorkomen. Indien je al beschikt over een klein tekstsample met tags of een lexicon van woorden die je in een tekst wil terugvinden, zoals een plaatsnamengazetteer, kan semi-gesuperviseerde entiteitsherkenning behoorlijke resultaten opleveren.

Tools en methoden in Python en R

Wanneer je de keuze maakt tussen gebruiksklare tools voor tekstanalyse of werken in een scripttaal, ligt de afweging ‘m steeds in laagdrempeligheid versus manipuleerbaarheid. In de “Digital Humanities” zijn Python en R zonder twijfel de meest gebruikte scripttalen. Python is de alleskunner, R is misschien iets laagdrempeliger. Voor beide talen zijn “packages” of bibliotheken beschikbaar met functies voor natuurlijke taalverwerking. Deze functies kunnen met eigen code aangevuld worden voor het uitvoeren van een reeks analyses op maat van het corpus waarmee je werkt. Veel “packages” zijn standaard gericht op het Engels. Aangezien de “preprocessing” fase als de eigenlijke benoemde entiteitsherkenning echter taalspecifiek zijn, gebruik je bij voorkeur “packages” ontworpen voor het Nederlands, of die taalonafhankelijk zijn.

Python is een zgn. geïnterpreteerde scripttaal ontworpen met het oog op makkelijk leesbare code. De taal gebruikt indentatie (het inspringen van de regels) i.p.v. accolades of sleutelwoorden om blokken code van elkaar te onderscheiden. Python heeft beperkte basisfunctionaliteiten, maar de “interpreter” is eenvoudig uit te breiden met bibliotheken of “packages” (collecties van modules). Dat alles maakt van Python één van de meest populaire talen. De software is open source en kan gedownload worden op de website van de ontwikkelaar, de Python Software Foundation (PSF), of als onderdeel van Anaconda, software voor data-analyse en machinaal leren waarbij meteen de meest relevante “packages” geïnstalleerd zijn. De code zelf schrijf je niet in de “interpreter” maar in een “code editor”, zoals Visual Studio Code, Sublime Text, en Jupyter Notebook. Die laatste wordt vaak gebruikt in het veld van data-analyse en machinaal leren. Ook Anaconda bevat een basis “code editor”.

NLTK, spaCy, Stanford Core

R is een programmeertaal ontworpen voor statistische analyse van grote datasets. Het programma is echter veel meer dan een geavanceerd rekenblad: aangezien alle machinaal leren steunt op statistische patronen in data, kan je R ook gebruiken voor natuurlijke taalverwerking op tekstcorpora. Het is open software toegankelijk via de opdrachtregelinterface (“command line”), via de R console of RStudio, twee grafische gebruikersomgevingen voor het schrijven en uitvoeren van programma’s in R. “The Programming Historian” biedt “tutorials” aan over de basisfunctionaliteiten van R:

  1. Statistische analyse van tabelgegevens
  2. Tekstanalyse op ongestructureerde data

Een uitstekende complete handleiding voor werken met tekstcorpora in R vind je hier: Emil Hvitfeldt & Julia Silge, Supervised Machine Learning for Text Analysis in R, CRC Press, 2021. 

Packages” voor R die meerdere stappen in natuurlijke taalverwerking omvatten zijn o.m. koRpus, OpenNLP dat een R interface aanbiedt voor de Apache OpenNLP Library geschreven in Java, quanteda, text2vec, en het in België ontwikkelde en taalonafhankelijke udpipe. Daarnaast werden er R “wrappers” ontwikkeld voor populaire Python NLP “packages” als spaCy en Stanford CoreNLP (cleanNLP en coreNLP). De meeste van deze ondersteunen het Nederlands (zie bv. het koRpus.language.nl “taalpakket”).