Hvordan repræsenterer vi tekst, så en computer kan regne på det?

Brødtekst

»Der var så dejligt ude på landet; det var sommer, kornet stod gult, havren grøn, høet var rejst i stakke nede i de grønne enge, og der gik storken på sine lange, røde ben og snakkede ægyptisk, for det sprog havde han lært af sin moder.«
-H.C. Andersen, Den grimme ælling

Denne blogpost giver en introduktion til, hvordan en tekst som for eksempel ovenstående første sætning i H.C. Andersens velkendte eventyr, Den grimme ælling, kan repræsenteres med tal således, at en computer kan begynde at regne på det og fange semantiske betydninger i ord og sætninger.

Undervejs vil vi hente al tekst fra den danske Wikipedia, ønske os en endnu større mængde, acceptere stavefejl og tøve over kønsstereotyper.

Lad ‘eventyret’ begynde

… med at pakke rygsækken med lidt basic stuff og en bag-of-words model.

Måder at repræsentere tekst som vektorer — dvs. kolonner af tal — kaldes for embeddings, og word embeddings, som navnet afslører, er disse repræsentationer af ord.

En intuitiv måde at repræsentere ord som vektorer på er at tjekke, om et ord optræder i en tekst eller ej og angive dette med enten et ettal eller et nul. Lidt mere formelt kan vi repræsentere hvert ord ved at konstruere en vektor lige så lang som vores ordforråd og lade hver indgang i vektoren repræsentere et ord.

Hvis vi laver øvelsen på den ovenstående tekst fra Den grimme ælling, vil vores ordforråd bestå af 38 ord, og sorteres disse alfabetisk, vil ordet ‘dejligt’, havde følgende vektor:

‘dejligt’=[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Sætninger eller tekst kan nu repræsenteres ved at addere vektorerne for hver af de optrædende ord. Dette kan gøres en smule mere nuanceret ved at vægte ordene i forhold til deres hyppighed i teksten således, at der lægges mere vægt på sjældne ord end på hyppige ord.

En sådan repræsentation kaldes en bag-of-word model.

På trods af dens simpelhed tjener denne model ofte som en god baseline og særligt, hvis man arbejder med tekstdata i et afgrænset domæne. På den anden side bliver denne repræsentation hurtigt meget stor i takt med ordforrådet, og den vil komme til at bestå hovedsageligt af nuller. Ligeledes giver denne repræsentation ikke nogen sammenhæng eller forståelse mellem ordene, men det vil vi se i den næste model.

Hvis du kender ællingens omgangskreds

… kender du så ællingen?

Det har H.C. Andersen nok et andet svar på, men rent ordmæssigt er der noget om det. I hvert fald kan lingvisten John Rupert Firth citeres for følgende:

You shall know a word by the company it keeps
- John Rupert Firth, 1957

Den ide har Mikolov et al. 2013 ¹ implementeret i en model kaldet word2vec.

Ideen er, at ord med en betydningsmæssig sammenhæng ofte optræder i samme kontekst. Der foreslås en modelarkitektur skip-gram, som er et såkaldt shallow neural network, som har til opgave på baggrund af et input-ord at forudsige de omkringliggende ord — og her regner modellen på de lange nul-et repræsentationer, som vi introducerede ovenfor for hvert ord i ordforrådet. Målet er at få skabt en mellemliggende ord-repræsentation, som er god til denne forudsigelse.

Når vi som mennesker lærer nye ord på baggrund af en tekst, vi læser, hjælper det os jo flere gange, vi har set ordet optræde i forskellige sætninger og kontekster. Dette gælder også for ovenstående word2vec model. Vi har derfor brug for store mængder tekstdata, som modellen kan tygge sig igennem.

En open source kilde til dette er for eksempel den danske Wikipedia. Hvis vi henter et dump af teksten fra forskellige sprog, kan vi se størrelsesforholdet mellem forskellige sprogs Wikipedia-sider i nedenstående figur. Her ser vi en indikation på, at vores danske modeller i NLP mangler data, og at de derfor ikke er lige så gode som på for eksempel engelsk. Men databehovet i NLP må vi vende tilbage til i en anden blogpost.

NLP
Størrelsesforholdet mellem forskellige sprogs Wikipedia-sider
Illustration: Amalie Pauli

Nu vil vi se lidt trylleri

… eller i hvert fald lidt regneri.

Word2vec modellen har nu lært en repræsentation af ordene i vores ordforråd, som har reduceret længden af vektorerne fra ordforrådets længde til hidden layers dimensionen i netværket, og vi kan nu for hvert ord slå op hvilken vektor, der repræsenterer ordet.

Dette kaldes en statisk word embedding. Og nu er det, at ‘udviklingen til svane’ begynder, for disse repræsentationer har en semantisk sammenhæng og en geometrisk fortolkning. Ord med betydningsmæssig sammenhæng vil ligge tættere på hinanden, og vi kan tale om, at forskellige dimensioner fanger forskellige ting.

Dette er bedst illustreret ved nogle eksempler, og lad os tage udgangspunkt i ord fra indledningen til Den grimme ælling:

 

NLP
Ord fra indledningen til Den grimme ælling
Illustration: Amalie Pauli

Det første eksempel viser, at vi kan udregne en score, som fortæller, hvor tæt to ord ligger på hinanden. Vi ser også, at word embeddingen opfanger, at korn ligger tættere på vektoren for landet end for byen.

Dette illustreres tydeligere i næste eksempel, hvor word embeddingen ud fra en liste af ord kan udregne hvilket ord, der ikke passer ind. Vi skulle gerne nikke genkendende til, at hund ikke passer ind, da det ikke er en fugl, grim fordi det er et negativt ladet ord, og har fordi det står i nutid. Den sidste eksempeltype er en såkaldt wordanalogi, som stiller spørgsmålet Kairo er til Ægypten, som X er til Danmark? Og ved at lægge vektorer sammen og trække fra fås svaret København.

Modellen lærer sammenhængen af ordene ud fra den tekst, modellen er trænet på, og det gør også, at uhensigtsmæssige stereotyper kan overføres til modellen.

Bolukbasi et al. 2016 ² undersøgte kønskævvridninger i word embeddings og foreslog metoder til at reducere det. Hvis vi kigger på en dansk word embedding, som er trænet på gamle nyhedsartikler, kan vi se et eksempel på kønsstereotype sammenhænge. Der er taget en liste med 143 tillægsord og projekteret ned på en kønsretning, som viser hvilke tillægsord, der ligger tættere på mand og hvilke på kvinde.

Top 10 for mand er:
alvorligste, grov, sennuværendesand, hård, halv, forsigtig, farlig og alvorligere

Top 10 for kvinde er:
sød, smuk, selvstændigere, pæn, varm, nødvendigste, frisk, billig, enkel og dejlig.

En begrænsning ved word2vec modellen er, at den kun kan håndtere ord i ordforrådet, altså ord, som modellen er stødt på under træning, men det vil vores næste model tage hånd om.

At stave rigtig eller ikke at stave rigtigt

… er ligemeget.

Den næste word embedding i rækken er FastText embeddings fra Bojanowski et al. 2017. ³ Der tages udgangspunkt i word2vec modellen, men repræsentation læres på dele af ordet, såkaldte n-grams. For eksempel vil 3-gram for ælling bestå af ‘æll, lli, lin, ing ‘.

Modellen bliver derfor mere robust over for sjældne ord og ord, som ikke er i ordforrådet herunder stavefejl, da den har set dele af ordet før. Et eksempel kan være, hvis svaneungen staves forkert, så kan en FastText model udregne, at ordet er tættest på det rigtige ord, hvorimod en word2vec model vil melde fejl, da den ikke har set ordet før. Nedenfor ses et eksemple hvor modelen er spurgt om, hvilker ord i dens ordforråd, der ligger tætteste på ‘saneungen’.

FastText model
FastText modellen udregner, at det rigtige ord er »svaneungen« og ikke »saneungen«
Illustration: Amalie Pauli

Med ægyptisk menes der

… 1) fra Ægypten; vedr. og karakteristisk for Ægypten og ægypterne eller 2) afroasiatisk sprog, som taltes i oldtidens Ægypten? Betydningerne er hentet fra opslag i Den danske ordbog.

