Notre site utilise des cookies pour rendre votre navigation plus agréable sur le site.

Facetten van Natural Language Processing – deel 2

Posted on 07/02/2019 by Joachim Ganseman

Veel aspecten van Natural Language Processing (NLP) steunen op een of andere vorm van classificatie. Als we een tekst automatisch willen analyseren of begrijpen, zal het immers snel nodig zijn om labels aan (groepen van) woorden of zinnen toe te kennen. Op basis van zulke labels kan de analyse verdergezet worden.

Classificatie is hét typevoorbeeld van machine learning, en bij uitbreiding artificiële intelligentie. Het algemene probleem is als volgt: gegeven een bepaalde input (onze gegevens), welke output hoort daarbij? Die output, vaak in de vorm van een of meerdere labels, geeft weer of de input tot een of meerdere categorieën behoort: bvb. de bloedtypes “A”, “B”, “AB”, “O”, of nog simpeler: “ja”, “nee”. Een classifier (*) is een algoritme dat we kunnen trainen om deze vraag te beantwoorden. Die training vereist dat we het algoritme voeden met hopen voorbeelden: een dataset van input-output-paren die we al ter beschikking hebben.

Hier bestaat onze input uit tekst. Tekst bestaat uit zinnen, zinnen uit woorden, woorden uit letters, en op elk van die niveau’s kunnen we classifiers trainen en toepassen. Omwille van de grote woordenschat en variabiliteit in vele talen (denk aan alle vervoegingen en verbuigingen) moet een trainingsdataset voor NLP classifiers vaak enorm groot zijn. Bovendien kan je een classifier getraind op éen taal niet zomaar toepassen op een andere: daarvoor moet de classifier meestal volledig opnieuw getraind worden met een dataset uit die andere taal.

diagram van een spamfilter

Diagram van een spamfilter. Image (c) Google, CC Attribution 3.0 License
Bron: https://developers.google.com/machine-learning/guides/text-classificati…

Een courante tekstclassifier die we allemaal dagelijks gebruiken is de spamfilter: gegeven een email, beslist die of het spam is, ja of nee. In dit artikel wil ik echter focussen op een fijnmaziger niveau: de classificatie van een woord, of een kleine woordgroep, binnen eenzelfde zin.

(*) Er bestaat een brede waaier aan algoritmes voor classificatie, waaronder decision trees, support vector machines, probabilistische modellen, graaf-gebaseerde modellen en neurale netwerken in allerlei geuren en kleuren. Ze zijn in principe allemaal inzetbaar voor de NLP-problemen beschreven in dit artikel; "classifier" mag in deze tekst dus breed geïnterpreteerd worden.

Grammatica

In de context van parsing (zinsontleding) willen we bijvoorbeeld achterhalen tot welke woordsoort een woord behoort. Dit probleem staat bekend als Part-of-Speech (POS) tagging. Naamwoorden worden in veel talen verbogen, en werkwoorden vervoegd. Ter vereenvoudiging wordt daarom vaak eerst een vorm van stemming of lemmatisering toegepast, waarbij men ieder woord eerst terugbrengt tot zijn stam.

Grammaticale ambiguïteit in het Engels: "Time flies like an array. Fruit flies like a banana".

Grammaticale ambiguïteit in het Engels.
Bron: SpecGram.com

Dan nog is er ambiguïteit mogelijk. Neem het woord “werken” in de volgende voorbeelden:

  • De 12 werken van Hercules
  • Er zijn ook onderzoekers die werken bij Smals

Dit illustreert de noodzaak om met context rekening te houden. Net daar komt machine learning van pas: we hebben een systeem nodig dat bepaalt dat het in de eerste zin het gaat om een zelfstandig naamwoord, en in de tweede zin om een werkwoord.

Een classifier die dat moet bepalen zal je dus trainen met voorbeelden waarin ook enkele woorden rondom worden meegenomen. Neem bijvoorbeeld 2 woorden voordien en 1 woord nadien als context:

  • “De 12 werken van” → werken = zelfst. nw.
  • “Onderzoekers die werken bij” → werken = werkwoord

