Open-Source Chatbot Coronavirus (COVID-19)

Emma Schreurs
TripleUniverse
Published in
19 min readApr 3, 2020

Geïnteresseerd in de werking van een chatbot op basis van artificiële intelligentie? Dan ben je aan het juiste adres.

Engelse versie voor de World Health Organization (WHO) beschikbaar hier.

De uitbraak van het coronavirus heeft wereldwijd grote gevolgen voor de maatschappij. Mensen hebben terecht zorgen en lopen rond met vele dringende vragen. Het Rijksinstituut voor Volksgezondheid en Milieu (RIVM) biedt op hun website antwoorden op veelgestelde vragen betreffende het coronavirus (link). Het kan echter zo zijn dat je even moet zoeken voor je het juiste antwoord op je vraag hebt weten te vinden. Het is van cruciaal belang dat mensen goed op de hoogte zijn van de huidige maatregelen. Zo kunnen we namelijk het meest efficiënt de massale verspreiding beperken. Hier zou een chatbot dus perfect mee kunnen helpen!

In deze blogpost gaan we een chatbot maken voor vragen betreffende het coronavirus. Deze zal worden gebaseerd op artificiële intelligentie (AI) en natural language processing (NLP). Allereerst zullen we ons meer gaan verdiepen in AI en NLP achter deze chatbot. Hierna wordt de implementatie van de chatbot op basis van de besproken techniek gedemonstreerd. De source code en dataset is ook te downloaden op de toebehorende GitHub pagina (link).

Deze blogpost is bedoeld voor bedrijven in de technologiesector die willen bijdragen aan het stoppen van het coronavirus, en in het proces daarvan ook nog wat willen leren over AI en NLP. De laatste jaren is er veel innovatie geweest op het gebied van AI en NLP. Dus eerst is het goed om een verdiepingsslag te plegen en wat meer te leren hoe je een state-of-the-art chatbot maakt.

Voor lezers die meer geïnteresseerd zijn in de implementatie van de chatbot (inclusief code) en het stuk theorie willen overslaan adviseer ik verder te lezen vanaf: “Implementatie USE en chatbot op data COVID-19.”

Inhoudsopgave

Wat is een chatbot?

Een chatbot is in het jaar 2020 geen uitzonderlijke luxe meer te noemen. Ik kan met enige zekerheid stellen dat iedereen wel eens, ofwel bewust of onbewust, in contact is geweest met een chatbot. Zo heb je vast wel eens een vraag gesteld aan een digitale klantenservice of een andere online chatdienst. Tijdens zo’n gesprek weet de chatbot antwoord te geven op jouw vragen, vragen te stellen, of je eventueel door te verwijzen naar een website waar je vraag beantwoord wordt. Verder zijn chatbots zoal te vinden op websites en instant Messenger-programma’s (o.a. Skype, Facebook Messenger, en Slack).

In het verleden waren chatbots volledig gebaseerd op voorgeprogrammeerde regels, ze hadden dus nog niks te maken met artificiële intelligentie (AI). Tegenwoordig wordt AI steeds meer gebruikt in het implementeren van chatbots, dit is dankzij de enorme ontwikkelingen op het gebied van natural language processing (NLP). Deze ontwikkeling is van essentiële waarde, want als je een chatbot wil die een zekere mate van intelligentie heeft is het hoe dan ook nodig voor de chatbot om een bepaald begrip van taal te hebben. Maar hoe leren we een computer om taal te begrijpen en hoe gebruikt een chatbot dit taalbegrip?

Met deze blog zal je een inzicht krijgen in zowel de theoretische als de technische achtergrond van een chatbot gebaseerd op AI. Ik zal uitleggen hoe we een computer, taal leren aan de hand van de Universal Sentence Encoder (USE), een state-of-the-art “deep learning model”. Ook zal ik demonstreren hoe je zelf een chatbot kunt bouwen op basis van de USE in Python op een dataset met veelgestelde vragen betreffende het coronavirus (afkomstig van het RIVM). Kortom, als het implementeren van een chatbot op jouw project lijstje staat zal deze blog een sterke basis bieden.

Voordelen van een chatbot

Het gebruik van een chatbot biedt vele voordelen voor zowel de consument als de producent.

