Mit første forsøg med maskinlæring: Kan algoritmer finde emneord til Version2-artikler?

Skærmdump fra en kørsel af Mallet på Version2-journalist Jesper Stein Sandals artikler fra de seneste fem år. Illustration: MALLET
Machine learning-disciplinen topic modeling kan finde frem til emner, der knytter tekster sammen fra en stor tekstsamling. Som eksempelvis Version2's artikeldatabase.

Gartner placerede for nylig Machine Learning på toppen af hype-kurven, altså et signal fra analytikerne om, at nu har vi pustet forventningerne til algoritmerne op til bristepunktet og skal indstille os på at falde ned i skuffelsens dybe afgrund.

Men det afholder ikke mig fra at prøve at køre maskinlæring i stilling til at automatisere én af vore daglige udfordringer på Version2-redaktionen.

Som journalister prøver vi at markere, hvad vores artikler handler om ved at tilknytte nogle udvalgte emneord til hver artikel, vi lægger ind i systemet. Det er en manuel proces, der er sårbar over for misforståelser eller forglemmelser, der i sidste ende giver os dårlige metadata om artiklernes indhold og dermed indbyrdes tilknytning.

Eller lidt mere konkret: Der er mere end én journalist på redaktionen, der har brugt emneordet 'it-politik' på artikler om politiske beslutninger om it, selvom emneordet egentligt skulle dække over artikler, der handler om firmaers interne regler for brug af it-systemer og -udstyr.

Illustration: Privatfoto

Når en journalist lægger en artikel ind i vores CMS, så skal der vælges et antal relevante emneord ud fra en liste. Et menneske kan begå fejl i denne udvælgelse, og det er en proces, der skal gentages mange gange dagligt. Derfor tænkte jeg, at det måtte være oplagt at afprøve topic modeling eller topic classification.

Da jeg i første omgang er interesseret i at afprøve teknikken på vores artikler, så ville jeg helst ikke ud i at skulle skrive alt for mange linjers Python for at få et resultat. Derfor fandt jeg frem til open source-værktøjet Mallet, som er udviklet af University of Massachusetts. Det er fra 2008, men virker stadig godt nok til at afprøve konceptet.

Mallet benytter sig af en algoritmetype kaldet Latent Dirichlet allocation, som meget groft skitseret bygger på antagelsen om, at når man skriver en tekst om et emne, så vil man trække på en pulje af ord, der er fælles for tekster om dette emne. Udfordringen er, at en tekst også vil indeholde ord fra de puljer, der udgør andre emner, ligesom de enkelte ord kan tilhøre flere forskellige emner.

Derfor er der flere varianter af LDA-metoden, og Mallet implementerer flere af dem. Fordelen for mit lille projekt er, at jeg ikke skal eksperimentere med forskellige implementeringer af algoritmer, men blot skal fodre Mallet med et datasæt og justere på enkelte parametre.

For at lave en topic model eller emnemodel så skal algoritmen have et datasæt, som den kan beregne sandsynlige emner ud fra. Her kunne jeg have brugt vores artikeldatabase, men jeg er mere til at arbejde med filer end med databaser, så selvom jeg havde fået et udtræk fra vores database, valgte jeg at fremstille et datasæt på et andet grundlag.

Jeg havde lidt over 2.400 af mine egne artikler fra de sidste fem år liggende i Word Docx-format, som jeg kunne konvertere i ét hug til rene tekstfiler ved hjælp af det lille Perl-værktøj docx2txt. Et lille Bash-script senere var mellemrummene i filnavnene også fjernet.

Dansk ordliste

Dermed havde jeg mit tekstkorpus. Næste udfordring var, at Mallet ikke understøtter danske tekster. Problemet med topic modeling er, at mange af de ord der udgør en tekst, ikke er relevante for tekstens betydning. De fleste adverbier og flere verber optræder i næsten alle tekster, men siger ikke noget om, hvad teksten handler om.

Se blot på sætningen i sig selv:

De fleste adverbier og flere verber optræder i næsten alle tekster, men siger ikke noget om, hvad teksten handler om.

