19 mei, 2021
Rick Vink – Expert in Machine Learning & Deep Learning
“Natural Language Processing (NLP) is het vakgebied binnen Kunstmatige Intelligentie (AI) dat zich bezighoudt met het analyseren van menselijke taal en de communicatie tussen mens en computer. Dit zijn vaak complexe vraagstukken waar een combinatie van meerdere Natural Language Processing technieken voor nodig zijn.“
Computers en mensen communiceren op andere manieren. Waar computers communiceren in 0’etjes en 1’tjes, spreken en schrijven mensen met klanken en karakters. Uiteindelijk draait het bij communicatie allemaal om informatie overbrengen. Wat Natural Language Processing doet is de brug maken tussen de menselijke manier van communiceren en die van de computer.
Hiernaast zijn er vele andere situaties waar het filteren van berichten heel handig is. Denk bijvoorbeeld aan de klantenservice waar veel berichten van klanten binnenkomen. Al deze berichten moeten uiteindelijk naar de juiste persoon worden geleid. Dit wordt in sommige gevallen nog met de hand gedaan. Gelukkig is dit een proces dat goed te automatiseren is met behulp van Natural Language Processing. Kunstmatige Intelligentie kan woorden en/of woordcombinaties leren herkennen die belangrijk zijn voor het classificeren van de content. Vervolgens kan deze naar de juiste persoon worden doorgestuurd. Zo kan er een hoop tijd worden bespaard!
Sentiment analyse is bedoeld voor het achterhalen van emotie uit teksten. Zo zijn er bijvoorbeeld veel opinies te vinden op social media. Denk aan: Wat vindt men van de prijs van ons product? Hoe vindt men de kwaliteit? Zijn de klanten blij met de service? Het bijhouden van hoe het publiek denkt over je product is heel waardevol. Deze informatie kan bijvoorbeeld dienen als sturing voor het verbeteren van het product of het stroomlijnen van je bedrijfsprocessen.
Naast social media kan sentiment analyse ook worden toegepast op e-mails van klanten, antwoorden van open vragen in enquêtes en gesprekken van klanten met de klantenservice. Dit maakt sentiment analyse een zeer krachtige tool om in kaart te brengen wat goed gaat met een product en ook waar nog verbeterd kan worden.
Organisaties beschikken over veel informatie. Hier zit veel waarde in voor bijvoorbeeld het beantwoorden van vragen die intern of extern gesteld worden. Echter is deze informatie vaak minder toegankelijk omdat het om veel data gaat. Vaak staat die data niet in een handige vorm om gemakkelijk doorzocht te worden. Dit kan gaan om data in verschillende bestandstypen of gesloten systemen. Kortom: zoeken naar een naald in een hooiberg dus.
Een tak van sport binnen Natural Language Processing is het bepalen in hoeverre de inhoud van teksten op elkaar lijken. Zo kan een nieuwe vraag worden vergeleken met vragen die eerder gesteld zijn, waarbij je de bijbehorende antwoorden tevoorschijn kan halen. Een voorbeeld hiervan kan je vinden op Tweedekamervrager. Hier hebben we een portaal gemaakt die vergelijkbare vragen vindt in de database van de Tweede Kamer.
Teksten genereren heeft veel praktische toepassing, zoals het samenvatten van documenten en de autocomplete functie in jouw tekstverwerkingsprogramma.
De Natural Language Processing modellen die veel los hebben gemaakt op het gebied van teksten genereren zijn de GPT modellen. Deze modellen zijn getraind op het voorspellen van het volgende woord in een tekst. De teksten die gebruikt zijn voor het trainen van het model komen onder andere van Wikipedia, nieuws en boeken. GPT-2 model heeft de wereld laten zien dat Deep Learning een veelbelovend pad is voor het genereren van teksten.
We hebben dit toegepast bij het maken van kookrecepten. Hiervoor trainden wij het GPT-2 model om automatisch kookrecepten te genereren. Wat bleek? De recepten waren goed eetbaar wanneer ze klaargemaakt werden! Oftewel, AI is in staat middels GPT-2 kookrecepten te bedenken.
Er zijn vele diverse taal uitdagingen opgelost met NLP technieken. Dit is heel indrukwekkend! De modellen zelf kunnen vrij complex zijn voor beginners. Gelukkig zijn de basis concepten vrij goed te begrijpen. De NLP concepten die wij hier gaan behandelen zijn in de meeste NLP producten toegepast. Het begrijpen van deze concepten zal je waardering en begrip voor Natural Language Processing vergroten.
Een methode die goed werkt om tekst te analyseren is door simpelweg het aantal woorden te tellen. Deze methode noemen we bag of words. Hiermee kunnen al enkele basale conclusies getrokken worden. Het is met name zo dat een tekst met voornamelijk positieve woorden, zoals “goed”, “geweldig” of “blij” waarschijnlijk positief is. In tegenstelling tot teksten die vooral negatieve woorden bevatten.
Hiervoor wordt meestal de tekst gefilterd door minder belangrijke woorden zoals “en”, “de”, “het” weg te halen. Dit omdat die weinig waarde geven aan een tekst. Daarnaast helpt het om woorden te versimpelen. Denk bijvoorbeeld aan de woorden “zwemmen” en “gezwommen” naar “zwem”. Dit process verliest voor vele toepassingen geen belangrijke informatie. Dit versimpelen noemen we lemmatiseren.
Deze manier van analyseren verliest echter veel informatie. Die informatie kan belangrijk zijn wanneer je te maken hebt met complexere NLP toepassingen. De voornaamste informatie die verloren gaat is de volgorde van de woorden. Vergelijk bijvoorbeeld de volgende zinnen: “Ik ben niet boos, maar juist blij.” met “Ik ben niet blij maar juist boos”. Je kunt zien dat dezelfde woorden voorkomen. Echter hebben de zinnen een totaal andere betekenis.
De beste NLP technieken gebruiken een serie van stappen die zo veel mogelijk informatie uit een tekst behouden. Als eerst bepaal je welke woorden en symbolen (tokens) je wilt gaan gebruiken. Vervolgens vertaal je deze concepten naar een vorm die een computer kan interpreteren (vectoren). Tot slot kies je een model die goed met deze data kan omgaan en de gewenste uitkomst kan geven.
Tekst is een serie aan woorden en symbolen die informatie met zich meedraagt. Het is belangrijk dat een Natural Language Processing model het zo makkelijk mogelijk wordt gemaakt om de belangrijke informatie uit een tekst op te kunnen nemen. We letten daarom op de gehele woorden en symbolen, maar niet op de individuele karakters.
Bijvoorbeeld de karakters “d”, “a”, “t”, “a” hebben los geen betekenis. Het model zou dan eerst moeten leren dat deze karakters achter elkaar het concept “data” vormen. Dit is meer moeite dan wanneer we gelijk het woord “data” aan het model geven. Want dan hoeft het model zich alleen op de essentie focussen. Deze concepten worden ook wel tokens genoemd. Dit zijn de concepten die het model moet gaan leren begrijpen.
Het is overdreven om voor elk woord in het woordenboek een unieke token te maken. Daarom worden alleen de meest voorkomende woorden uit de teksten meegenomen. De woorden die niet vaak genoeg voorkomen krijgen meestal een token die aangeeft dat het woord ontbreekt. Deze tokens worden in sommige toepassingen zelfs weggelaten.
Er bestaan voorgetrainde modellen die met hun eigen token-systeem komen. Deze modellen zijn zeer breed inzetbaar en hebben maar liefst rond de 30.000 verschillende tokens. Dit aantal is in dezelfde ordegrootte van het aantal woorden dat een gemiddeld persoon gebruikt.
Ook dit aantal tokens is niet genoeg om alle gevallen te dekken. Daarom gaan deze token-systemen slimmer om met woorden die minder vaak voorkomen. In deze gevallen worden de woorden opgedeeld in kleine stukjes. Dit maakt het lastiger voor het model en het heeft alleen maar zin wanneer je met een slim model werkt die goed de relatie kan leggen tussen tokens. Bijvoorbeeld “-obs” heeft op zichzelf geen toegevoegde waarde voor de tekst. Echter heeft dit wel waarde in relatie met de andere tokens: “ge”, “-ed”, en “-eerd”.
Om deze tokens aan een model te kunnen geven moeten er waardes toegekend worden. De computer denkt namelijk in 0’etjes en 1’tjes. Tokens komen vaak al met een indexwaarde die gebruikt kan worden. Zo kunnen bijvoorbeeld de woorden “het”, “de” en “ik” respectievelijk de indexwaardes 2, 3 en 4 hebben.
Dit lijken op het eerste gezicht goede waardes voor een model. Echter zijn deze waardes niet geschikt om direct te gebruiken voor het trainen. Dit is omdat je niet alle woorden op één spectrum wilt plaatsen. Als je dat wel zou doen dan ziet het model het woord “goed” met index 74 als een vergelijkbaar woord met de woorden “daar” met index 73 en “slecht” met index 75. Dit is wat je natuurlijk niet wilt. Want dan behandelt het model het woord “goed” ongeveer hetzelfde als het woord “slecht”.
Een oplossing is om elk woord bij elke mogelijke positie een waarde te geven. Dit is echter ook geen goede uitkomst voor het model, omdat je data dan super groot wordt vol met 0’etjes. Want stel je hebt een model die 30.000 verschillende tokens kent en je tekst is 400 tokens lang dan heb je te maken met 12.000.000 waardes voor die ene tekst die je model in moeten! Er is dus een efficiëntere methode nodig om woorden in getalletjes uit te drukken.
Woorden lijken op verschillende manieren wel of niet op elkaar. Bijvoorbeeld de woorden “koningin”, “koning”, “vrouw” en “man” hebben allemaal andere overeenkomsten. Waarbij “koningin” en”koning” een verband met elkaar hebben op het gebied van de monarchie, en de woordparen “koningin” met “vrouw” en “koning” met “man” op het gebied van geslacht. En deze vier woorden hebben weer wat met elkaar te maken op het gebied van mens in vergelijking met het woord “hond” en die weer wat met elkaar te maken op het gebied van dier als je het vergelijkt met huis, enzovoorts enzovoorts.
Tokens worden daarom niet met een enkele waarde (scalar) gerepresenteerd maar met meerdere waardes (vector). Bij “word embedding” worden tokens op een slimme manier omgezet in relatief kleine vectoren. Het resultaat is dat token (en dus ook woorden) die qua betekenis meer op elkaar lijken ook een vector krijgen die op elkaar lijken.
Maar hoe kom je aan de vectoren die horen bij jouw tokens? Het downloaden van een voorgemaakte embedding behoort tot één van de mogelijkheden. Hierbij is er al bepaald welke woorden op elkaar lijken en is daarbij een set van vectoren gemaakt; een voorbeeld hiervan is Glove. Het is ook mogelijk om de embedding zelf te laten meeleren welke vectoren goed passen bij de woorden tijdens het gehele leerproces. Dit is in programma’s als TensorFlow en PyTorch een standaard functionaliteit.
“Deze 1-daagse cursus is ideaal om wegwijs te geraken met NLP.”
Vincent Janssen – AI/System Engineer bij Verhaert
Deep Learning heeft de afgelopen jaren veel succes geboekt. Technologieën als Google Translate werken zo goed dankzij de komst van Artificial Neural Networks wat een essentieel onderdeel is van Deep Learning. Op dit moment lijkt er nog geen limiet bereikt te zijn met de huidige Deep Learning technieken als het gaat om hoe goed NLP modellen kunnen presteren. “Hoe groter het model hoe beter het resultaat” is een trend die op dit moment gaande is.
Recurrent Neural Networks hebben veel los gemaakt met wat mogelijk is met Deep learning. RNN modellen zoals LSTM en GRU zijn modellen waarbij waardes één voor één worden verwerkt. In Natural Language Processing worden deze modellen toegepast door een zin woord voor woord te verwerken. Nadat elke vector door de RNN verwerkt is eindig je met een samenvatting van de zin. Deze samenvattende vector wordt vervolgens weer verder verwerkt door een standaard neuraal netwerk (Feed Forward network) om tot de uiteindelijke conclusie te komen.
De transformer is op dit moment het meest geavanceerde model. Deze Deep Learning architectuur maakt gebruik van attentie lagen waarbij het gaat om verbanden leggen tussen woorden. Grotere modellen zoals het BERT model van Google en GPT-3 van OpenAI hebben maar liefst 13 en 96 lagen van attentie met een Feed Forward reken stap.
Het trainen van een goed NLP model is niet recht toe recht aan; het is namelijk een hele opgave om taal goed te begrijpen. Als je een ongetraind model direct inzet op het leren van een specifiek probleem, zal het resultaat teleurstellend zijn. Dit komt omdat het model de taal nog niet begrijpt en zal grijpen naar simpele patronen waar zo goed als geen taal kennis voor nodig is.
Het is daarom extra belangrijk om voort te bouwen op een model dat de taal eigen heeft gemaakt. Dit principe heet transfer learning en zal naast een beter resultaat ook een stuk sneller trainen. Deze modellen zijn weken lang getraind op een super computer waarbij ze vraagstukken moeten oplossen zoals missende woorden invullen in een tekst.
Hiervoor is veel train data nodig. Het liefst train je een model waarbij de labels bekend zijn. Deze manier van leren heet supervised learning. Echter moet je daarvoor veel gelabelde data hebben wat duur is om te maken. Daarentegen heeft unsupervised learning geen labels nodig om te trainen; waardoor het veel goedkoper is. Het nadeel van unsupervised learning is weer dat het niet altijd leert wat jij wilt dat het leert.
Gelukkig is voor dit probleem een tussenoplossing: self-supervised learning. Hierbij worden bestaande teksten van het internet afgehaald en woorden achteraf weggehaald en opgeslagen als labels. Zo kan je heel goedkoop een gelabelde dataset maken.
Python is de programmeertaal die je moet gebruiken als je de laatste en meest geavanceerde NLP modellen wilt toepassen. Python heeft een rijke geschiedenis op het gebied van data science. Python is de afgelopen jaren in populariteit gestegen. Er is meer vraag naar data wetenschappers die Python beheren dan data wetenschappers die R beheren.
Natuurlijk is niet iedereen direct klaar om Natural Language Processing met Python te leren. Het is en blijft een programmeertaal waarvoor de nodige ervaring vereist is. Gelukkig is Python een relatief eenvoudige programmeertaal om te leren. Afhankelijk van hoe snel je nieuwe dingen oppikt kan je al binnen een half jaar prima met NLP gaan werken in Python. Hiervoor is aan te raden om eerst de basis van Python te leren, gevolgd met data science in Python of Machine Learning in Python en daarna een begin te maken in Deep Learning.
Er zijn twee Deep Learning frameworks die op dit moment worden gebruikt voor Natural Language Processing: TensorFlow (ontwikkeld door Google) en PyTorch (ontwikkeld door Facebook). Beide Frameworks zijn een goede keuze. Waarbij TensorFlow komt van de filosofie dat code optimaal moet kunnen werken in productie en PyTorch dat de code intuïtief moet zijn. Beide frameworks zijn nu vrij vergelijkbaar qua gebruik. Bij School of Data Science gebruiken we zelf TensorFlow als standaard framework.
We hebben geleerd dat Natural Language Processing vele toepassingen heeft. Daarna hebben we gezien dat er vele stappen komen kijken wanneer we NLP toepassen. Er zijn nog vele onaangetaste toepassingen van NLP waar jij misschien wel mee te maken hebt.
Natural Language Processing zal alleen maar beter en belangrijker worden. Het is daarom zeer waardevol om jezelf te verdiepen in de wereld van NLP. Wij van School of Data Science helpen graag mee denken met jouw ontwikkeling op het gebied van NLP. Dit kan zijn door jou NLP te leren met een van onze cursussen of door jouw te helpen bij het toepassen van NLP op jouw uitdagingen. Neem contact met ons op of bekijk onze pagina voor NLP consultancy.
“Deze 1-daagse cursus is ideaal om wegwijs te geraken met NLP.”
Vincent Janssen – AI/System Engineer bij Verhaert