Om te beginnen de voordelen voor de consument.

  • Proactief: de chatbot kan een gesprek met een consument beginnen op basis van bijvoorbeeld zijn of haar tijd besteed op een website. Het kan zo zijn dat een consument erg lang op een website zit en iets niet kan vinden, op dit moment kan een chatbot die vraagt of je hulp kan gebruiken goed van pas komen.
  • Direct antwoord: de chatbot genereert binnen enkele seconden een antwoord, terwijl er aan telefonische klantenservice of mail vaak een langere wachttijd verbonden is.
  • 24/7 beschikbaar: de chatbot hoeft niet te slapen of pauze te houden, dit betekent dat er op ieder moment van de dag een beschikbare service is.
  • Relevante informatie: de chatbot kan een consument direct begeleiden en helpen in het vinden van relevante informatie. Zo kan je een langdurige zoektocht op een uitgebreide website omzeilen door de chatbot te vragen om directies.
  • Betrokkenheid: de chatbot kan tijdens een gesprek aantrekkelijke plaatjes, filmpjes, GIFs laten zien, waardoor de consument extra wordt gestimuleerd en betrokken raakt in het gesprek.

Nu de voordelen voor de producent:

  • Kostenreductie: een van de chatbots meest sterke voordelen is dat het kosten bespaard (mits deze goed werkt). Het biedt een goedkopere en snelle klantenservice en voorkomt extreme wachttijden. Dit betekent dat een bedrijf tijd vrij kan maken voor de meer complexe vragen en eventueel minder mankracht nodig heeft voor de klantenservice.
  • Tevreden consumenten: op basis van de eerder genoemde voordelen voor de consumenten, kan je ervan uit gaan dat tevredenheid onder consumenten verbetert (mits deze goed werkt). Dit biedt voordelen voor organisaties die de chatbots implementeren.
  • Feedback: de chatbot kan aan het einde van iedere conversatie vragen om feedback. Ofwel in de vorm van een open vraag of een meerkeuze vraag. Dit biedt een platform wat extra feedback kan verwerken en direct kan analyseren.
  • Op de werkvloer: werknemers kunnen vragen stellen aan de chatbot betreffende zakelijke aspecten binnen een bedrijf. Onder andere vragen als hoe pas ik mijn wachtwoord aan en wie moet ik waarvoor spreken. Dit zorgt voor efficiëntie binnen bedrijven.

Hoe werkt een chatbot?

Nu weten we wat een chatbot is, waarvoor het gebruikt kan worden en wat de voordelen zijn voor zowel de consument als de producent. Maar hoe werkt een chatbot nou precies en hoe begrijpt een chatbot taal? Dit zullen we nu stap voor stap doornemen, beginnende met het onderwerp taalbegrip.

Natural Language Processing (NLP)

Zoals ik eerder al benoemde is NLP een van de belangrijkste bouwstenen van een chatbot. NLP is de technologie die wordt gebruikt om computers menselijke taal te leren “begrijpen”. Deze techniek wordt beschouwd als een moeilijk onderwerp binnen AI, aangezien de logica van menselijke taal moeilijk te vertalen is naar code. Neem bijvoorbeeld een sarcastische opmerking of een grap, hoe leer je een computer dit te begrijpen?

Om te beginnen, is het noodzakelijk om een representatie (codering) te hebben van tekst die interpreteerbaar is voor een computer. Om zo’n representatie te verkrijgen wordt een strategie gebruikt die “strings” transformeert naar nummers, ofwel tekst “vectorization”. Het is belangrijk dat deze vectoren informatie bevatten betreffende interacties/semantische relaties tussen zinnen, aangezien dit van belang is voor taalbegrip. Neem bijvoorbeeld de volgende zinnen “Ik ben een beetje verkouden, kan het zijn dat dit het nieuwe coronavirus is?” en “Ik ben bang dat ik het COVID-19 heb, aangezien ik best wel verkouden ben.”. Deze twee zinnen hebben dezelfde betekenis, maar zijn anders geformuleerd. Het is van belang, dat de computer ondanks de verschillen begrijpt dat deze zinnen soortgelijk zijn.