Ord som 'de, fleste, og, flere, i, næsten, alle, men, siger, ikke, noget, om, hvad, om' er ikke unikke for en sætning om tekstanalyse. Derfor kan man filtrere dem fra, når man indlæser sit tekstkorpus i Mallet.

Illustration: Github Inc.

Det gør Mallet ved hjælp af ordlister, men der var ingen dansk ordliste. Så jeg måtte lave min egen. Det er heldigvis ikke en uoverkommelig opgave for en journalist, men selvom en liste over danske adverbier fra Sproget.dk var nyttig, så er udfordringen, at der kan være visse ord, der i vores artikler kun bruges til nogle bestemte emner. Ord som 'nyt' eller 'større' kunne være vigtige at beholde.

For eksempel kan jeg ikke være sikker på, at verbet 'skrive' skal filtreres fra på forhånd, for det kunne være en vigtig brik i at identificere artikler, der handler om at skrive kode.

Derfor var min ordliste i første forsøg på cirka 250 ord, men er på nuværende tidspunkt på 354 ord. Og ja, når jeg er rimelig sikker på, at det er en god liste, så vil jeg tilbyde den til Mallet-projektet gennem Github, så andre kan bruge den.

Selvom teksterne bliver filtreret for 354 ord, så får man stadig et interessant output fra algoritmen, som finder de resterende almindelige ord og samler dem i et emne for sig selv. I min seneste kørsel har jeg eksempelvis fået følgende ordsamling som ét emne:

når gode svært ser set ting gang dag går holde 
folk faktisk tid virker først bedre par finde vide fleste

Der er et par oplagte kandidater at tilføje til min ordliste, men helt slipper jeg næppe for at få sådan en falsk positiv på emnelisten.

Mit tekstkorpus lider også af, at det er mine rå artikler, hvor der til tider er notater fra interviews på engelsk. Derfor har jeg også ved den seneste kørsel en falsk positiv, der til gengæld er ganske ferm til at genkende de engelske tekster, der skiller sig ud fra de danske:

the and you that with can are not your new will 
but has more device time chris code from this

Skal min model bruges i vores daglige produktion, så skal den nok trænes på et tekstkorpus, hvor der er ryddet op.

Et udsnit af den repræsentation af tekstkorpuset, som Mallet skaber, når man indlæser tekstfilerne. Illustration: MALLET

Emnerne

Mallet opbygger først en repræsentation af et tekstkorpus, som man derefter kan prøve at opbygge en emnemodel ud fra. Repræsentationen består af tekstbidder, og én af udfordringerne med denne teknik er, at der indgår en vis tilfældighed i modelkørslerne. Den ene kørsel kan altså give en knivskarp definition af et generelt emne som supercomputere, mens den næste kørsel tilfældigvis lægger meget vægt på en serie artikler om lige netop DMI's supercomputer.

Der skal altså efterfølgende arbejdes med at få bygget den bedste model til lige netop dét, jeg gerne vil have Mallet til at hjælpe mig med.

Et emne defineres som sagt som en samling af ord, der med en vis sandsynlighed er fælles for tekster, der handler om det givne emne. I kørslerne på mit tekstkorpus gav det et par præcise definitioner af nogle konkrete sager:

amerikanske usa nsa data adgang overvågning oplysninger internettet edward fbi new 
snowden række the udleveret york amerikansk efterretningstjeneste 
myndigheder efterretningstjenesten
 
adgang sagen csc danske sager oplysninger politiet rigspolitiet angiveligt 
version systemer sag mainframe misbrug hackerne personer forbindelse 
dansk tale medarbejder
 
skat projektet system systemet proask millioner efi kroner arbejdsskadestyrelsen 
styrelsen skats nyt projekt offentlige it-system drift 
forsinket konsulenter it-projekter consulting

Det er ret tydeligt, at algoritmen her har fundet sagerne om Edward Snowden og NSA, hackingen af CSC og Skats EFI-skandale. Den har også fundet sig selv i form af mine artikler om maskinlæring:

 data intelligens kunstig finde netværk forskerne mennesker 
maskinlæring algoritmer hjælpe machine algoritmerne forskere 
big hjælp bedre neurale analyse watson lære