Ord, som staves ens, kan have forskellige betydninger. Et mere udtalt eksempel er ordet bakke, som både kan referere til at bakke bilenen bakke med kopperdet er op ad bakke og så videre. Men som det ses, fremgår det af konteksten, hvilken betydning af bakke, der refereres til.

I de statiske word embeddings har hver stavet ord kun en vektor, og embedding kan således ikke håndtere dette betydningsskifte. Men det kan dynamiske word embeddings. Det er modeller, som laver en vektor repræsentation af hvert ord ud fra sætningen, som ordene indgår i. Dette kræver store og tunge modeller, der er trænet på store datamængder ved hjælp af neurale netværk.

Et eksempel på en sådan model er Flair fra Akbik et al. 2018 ⁴, den er trænet ved hjælp af en language model, som er trænet til at forudsige det næste ord i en sætning.

At springe over voldgraven

… eller i hvert fald NLP’s store spring fremad!

Store neurale netværk med attention og transformer arkitektur har for alvor sat skub i feltet inden for NLP. Men mere om disse modeller og deres virke må gemmes til en anden god gang.

Dette var lidt om at repræsentere tekst som vektorer. Forskellige word embeddings er samlet i vores python pakke DaNLP, som kan findes på vores GitHub.

Tak for at du læste med!

Indlægget er oprindeligt bragt på DaNLP's blog.

Nævnte firmaer

Referencer

[1] Mikolov, Tomas, et al. “Distributed representations of words and phrases and their compositionality.” Advances in neural information processing systems. 2013.

[2] Bolukbasi, Tolga, et al. “Man is to computer programmer as woman is to homemaker? debiasing word embeddings.” Advances in neural information processing systems. 2016.

[3] Bojanowski, Piotr, et al. “Enriching word vectors with subword information.” Transactions of the Association for Computational Linguistics5 (2017): 135–146.

[4] Akbik, Alan, Duncan Blythe, and Roland Vollgraf. “Contextual string embeddings for sequence labeling.” Proceedings of the 27th International Conference on Computational Linguistics. 2018.