Dit kan de computer leren begrijpen aan de hand van ‘sentence encodings’, een veelgebruikte methode binnen NLP. Het idee is dat we zinnen die hetzelfde betekenen dezelfde encoding gaan geven, zelfs al hebben ze een ander woordgebruik. Deze encodings zijn dus eigenlijk een soort van “streepjescode” voor de betekenis van een zin. Om te kijken of twee zinnen gelijk zijn qua betekenis (de “semantic similarity”), hoeven we alleen maar te kijken of deze streepjescodes ongeveer gelijk zijn. Hierdoor is de computer in staat patronen binnen taal te leren herkennen en daarmee dus zinnen als “Ik ben een beetje verkouden, kan het zijn dat dit het nieuwe coronavirus is?” en “Ik ben bang dat ik het COVID-19 heb, aangezien ik best wel verkouden ben.” soortgelijk te interpreteren.

Hoe een computer deze encodings uiteindelijk leert, zullen we straks ietsje dieper op ingaan. Maar belangrijk is om te onthouden dat dit gebeurt aan de hand van heel veel beschikbare tekst data (zoals bijvoorbeeld Wikipedia, news-feeds, etc.).

Dus we weten: als de encodings ongeveer gelijk zijn, betekenen ze ongeveer hetzelfde. Maar hoe meten we nou eigenlijk wanneer iets “ongeveer gelijk” is? Dit zal ik uitleggen aan de hand van de onderstaande (linker) afbeelding. De sentence encodings zouden we, als deze encodings in 3 dimensies zouden plaatsvinden, kunnen zien als stippen op deze bol (voor de lezers die geïnteresseerd zijn in de vraag: “Waarom een bol?”; dit is omdat encodings altijd vectoren zijn van lengte 1). Tussen deze stippen kan een bepaalde afstand worden berekend. Maar welke afstand gebruiken we daarvoor? Vanuit de lineaire algebra gebruiken we daarvoor vaak de “cosine similarity”. Dit is de hoek die twee stippen maken bekeken vanuit het middelpunt van de bol. Bekeken vanuit de rode stip, heeft de blauwe stip de kleinste hoek bekeken vanuit het middelpunt, dus zouden we kunnen zeggen dat de zin behorende bij de blauwe stip het meeste lijkt op de rode stip. Als je meer wilt leren over cosine similarity kan ik deze blog aanraden (link).

Figuur 1: Cosine similarity tussen sentence encodings

Zoals ik net al noemde, berekenen we de (cosinus van de) hoek tussen deze stippen (encodings), om te vergelijken hoe semantisch gelijk de zinnen zijn. Omdat elke encoding al lengte 1 heeft, hoeven we slechts het inwendig product te berekenen. Het inwendig product berekent de cosinus van de hoek tussen de rode en de blauwe stip, met als uitkomst een waarde. Deze waarde staat representatief als mate van overeenkomst tussen de twee stippen (encodings). Hoe hoger de cosinus, hoe kleiner de hoek, dus hoe hogere semantic similarity. Bovenstaand (rechter) figuur geeft eventueel nog beter inzicht. Hoe donkerder blauw het vakje, hoe kleiner de hoek (dus hoe hoger de cosinus).

Even een korte terugblik. We snappen nu dat we met sentence encodings in staat zijn om semantische relaties te bepalen en daarmee het begrip van taal voor de computer extreem hebben verbeterd. Ook weten we hoe je die relaties tussen zinnen kan bepalen aan de hand van ‘cosine similarity’. Maar hoe komen we nou eigenlijk precies aan die sentence encodings?

Sentence encodings worden gegenereerd aan de hand van een neural network. Er zijn verschillende typen neural networks, waarvan de Universal Sentence Encoder (USE) op dit moment één van de allerbeste is. Om de USE en zijn toebehorende Transformer architectuur te kunnen begrijpen, is het allereerst belangrijk een basiskennis over neural networks te bezitten. Voor de lezers die al bekend zijn met neural networks raad ik aan het volgende kopje “Neural Networks” over te slaan.

Neural Networks