Problemet ved at bruge et færdigstøbt, om end ikke specielt udførligt dokumenteret, værktøj som Mallet er, at effekten af at skrue på de forskellige parametre kun kan findes ved at eksperimentere. Det er eksempelvis svært at vurdere, hvor stor en forbedring jeg får ud af 4.000 iterationer i stedet for 1.000 iterationer ved en kørsel.

En anden udfordring er, at det ikke er en eksakt videnskab. Der er tilfældighed involveret i algoritmerne, og samtidig vil resultaterne også afhænge af, hvor mange emner, der er tilstede i mit tekstkorpus. Det er eksempelvis ret tydeligt, at ved 50 emner i stedet for 20, så træder visse emner mere tydeligt frem, men det giver også et par ekstra falske positiver.

Et udsnit af de emner, Mallet gav ved en kørsel på 4.000 iterationer og 50 topics. Hvert topic består af en serie af op til 20 ord med de mest betydningsfulde først. Der er også angivet, hvor stor en andel af tekstkorpuset, emnet passer til. Illustration: MALLET

Næste skridt

Den næste opgave bliver at træne en model på et tekstkorpus sammensat ud fra Version2's artikeldatabase. Det giver både en bredere dækning af forskellige emner, ligesom et emne kan være beskrevet af forskellige journalister med forskelligt sprog.

Det vil medføre en ny oprydningsopgave. Der vil være ord, som skal fjernes, som ikke dukker op til overfladen i mine tekster. Til gengæld vil notater være fjernet fra artiklerne, så der kun optræder relevante engelske ord i artiklerne.

Men vores artikler indeholder også links og formatering, som kan vise sig at være en støjkilde. Det er en anden opgave - men bestemt også interessant - at se på links mellem tekster. At et ord optræder i en mellemrubrik kunne også være værdifuld information, men Mallet benytter ikke tekstanalyse, der ser på hele sætninger, så det er ikke muligt at bruge denne information med Mallet.

Jeg havde mildt sagt lidt ballade med at få skruet det helt rigtige Regex-udtryk sammen til opbygningen af mit tekstkorpus. Mallet giver mulighed for at anvende et Regex-udtryk ved dataimporten, men det gav bedre resultat blot at lade Mallet benytte den Regex-filtrering, der er kodet ind som standard.

Der er som sagt ellers tekstelementer, der burde fjernes. Vi bruger Markdown i vores Drupal-system, hvor ## eksempelvis markerer en h2-mellemrubrik. Det er ikke helt let at få fjernet Markdown fra artiklerne, uden at få problemer for eksempelvis C#, der kunne være et nøgleord.

Løsningen bliver nok at lave et script eller to, der kan polere de rå artikeltekster, inden de bliver fodret til Mallet. Så slipper jeg for at skulle samle al oprydningen i ét Regex-udtryk.

Ud over en liste over ord samt den endelige model, algoritmen kan genbruge, så leverer Mallet også som output en liste over teksterne, og hvor godt de passer på de forskellige emner. Det kan bruges til at lave en trimning af mit tekstkorpus, så tekster, der på én eller anden måde er usædvanlige, kan pilles ud.

Det endelig mål er at få samlet en model, der kan give op til tre nogenlunde præcise bud på emner, når den får præsenteret en ny tekst. Det vil vi kunne bruge til automatisk at tilføje emneord til ny og gamle artikler, og det vil også kunne bruges til at lave automatiske samlinger af artikler inden for et sagsforløb.

Lige nu har vi eksempelvis et tema, der samler artiklerne i CSC-hackersagen, men vi har ikke et tema for Skats it-problemer. Det vil være oplagt at bruge modellen til at finde og samle disse artikler automatisk i stedet for en manuel proces.

Det er vigtigt at understrege, at selvom det er muligt at identificere et emne i form af en mængde af ord, så vil det stadig være et menneske, der skal finde en passende etiket til emnet. Se eksempelvis på et emne, der kunne kaldes 'streaming' eller lidt mere 90'er-agtigt 'digitale medier':

 netflix film indhold the tjenester indholdet spotify streaming danske 
