Hej alle sammen. Det er længe siden jeg skrev min sidste blog om de forskellige typer af recommender systemer. Denne gang vil jeg skrive om Topic Modelling.
Der er mange kilder derude hvor man kan lære hvad Topic Modelling er, men jeg synes, at de fleste af dem er noget tekniske og kræver et godt kendskab til matematik og andre teknikker som Markov Chains. I denne artikel vil jeg forsøge at forklare idéen bag Topic Modelling på en meget intuitiv måde med et absolut minimum af matematik og teknikaliteter. Jeg vil skrive denne artikel i to dele. I den første del vil jeg forsøge at forklare, hvad emne modellering er, og i den anden del vil jeg give en python tutorial om, hvordan man laver emne modellering på den virkelige verden datasæt.
Hvor jeg begynder, vil jeg gerne anerkende, at denne artikel er stærkt inspireret af forelæsningen af min udforskende dataanalyse Prof. Edward McFowland, Courseras kursus om Natural Language Processing af Higher School of Economics og Jordan Boyd-Graber forklaring af Gibbs sampling.
Hvad er emne modellering?
Topic modellering er en gren af uovervåget naturlig sprogbehandling, som bruges til at repræsentere et tekstdokument ved hjælp af flere emner, der bedst kan forklare de underliggende oplysninger i et bestemt dokument. Dette kan tænkes i form af clustering, men med en forskel. Nu har vi i stedet for numeriske funktioner en samling af ord, som vi ønsker at gruppere på en sådan måde, at hver gruppe repræsenterer et emne i et dokument.
Hvorfor har vi brug for emne-modellering?
Okay, så nu opstår spørgsmålet, hvorfor har vi brug for emne-modellering? Hvis vi ser os omkring, kan vi se en enorm mængde tekstdata, der ligger omkring os i et ustruktureret format i form af nyhedsartikler, forskningsartikler, indlæg på sociale medier osv. og vi har brug for en måde at forstå, organisere og mærke disse data på for at kunne træffe informerede beslutninger. Emnemodellering anvendes i forskellige applikationer som f.eks. at finde spørgsmål på stack overflow, der ligner hinanden, aggregering og analyse af nyhedsstrømme, anbefalingssystemer osv. Alle disse fokuserer på at finde den skjulte tematiske struktur i teksten, da det antages, at enhver tekst, som vi skriver, hvad enten det er et tweet, et indlæg eller en forskningsartikel, er sammensat af temaer som sport, fysik, rumfart osv.
Hvordan laver man topicmodellering?
I øjeblikket er der mange måder at lave topicmodellering på, men i dette indlæg vil vi diskutere en probabilistisk modelleringsmetode kaldet Latent Dirichlet Allocation (LDA), som blev udviklet af professor David M. Blei i 2003. Dette er en udvidelse af Probabilistic Latent Semantic Analysis (PLSA), der blev udviklet i 1999 af Thomas Hoffman, med en meget lille forskel med hensyn til, hvordan de behandler fordelingen pr. dokument. Så lad os springe direkte ind på, hvordan LDA fungerer.
Latent Dirichlet Allocation
Lad os starte med at forstå betydningen af hvert ord i titlen, da jeg mener, at det indeholder alt, hvad vi behøver at vide for at forstå, hvordan LDA fungerer.
Latent: Dette henviser til alt det, som vi ikke kender a priori og som er skjult i dataene. Her er de temaer eller emner, som dokumentet består af, ukendte, men de antages at være til stede, da teksten er genereret på baggrund af disse emner.
Dirichlet: Det er en “fordeling af fordelinger”. Ja, du læste rigtigt. Men hvad betyder det? Lad os tænke over det ved hjælp af et eksempel. Lad os antage, at der er en maskine, der producerer terninger, og vi kan kontrollere, om maskinen altid vil producere en terning med lige stor vægt til alle sider, eller om der vil være en skævhed til nogle sider. Den maskine, der producerer terninger, er altså en fordeling, da den producerer terninger af forskellige typer. Vi ved også, at selve terningen er en fordeling, da vi får flere værdier, når vi kaster en terning. Dette er, hvad det vil sige at være en fordeling af fordelinger, og det er, hvad Dirichlet er. Her, i forbindelse med emne-modellering, er Dirichlet fordelingen af emner i dokumenter og fordelingen af ord i emnet. Det er måske ikke særlig klart på dette tidspunkt, men det er fint nok, da vi vil se nærmere på det om lidt.
Allokering: Det betyder, at når vi har Dirichlet, vil vi allokere emner til dokumenterne og ord i dokumentet til emner.
Det er det hele. Dette er, hvad LDA er i en nøddeskal. Lad os nu forstå, hvordan det fungerer i topicmodellering.
For at opsummere er det, som LDA siger, at hvert ord i hvert dokument kommer fra et emne, og at emnet vælges fra en fordeling pr. dokument over emner. Så vi har to matricer:
1. ϴtd = P(t|d), som er sandsynlighedsfordelingen af emner i dokumenter
2. Фwt = P(w|t), som er sandsynlighedsfordelingen af ord i emner
Og vi kan sige, at sandsynligheden for et ord givet dokument i.e. P(w|d) er lig med:
hvor T er det samlede antal emner. Lad os også antage, at der er W antal ord i vores ordforråd for alle dokumenter.
Hvis vi antager betinget uafhængighed, kan vi sige, at
P(w|t,d) = P(w|t)
Og dermed er P(w|d) lig med:
Og for at knytte os tilbage til vores eksempel med terningerne kan vi sige, at hvert ord i fordelingen af ord i et emne svarer til en side af terningen, og vi har Dirichlet-parameteren til at kontrollere, om alle ord har samme sandsynlighed i et emne, eller om emnet vil have en ekstrem skævhed i retning af nogle ord. Samme intuition gælder for fordelingen af emner i et dokument.
Godt. Nu kommer den vigtige del. Hvordan lærer vi vægtene af disse to matricer?
Lad os til at begynde med tilfældigt tildele vægte til begge matricer og antage, at vores data er genereret som følger:
1. Vælg tilfældigt et emne fra fordelingen af emner i et dokument på grundlag af de tildelte vægte. Lad os sige, at vi i det foregående eksempel valgte pink emne
2. Vælg dernæst et tilfældigt ord ud fra fordelingen af ord for det valgte emne, og sæt det ind i dokumentet
3. Gentag dette trin for hele dokumentet
I denne proces, hvis vores gæt på vægtene er forkert, vil de faktiske data, som vi observerer, være meget usandsynlige under vores antagne vægte og datagenereringsproces. Lad os f.eks. sige, at vi har dokument D1, som består af følgende tekst:
“Qualcomm® Adreno™ 630 Visual Processing Subsystem featuring room-scale 6DoF with SLAM, Adreno Foveation”
og lad os sige, at vi tildeler høje vægte til emne T1, som har høje vægte for ord som Spoon, Plates, Onions osv. så vil vi se, at i betragtning af vores antagelse om, hvordan data genereres, er det meget usandsynligt, at T1 hører til D1 eller at disse ord hører til T1. Derfor er det, vi gør, at vi forsøger at maksimere sandsynligheden for vores data givet disse to matricer.
For at identificere de korrekte vægte vil vi bruge en algoritme kaldet Gibbs sampling. Lad os nu forstå, hvad Gibbs sampling er, og hvordan den fungerer i LDA.
Gibbs Sampling
Gibbs sampling er en algoritme til successiv sampling af betingede fordelinger af variabler, hvis fordeling over tilstande konvergerer mod den sande fordeling i det lange løb. Dette er et noget abstrakt begreb og kræver en god forståelse af Monte Carlo Markov-kæder og Bayes-sætningen. Disse begreber og matematikken bag dem er ret komplekse og ligger uden for rammerne af denne blog. Her vil jeg forsøge at give en intuition af, hvordan Gibbs Sampling fungerer til at identificere emner i dokumenterne.
Som jeg nævnte tidligere, vil vi til at begynde med antage, at vi kender ϴ- og Ф-matricerne. Det, vi nu vil gøre, er, at vi langsomt vil ændre disse matricer og nå frem til et svar, der maksimerer sandsynligheden for de data, vi har. Vi vil gøre dette ord for ord ved at ændre emnetilknytningen for et enkelt ord. Vi antager, at vi ikke kender det givne ords emnetildeling, men vi kender tildelingen af alle andre ord i teksten, og vi vil forsøge at udlede, hvilket emne der vil blive tildelt dette ord.
Hvis vi ser på dette på matematisk vis, er det, vi gør, at vi forsøger at finde den betingede sandsynlighedsfordeling af et enkelt ords emnetildeling betinget af resten af emnetildelingerne. Hvis vi ser bort fra alle de matematiske beregninger, får vi en betinget sandsynlighedsligning, der ser således ud for et enkelt ord w i dokument d, der hører til emne k:
hvor:
n(d,k): Antal gange dokument d bruger emne k
v(k,w): Antal gange dokument d bruger emne k
v(k,w): Antal gange emne k bruger det givne ord
αk: Dirichlet-parameter for dokument til emnefordeling
λw: Dirichlet-parameter for fordelingen mellem emne og ord
Der er to dele to denne ligning. Den første del fortæller os, hvor meget hvert emne er til stede i et dokument, og den anden del fortæller, hvor meget hvert emne kan lide et ord. Bemærk, at vi for hvert ord får en vektor af sandsynligheder, der forklarer, hvor sandsynligt det er, at dette ord tilhører hvert af emnerne. I ovenstående ligning kan det ses, at Dirichlet-parametrene også fungerer som udjævningsparametre, når n(d,k) eller v(k,w) er nul, hvilket betyder, at der stadig vil være en vis chance for, at ordet vil vælge et emne fremadrettet.
Lad os nu gennemgå et eksempel:
Til at begynde med antager vi, at vi har et dokument med nogle tilfældige ords emnetildeling, for eksempel som vist nedenfor:
Vi har også vores tællematrix v(k,w), som vist nedenfor:
Nu skal vi ændre tilknytningen af ordet world i dokumentet.
- Først vil vi reducere antallet af world i emne 1 fra 28 til 27, da vi ikke ved, hvilket emne world hører til.
- For det andet lader vi os repræsentere matrixen n(d,k) på følgende måde for at vise, hvor meget et dokument bruger hvert emne
– For det tredje, lad os repræsentere v(k,w) på følgende måde for at vise, hvor mange gange hvert emne er tildelt dette ord
- For det fjerde, vil vi gange disse to matricer for at få vores betingede sandsynligheder
- Sidst vil vi tilfældigt vælge et af emnerne og vil tildele dette emne til verden, og vi vil gentage disse trin for alle andre ord også. Intuitivt set bør det emne med den højeste betingede sandsynlighed vælges, men som vi kan se, har andre emner også en vis chance for at blive valgt
Det er det hele. Dette er hvad Gibbs sampling-algoritmen gør under motorhjelmen. Selv om vi sprang over nogle detaljer som hyperparameterafstemning, men ud fra et intuitivt perspektiv er dette, hvordan Gibbs sampling fungerer til emne-modellering.
Så, dette er det for teorien om Latent Dirichlet Allocation. Jeg håber, at dette var nyttigt for forståelsen af, hvad topic modellering er, og hvordan vi bruger LDA med Gibbs til topic modellering. I den næste artikel vil jeg sende implementeringen af LDA ved hjælp af Python.
Tak!