Een neural network wordt nog wel eens vergeleken met het menselijk brein, maar of dit helemaal terecht is valt te betwisten. Desondanks, biedt de vergelijking met het menselijk brein een iets gesimplificeerde eerste indicatie van hoe een neural network werkt. Een menselijk neuron ontvangt elektrische signalen van andere neuronen. Wanneer een bepaalde drempelwaarde wordt bereikt gaat het neuron vuren. Een puls van elektriciteit gaat door de axon naar één of meerdere andere neuronen. Een neuron uit een neural network ontvangt ook input signalen (bijvoorbeeld de zwart-wit pixels van een afbeelding) en zal activeren wanneer een bepaalde drempelwaarde wordt bereikt. Toch is er ook een groot en belangrijk verschil tussen een menselijk neuron en niet-menselijk neuron. Dit verschil ligt in het feit dat we tot op de dag van vandaag niet precies weten hoe een menselijk neuron werkt en leert, dit weten we wel over een neuron uit een neural network. Hoe een simpel neural network werkt en leert zal ik nu beknopt gaan uitleggen.

Een neural network is in principe opgebouwd uit drie typen “layers” (zie afbeelding). Waarbij de eerste layer altijd de input variabelen bevat, dit is de initiële data voor het neural network. De tweede layer bestaat uit hidden layer(s), dit is de laag waarin berekeningen worden uitgevoerd. In de derde layer wordt een activation function toegepast, deze introduceert non-lineariteit.

Figuur 2: Neural Network

Zoals eerder al genoemd, weet men niet precies hoe een menselijk neuron leert. Gelukkig kan het leerproces van een neural network wel worden uitgelegd. Een neural network “leert” namelijk aan de hand van het minimaliseren van een cost function. Deze cost function geeft een mate van prestatie van het model die ligt in zijn capaciteit om de relatie tussen de input en output variabelen correct te schatten. Zoals te zien in de rechterzijde van de bovenstaande afbeelding, berekent de cost function het verschil tussen de voorspelde uitkomst variabele en de waren uitkomst variabele. Dit verschil willen we minimaliseren, aangezien we willen dat het model zo goed mogelijk de ware uitkomst voorspelt. Hierbij komt gradient descent in het spel. Gradient descent is een optimalisatie algoritme dat opzoek gaat naar de lokale of globale minima van de cost function. Dit zou je kunnen vergelijken met het vinden van een dal in een bergachtig landschap. In dit dal is de “cost” van het verschil tussen de voorspelde en ware uitkomst variabelen minimaal. In andere woorden, hier voorspelt ons model het beste de ware uitkomst. Maar hoe bepalen we in welke richting we moeten lopen om dit “dal” te bereiken? Dit doen we door middel van backpropagation. Deze berekent namelijk de zogeheten “gradiënt” van de cost function. Deze gradiënt bepaalt de richting waarin we moeten lopen om ofwel de top ofwel het dal van de berg te bereiken. Backpropagation berekent deze gradiënt aan de hand van de “chain rule”, waarbij de afgeleide van de cost function wordt genomen in relatie tot de weights. Gradient descent update vervolgens de weights en biases (dit zijn parameters) van het neural network zo dat de cost function wordt geminimaliseerd (voorspelde uitkomst komt dichterbij de ware uitkomst). Dit is de basis en kort door de bocht het leerproces van een neural network (zie afbeelding). Er staan een aantal dik gedrukte termen, waarvan het meer dan logisch is als je dit nog niet in één keer snapt op basis van deze beknopte uitleg. Als je hier wat meer over wilt leren, raad ik je aan om op YouTube te kijken naar 3blue1brown (link).

Bij deze heb je een sterk begrip van sentence encodings en neural networks. Nu moet het verband ertussen alleen nog worden gelegd. Het wordt dus hoog tijd om te gaan specificeren op het neural network-model dat is toegepast voor het leren van de sentence encodings die gebruikt zijn voor onze chatbot.

Universal Sentence Encoder (USE)

Zoals ik eerder al genoemd heb is de USE een van de beste sentence encoders die op het moment beschikbaar is. Er zijn meerdere versies van de USE, waarvan er één specifiek geschikt is voor het maken van een chatbot. Deze is gebaseerd op de transformer architectuur en maakt gebruik van attention. Wat dit allemaal betekent zal ik nader uitleggen. In het artikel “Attention Is All You Need” kan je eventueel nog een extra uitgebreide uitleg vinden (link).