Een classifier die zo voldoende wordt getraind, zal ook van onbekende woorden de meest waarschijnlijke woordsoort kunnen afleiden. Dit is handig omdat we dan in zekere mate kunnen omgaan met neologismen of nieuwe woordenschat:

  • “Hij schreef 7 ghjkl in zijn leven” → ghjkl = zelfstandig naamwoord

Disambiguatie

Ook binnen eenzelfde woordsoort kan een woord verschillende betekenissen hebben, dit zijn de homoniemen. Voor ons is het evident dat als een "muis" knoppen heeft om op te drukken, je waarschijnlijk spreekt over de computermuis en niet over de veldmuis. Een computer moet eerst getraind worden om de juiste betekenis te selecteren. Dit vraagt om een classifier die je traint op een hele hoop zinnen waarin het woord “muis” voorkomt, in de hoop dat de classifier aanleert in welke context het woord “muis” verwijst naar de computermuis en in welke context niet.

Image search results for "mouse"

Voorbeeld: desambiguatie bij het zoeken naar een muis

Bij een ambigue zoekterm doet Google soms zelf voorstellen tot disambiguatie, die verraden welke andere termen hun zoekmachine relateert aan de verschillende betekenissen.

In de computationele linguïstiek heet dit Word Sense Disambiguation, een klassiek probleem waarvoor dan ook grote datasets bestaan voor training en evaluatie van algoritmes. Een basisdataset is het Engelstalige WordNet. Het Europees project BabelNet breidt dat uit tot een honderdtal andere talen via Wikipedia-crosslinks, terwijl Open MultiLingual Wordnet een lijst bevat van andere datasets gelinkt aan WordNet.

Data genoeg, zo lijkt het, maar dat maakt het niet noodzakelijk gemakkelijk om goede resultaten te krijgen. Zelfs de beste algoritmes halen momenteel een F1-score (een maat voor accuraatheid) die maar weinig hoger ligt dan die van de eenvoudigste strategie: “kies altijd de meest voorkomende betekenis”. Volgens de laatste resultaten presteren neurale netwerken en traditionelere classifiers op ongeveer hetzelfde niveau, en doen deze classificatiegebaseerde systemen het net iets beter dan rule-based systemen.

Het spreekt vanzelf dat grammaticale en semantische disambiguatie allebei erg nuttig zijn voor automatische vertaling, waar ik in een vorige blogpost al kort over schreef.

Named Entity Recognition

In een tekst vind je al snel referenties terug naar mensen, bedrijven, plaatsnamen, bedragen, tijdstippen, kunstwerken, etc. Dit noemen we entiteiten, en een vaak voorkomende vraag is: kunnen we deze automatisch herkennen en markeren in een tekst? Vaak gaat het om eigennamen of jargon: woorden die je niet zomaar in het woordenboek terugvindt.

semantic querying via named entity recognition

Via named entity recognition kan IBM News Explorer vragen beantwoorden zoals:
welke personen komen voor in (Engelstalige) nieuwsartikels over Belgische politiek?

Het probleem staat bekend als Named Entity Recognition (NER), en je kan dat aanpakken op verschillende manieren:

  • Als je je kan beperken tot een overzichtelijke eindige lijst: gewoon kijken of een woord in dat lijstje voorkomt. Handig voor o.a. plaatsnamen of de namen van de maanden.
  • Als de term een gestructureerde vorm heeft, kan je werken met een reguliere expressie. Nuttig voor datums in een vaste vorm, identificatienummers, telefoonnummers, emailadressen of URLs.
  • Als een entiteit beschreven kan worden op teveel manieren om op te sommen, kan je die met een getrainde classifier proberen te herkennen. Deze aanpak wordt vaak gehanteerd voor het herkennen van persoonsnamen en organisaties, of wanneer een tekst veel spelfouten kan bevatten.