tjenesten dansk bay youtube amerikanske danmark netneutralitet 
filmen pirate tv-serier adgang

Man kan altså ikke regne med, at det første ord er en god etiket. Så der skal menneskelige øjne på, og helst én, der kender tekstkorpus. Algoritmen kan med andre ord udføre de mange gentagelser, der skulle til at sætte etiketten på alle relevante artikler, men ikke vurdere, hvad emnet handler om.

En anden udfordring er, at emner kan dukke op og forsvinde over tid. Det kan blive et problem for opbygningen af modellen som en generel model til hele vores tekstkorpus. Ord som 'ssd' og 'harddisk' kan jeg eksempelvis se, giver modellen problemer med at skelne mellem to emner:

Det første var det hotte emne om ssd'er for fem år siden, hvor jeg skrev om, hvad ssd'er kunne gøre for pc'en. Det andet er i dag, hvor ssd'er i pc'er er så meget en selvfølge, at jeg mest skriver om dem i forbindelse med storage i datacentre. Der er overlap, men det er nok værd at skelne mellem de to.

Det mest overraskende

Jeg er mest overrasket over, hvor præcis algoritmen er til at identificere meget konkrete sager, som NSA-afsløringerne eller EFI-skandalen, men også kan ramme ret præcist på en bestemt genre af artikler.

Det her ligner eksempelvis resultatet af, at algoritmen har læst mine blogindlæg, der var en del af korpus, og har identificeret blogindlæggene som et særskilt emne:

 nørder kvinder trine klokken commodore generation nørd sokker ascii kage lad 
kaffe gengæld tegnsæt printer unge fest værre the tegn

Bloggen handler om nørdkultur, og algoritmen har åbenbart særligt bidt mærke i mit svar til Trine Bramsen om de famøse tennissokker. Et svar, der aldrig nåede længere end til en kladde og aldrig blev udgivet. Så dér - en lille godbid af aldrig udgivet materiale for dem, der har læst så langt.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (6)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Ninett Fischer Jensen

Tak for en velskreven artikel som gav et forståeligt indblik i hvad machine learning kan være. Det ville være dejligt med flere artikler som din. Altså artikler som giver en overkommelig præsentation af hypede emner. Hvad om man tog Gartners liste og lavede oplysende artikler på de 10 øverste emner. Kunne forestille mig at andre version2 læsere end jeg ikke ved alt om alt indenfor IT-verdenen, selvom vi sidder i blå led-belysning og nørder. Haha og tak for underholdende link til Tine Bramsens indlæg.

Jan Gundtofte-Bruun

Fra "Om Version2":

henvender sig til de mange, der arbejder professionelt med it ... et teknologisk afsæt ... både de it-praktiske og forretningsmæssige problemstillinger, der trænger sig på indenfor informations- og kommunikationsteknologien ... Synsvinklen er de professionelle brugeres.

Spot on, Jesper!

Jeg er super spændt på at høre, hvordan din "forskning" skrider frem herfra, og om det er noget I ender med faktisk at bruge på redaktionen. Det ville da være noget at skrive på CV'et!

Finn Aarup Nielsen

"Jeg er mest overrasket over, hvor præcis algoritmen er til at identificere meget konkrete sager"

Man skal være påpasselig med at disse algoritmer nogle gange kan være vægtet sådan at det enkelte emne (komponent i multivariate modellering) i høj grad er baseret på mere eller mindre et enkelt dokument. Om det er problemet kan man undersøge ved at udskrive vægtene for dokumenterne på hver enkelt emne. Altså tilsvarende hvad der er gjort med ord.

Finn Aarup Nielsen

Jeg troede Machine Learning var væsentlig mere avancerede, jeg synes ikke der er så meget Learning over det. Jeg troede faktisk at det handlede om at koden udvikler sin egen kode, altså ikke bare databehandlingen eller har jeg misforstået det?

Nej, du har ikke misforstået noget. Det meste maskinlæring er blot databehandling. Maskinlæring er sådan set blot statistik, - bare mere sexy. "Learning" er (normalt) et andet ord for estimering, parameteroptimering, fitting eller træning.

Log ind eller Opret konto for at kommentere