Allereerst de transformer architectuur. De transformer architectuur biedt een vernieuwende methode om een sequence te vertalen naar een andere sequence met behulp van een encoder en een decoder, zie afbeelding. De transformer maakt in tegenstelling tot andere veelgebruikte ‘sentence encoders’ geen gebruik van recurrent networks. Tot nu toe waren recurrent networks de beste manier om afhankelijkheid tussen sequences te bepalen, maar daar komt dus verandering in. Google AI presenteert een architectuur zonder recurrent networks met alleen attention. Dit model behaald state-of-the-art resultaten op verschillende NLP-taken (vertaling, vraag-en-antwoord en sentiment analyse). Zie model architectuur in onderstaande afbeelding.

Figuur 3: Transformer Architectuur

Dit waren in één klap een hoop nieuwe termen, waarvan het zowel voor de meer ervaren lezers als de nieuwkomers in het veld lastig is om het gelijk te begrijpen. Vandaar zal ik alle dik gedrukte termen nader uitleggen. Beginnende met sequences en de encoder/decoder architectuur.

Sequence-to-sequence learning (seq2seq) is, zoals de naam eigenlijk al aangeeft, een neural network die een sequence van elementen transformeert naar een andere sequence van elementen. Seq2seq presteert erg goed op vertaling taken, hierbij wordt een sequence van woorden vertaald naar een sequence van woorden in een andere taal. Seq2seq modellen bestaan uit een zogeheten encoder en decoder. De encoder verwerkt de input sequence en transformeert dit naar een n-dimensionale vector (sentence encoding). Deze abstracte vector wordt gevoed in de decoder, die deze transformeert naar een output sequence. Deze output sequence kan dus bijvoorbeeld in een andere taal zijn. Je kan de n-dimensionale vector in principe interpreteren als een soort gemeenschappelijke taal. Stel je voedt de encoder een Nederlandstalige zin die in de decoder vertaald moet worden naar het Frans, dan dient de n-dimensionale vector als een tussentaal die te begrijpen is voor zowel de Nederlandse encoder als de Franse decoder. Desondanks, zullen zowel de encoder als de decoder in eerste instantie nog niet vloeiend zijn in deze gemeenschappelijke taal. Ze zullen dus allebei moeten worden getraind op een grote hoeveelheid voorbeelden, hier later meer over.

Nu snappen we seq2seq en de encoder-decoder structuur. Echter had ik het bij de omschrijving van de transformer architectuur ook over recurrent networks. Om deze te begrijpen is het ook belangrijk te snappen wat feedforward networks zijn (die de transformer gebruikt). Dit zal ik nu uitleggen.

Een feedforward network is eigenlijk precies een neural network zoals eerder omschreven onder het kopje “Neural Networks”. Een voorbeeld van een feedforward network is de classificatie van foto’s tot kat versus niet-kat op basis van voorheen handmatig geclassificeerde data. Het netwerk zal dan de cost function minimaliseren door middel van gradient descent en backpropagation. Echter, heeft het feedforward network ook een sterke tekortkoming. Dat is dat deze geen perceptie heeft van de volgorde van tijd. Dit komt doordat een feedforward network alleen hetgeen waaraan het direct wordt blootgesteld overweegt. Recurrent networks daarentegen, zijn in staat om naast de huidige input die ze ontvangen ook input uit het verleden mee te kunnen nemen. Een recurrent network wordt ook wel eens vergeleken met een mens, in dat deze een geheugen heeft die meespeelt in het maken van beslissingen. Recurrent networks zijn dus extreem nuttig en daarmee ook veelgebruikt. De transformer architectuur maakt echter geen gebruik van recurrent networks. Daarmee is deze niet in staat om te onthouden wanneer en hoe input is ingevoerd in het model. Dit is wel nodig, aangezien ieder woord in een zin een positie heeft relatief tot andere elementen in een zin. Vandaar maakt de transformer gebruik van een positional encoding, deze posities worden toegevoegd aan de n-dimensionale vector van ieder woord.

Als laatste het belang en nut van attention. Attention is een mechanisme dat kijkt naar de input sequence in de encoder en bepaalt welke onderdelen van de sequence het meest belangrijk zijn. In andere woorden, attention onthoudt net als mensen de trefwoorden uit een zin, naast zich te focussen op het huidige woord. Dit doen we om context van een zin of verhaal te begrijpen. Attention is dus in staat om de ruis uit een zin te negeren en zich te focussen op relevante informatie. Daarnaast is attention in staat om relevante woorden die helemaal in het begin van een zin of document voorkomen te onthouden.