Ter illustratie, het volgende experiment: in een gescand juridisch document (een vonnis, een arrest, een brief van een advocaat), waaruit we de tekst hebben geëxtraheerd met behulp van Optical Character Recognition (OCR), willen we alle verwijzingen naar wetteksten markeren. Dit is nuttig om bijvoorbeeld de binnenkomende post onmiddellijk intern te kunnen doorsturen naar de jurist die gespecialiseerd is in die wet, of om de tekst te verrijken met links naar andere informatiebronnen over die wet (Entity Linking), wat een hoop manueel opzoekwerk kan besparen.

Een referentie naar een wettekst kan op veel manieren verwoord worden:

  • Wet ter bescherming van persoonsgegevens,
  • Wet ter bescherming van de persoonlijke levenssfeer ten opzichte van de verwerking van persoonsgegevens,
  • Wet van 8 december 1992,
  • Belgische Privacywet,
  • ... 

Al deze referenties zouden we op een of andere manier willen herkennen. We doen dat door trainingsvoorbeelden te geven aan een classifier die antwoord geeft op de vraag: is dit woord onderdeel van een wetsverwijzing, ja of nee? De trainingsdata neemt de vorm aan van individuele zinnen waarin een wetsverwijzing voorkomt, en de beginpositie en eindpositie van die wetsverwijzing. In de volgende frase staat een verwijzing naar een wetsartikel van letter 26 tot letter 65:

  • terwijl overeenkomstig de artikelen 87 tot 94 Wet Strafuitvoering een gevangenisstraf kan worden omgezet in een werkstraf

Zonder hier dieper in te gaan op de details, zal een NER-classifier proberen om in een nieuwe tekst de beginposities en eindposities van wetsverwijzingen terug te vinden. Een geschikte classifier zal daarbij rekening moeten kunnen houden met de context, of misschien gebruik maken van systemen zoals attention, die kunnen zorgen voor een consistentere output.

In onderstaand voorbeeld proberen we ook met machine learning te detecteren wat plaatsnamen en wat organisaties zijn, omdat de input afkomstig is van een beeldscanner met OCR, waarvan het resultaat inherent spelfouten bevat. Na een minimale training is een eerste resultaat:

Entity Recognition van locaties, organisaties en wetsverwijzingen op een juridisch document

Hieruit blijkt alvast:

  • De spelfouten en splitsingstekens in de input maken het moeilijker voor NER. In plaats van "Ar-beidsrechtbank" als organisatie te markeren, wordt "Ar-" als apart woord aanzien, dat de computer blijkbaar eerder doet denken aan een wetsverwijzing - vermoedelijk omdat het begint met dezelfde letters als "artikel".
  • Dat "Mechelen" soms als organisatie wordt aangeduid, is vermoedelijk omdat in de trainingsdata soms een plaatsnaam voorkomt in de naam van een organisatie. Dat zal een NER ook in de war brengen. (Hetzelfde probleem doet zich voor bij het onderscheid tussen persoonsnamen en bedrijfsnamen: nogal wat bedrijfsnamen bevatten een persoonsnaam.)

Er zal veel extra training nodig zijn om de finesses beter te vatten. Helaas is het samenstellen van een trainingsdataset voor een gespecialiseerde toepassing zoals deze, nog altijd veel manueel werk. Crowdsourcing kan daarvoor eventueel een oplossing bieden. 

Met de entiteiten die wél goed gedetecteerd worden, kunnen we alvast aan de slag. Een link naar een andere toepassing met nuttige info over die wettekst is snel gelegd: bijvoorbeeld naar de integrale gepubliceerde wetteksten, die in Europa sinds kort online beschikbaar worden gesteld via een gestaandaardiseerd systeem, de European Legislation Identifier (ELI).

Voorbeeld van entity linking: link een wetsverwijzing naar de wettekst.

Dit werd als proof-of-concept uitgewerkt op de NLP4Gov Hackathon georganiseerd door Informatie Vlaanderen in 2018. Daar ging een team van startup TheMatchbox aan de slag met een dataset die Smals Research voorstelde samen met RSZ-ONSS en IGO-IFJ, op basis van de gepubliceerde arresten van het Hof van Cassatie. Om af te sluiten, het filmpje dat het eindresultaat presenteert:

 

Source: Smals Research