Onderstaande afbeelding geeft een duidelijker beeld van attention. De rode woorden zijn de woorden die op het moment worden gelezen/verwerkt, de blauwe woorden zijn de herinneringen. Hoe sterker blauw een herinnering is gekleurd, hoe sterker de herinnering op dat moment. In eerste instantie werd attention gebruikt als toevoeging op recurrent networks, maar inmiddels hebben we ondervonden dat attention op zichzelf state-of-the-art resultaten kan behalen. Als je meer wilt leren over attention raad ik je aan deze blog te lezen (link).

Figuur 4: Attention

Nu zal je je misschien afvragen hoe deze transformer architectuur precies gebruikt wordt voor het creëren van sentence encodings. Dit gaat als volgt in zijn werk: er wordt een groot neural network getraind op verscheidene taal gerelateerde taken (multi-task network). Daarvoor wordt één gemeenschappelijke encoder gebruikt, zie onderstaande afbeelding. De gemeenschappelijk encoder (zie rood in afbeelding) die wordt gebruikt is de USE-encoder met bijbehorende transformer architectuur. Dit multi-task neural network wordt getraind op gigantische hoeveelheden data, waarbij sentence encodings worden “geleerd” die generiek zijn voor al deze taken. Wanneer het trainen klaar is wordt de gemeenschappelijke encoder losgekoppeld. Deze encoder kan vervolgens gebruikt worden voor andere specifieke taken, zoals een chatbot!

Figuur 5: Multi-Task Network

Wat de USE een meertalige sentence encoder maakt, is dat er bij de multi-task neural network een translation task is toegevoegd. De linker drie taken (Conversational Response, Quick-Thoughts en NLI) worden alledrie getraind op eenzelfde taal. Een translation taak daarentegen wordt getraind op twee talen. Vandaar dat deze ervoor zorgt dat de encoder sentence encodings creëert die interpreteerbaar zijn voor de talen die in de translation taak worden toegevoegd. De USE is getraind op wel 16 talen.

Kortom, we hebben inmiddels geleerd wat sentence encodings zijn, hoe deze geleerd worden, wat neural networks zijn en hoe de USE is opgebouwd. Het wordt dus hoog tijd te demonstreren hoe je de USE kan toepassen op je eigen dataset in Python.

Implementatie USE en chatbot op data COVID-19

Nu wordt het tijd te demonstreren hoe we de USE kunnen gebruiken om zelf een chatbot te bouwen. De encodings van de USE zijn pre-trained en het model is beschikbaar voor gebruik in de TensorFlow Hub van Google (link).

Om te beginnen een korte omschrijving van de dataset. In verband met deze ongelukkige corona tijden, hebben we gekozen voor een relevante dataset. Namelijk, eentje afkomstig van het RIVM. Zoals ik eerder al eens noemde, is er op de website van het RIVM een pagina waarop veelgestelde vragen betreffende het coronavirus worden beantwoord. Hier konden wij goed gebruik van maken. De dataset die we hebben verzameld bevat 112 mogelijke antwoorden op uiteenlopende onderwerpen betreffende het coronavirus (o.a. “Maatregelen die Nederland neemt tegen verspreiding” en “Wat kan ik doen om verspreiding te voorkomen”). De betreffende dataset en code voor de implementatie van de chatbot is beschikbaar op de bijbehorende GitHub pagina (link).

Nu wordt het tijd om de USE toe te gaan passen op de gecreëerde dataset. Om te beginnen laden we de module die het model van de USE bevat en laden we de benodigde packages, zie onderstaande code. Ook zie je de bovenste rijen van de data frame, waarin zowel alle antwoordopties voor de chatbot als de context van de antwoordopties staan.

Deze module die we nu geladen hebben, willen we vervolgens gaan gebruiken om “response encodings” te creëren. Alle mogelijke antwoorden op onderwerpen betreffende het coronavirus staan beschikbaar in bovenstaande dataset. Deze worden dus ook gebruikt voor de response encodings. Het USE model biedt ook de mogelijk om context te bieden rondom de mogelijke antwoorden. De context is ook te vinden in bovenstaande dataset. In de onderstaande code kun je zien hoe de response encodings worden gecreëerd op basis van de antwoorden en context uit de dataset.

Nu we de response encodings hebben kunnen we een vraag gaan stellen over het coronavirus en direct een antwoord krijgen! Voor deze vraag gebruiken we echter ook nog de module (ter herinnering, deze bevat de USE). Voor iedere vraag die je stelt wordt namelijk een “question encoding” gemaakt. Op basis van deze question encoding kan het algoritme nu de meest overeenkomstige response encoding zoeken. Dat is dus eigenlijk de essentie van wat deze chatbot doet. De semantisch meest overeenkomstige response wordt gevonden aan de hand van de inner product, op de wijze zoals eerder uitgelegd onder “Natural Language Processing”. In onderstaande code zijn een aantal test-vragen te zien, ook wordt de question encoding gecreëerd en wordt de inner product genomen om de het meest overeenkomstige antwoord te vinden.

Zo geeft deze chatbot op alle bovenstaande test-vragen een correct antwoord. Dat is dus erg goed nieuws!! Desondanks, liepen we tegen wat tekortkomingen aan. Deze zal ik nu bespreken.

Tekortkomingen

Eerst de tekortkomingen van het model. Tijdens het testen van de chatbot viel het op dat bij iedere vraag waarin het woord “COVID-19” stond een raar antwoord werd gegeven. Dit valt te verklaren aan de hand van het feit dat alle sentence encodings pre-trained zijn. Aangezien het COVID-19 een nieuw virus is (en dus een nieuw woord) heeft de USE tijdens het trainen van de encodings hier nog geen kennis mee gemaakt. Dit duidt dus ook op een tekortkoming van het model. Deze is namelijk niet in staat goed om te gaan met “onbekende” woorden. Dit probleem hebben wij nu opgelost door het woord “COVID-19” te vervangen met “coronavirus”. Dit doet het algoritme ook automatisch voor iedere vraag. Tijdens het stellen van een vraag hoeft hier dus geen rekening mee worden gehouden.

Ook, gaf de chatbot vreemde antwoorden als er antwoordopties in de dataset stonden die langer waren dan drie zinnen. De USE presteert dus voornamelijk goed op zinnen of korte teksten (max drie zinnen). Dat de USE beter presteert op enkele zinnen staat ook vermeld in de user guide op TensorFlow. Om volledig informatieve antwoorden te geven op vragen betreffende het coronavirus zijn weliswaar soms lange antwoorden nodig. Een oplossing voor dit probleem zou dus erg waardevol zijn.

Als laatst de tekortkomingen van de chatbot. De huidige chatbot die gemaakt is voor vragen betreffende het coronavirus is gebaseerd op een wat kleine dataset. Dit betekent dus dat deze chatbot niet in staat is om antwoord te geven op iedere vraag. Om de chatbot echt goed te maken kan er nog meer data worden verzameld van het RIVM en zou de dataset goed bij moeten worden gehouden, er zijn namelijk vaak updates. Zoals ik eerder ook al noemde, zou de chatbot beter zijn als deze in staat is langere antwoorden te ondersteunen. Echter, is dat met dit model helaas niet mogelijk.

Laatste woord

Wie weet ben je na het lezen van deze blog enthousiast geworden en kan je aan de slag met de dataset en code die beschikbaar is op de bijbehorende GitHub pagina. Het USE algoritme dat gebruikt wordt in deze blogpost is een van de bouwstenen die gebruikt kan worden om een bot te bouwen. Er zijn dus ook andere opties voor het bouwen van een chatbot. Als deze blog te technisch voor je is, biedt Triple ook een alternatief aan, de Wozzbot. Dit is een applicatie die een niet-technische manier aanbiedt om een of meerdere chatbots te bouwen. Kijk voor informatie op www.wozzbot.com en neem contact op met het team via info@wozzbot.com.

Betreffende het coronavirus is het van groot belang dat mensen zich zo goed mogelijk informeren om daarmee verdere verspreiding zoveel mogelijk in te dammen. Een chatbot zou daar een grote bijdragen aan kunnen leveren. Mensen kunnen dan bijvoorbeeld via een app snel een dringende vraag intypen waarop ze direct antwoord kunnen krijgen. Kortom, hier kunnen we meer mee!!

--

--

Emma Schreurs
TripleUniverse

Data Science intern at Triple and graduate student Behavioural Data Science at the University of Amsterdam, with a background in Psychology