Ankur Tomar

Follow

Nov 25, 2018 – 9 min read

Credits: Christine Doig

Hej alla. Det var länge sedan jag skrev min senaste blogg om de olika typerna av rekommendationssystem. Den här gången kommer jag att skriva om Topic Modelling.

Det finns många källor där ute där du kan lära dig vad Topic Modelling är, men jag tror att de flesta av dem är något tekniska och kräver goda kunskaper i matematik och andra tekniker som Markov Chains. I den här artikeln kommer jag att försöka förklara idén bakom Topic Modelling på ett mycket intuitivt sätt med ett minimum av matematik och teknikaliteter. Jag kommer att skriva artikeln i två delar. I den första delen kommer jag att försöka förklara vad ämnesmodellering är och i den andra delen kommer jag att ge en python-handledning om hur man gör ämnesmodellering på ett verkligt dataset.

Förut vill jag erkänna att den här artikeln är starkt inspirerad av föreläsningen från min professor i utforskande dataanalys. Edward McFowland, Courseras kurs i Natural Language Processing av Higher School of Economics och Jordan Boyd-Grabers förklaring av Gibbs sampling.

Vad är topic modeling?

Topic modeling är en gren av oövervakad naturlig språkbehandling som används för att representera ett textdokument med hjälp av flera ämnen, som bäst kan förklara den underliggande informationen i ett visst dokument. Man kan tänka sig detta i termer av klusterindelning, men med en skillnad. Nu har vi istället för numeriska funktioner en samling ord som vi vill gruppera på ett sådant sätt att varje grupp representerar ett ämne i ett dokument.

Varför behöver vi topic modeling?

Okej, så nu uppstår frågan varför behöver vi topic modeling? Om vi ser oss omkring kan vi se en enorm mängd textdata som ligger omkring oss i ett ostrukturerat format i form av nyhetsartiklar, forskningsrapporter, inlägg i sociala medier etc. och vi behöver ett sätt att förstå, organisera och märka dessa data för att kunna fatta välgrundade beslut. Ämnesmodellering används i olika tillämpningar, t.ex. för att hitta frågor på stack overflow som liknar varandra, för att samla och analysera nyhetsflöden, för att rekommendera system osv. Alla dessa fokuserar på att hitta den dolda tematiska strukturen i texten, eftersom man tror att varje text som vi skriver, oavsett om det är en tweet, ett inlägg eller en forskningsrapport, består av teman som sport, fysik, rymd etc.

Hur gör man topic modeling?

För närvarande finns det många sätt att göra topic modeling, men i det här inlägget kommer vi att diskutera ett probabilistiskt modelleringssätt som kallas Latent Dirichlet Allocation (LDA) och som utvecklades av professor David M. Blei 2003. Detta är en förlängning av Probabilistic Latent Semantic Analysis (PLSA) som utvecklades 1999 av Thomas Hoffman med en mycket liten skillnad i fråga om hur de behandlar distribution per dokument. Så låt oss hoppa direkt in på hur LDA fungerar.

Latent Dirichlet Allocation

Låt oss börja med att förstå innebörden av varje ord i titeln, eftersom jag tror att det innehåller allt vi behöver veta för att förstå hur LDA fungerar.

Latent: Detta avser allt som vi inte vet a priori och som är dolt i data. Här är de teman eller ämnen som dokumentet består av okända, men de antas vara närvarande eftersom texten genereras utifrån dessa ämnen.

Dirichlet: Det är en ”fördelning av fördelningar”. Ja, du läste rätt. Men vad betyder detta? Låt oss fundera på detta med hjälp av ett exempel. Låt oss anta att det finns en maskin som tillverkar tärningar och att vi kan kontrollera om maskinen alltid kommer att producera en tärning med lika stor vikt för alla sidor, eller om det kommer att finnas någon bias för vissa sidor. Maskinen som producerar tärningar är alltså en fördelning eftersom den producerar tärningar av olika slag. Vi vet också att själva tärningen är en fördelning eftersom vi får flera värden när vi kastar en tärning. Detta är vad det innebär att vara en fördelning av fördelningar och detta är vad Dirichlet är. Här, i samband med ämnesmodellering, är Dirichlet fördelningen av ämnen i dokument och fördelningen av ord i ämnet. Det kanske inte är så tydligt just nu, men det är okej eftersom vi kommer att titta närmare på det om en stund.

Allokering: Detta innebär att när vi väl har Dirichlet kommer vi att allokera ämnen till dokumenten och ord i dokumentet till ämnen.

Det är allt. Detta är vad LDA är i ett nötskal. Låt oss nu förstå hur detta fungerar i topic modeling.

För att sammanfatta är det som LDA säger att varje ord i varje dokument kommer från ett ämne och ämnet väljs från en fördelning per dokument över ämnen. Vi har alltså två matriser:

1. ϴtd = P(t|d) som är sannolikhetsfördelningen av ämnen i dokument

2. Фwt = P(w|t) som är sannolikhetsfördelningen av ord i ämnen

Och vi kan säga att sannolikheten för ett ord givet dokument i.e. P(w|d) är lika med:

där T är det totala antalet ämnen. Låt oss också anta att det finns W antal ord i vårt ordförråd för alla dokument.

Om vi antar villkorligt oberoende kan vi säga att

P(w|t,d) = P(w|t)

Och därmed är P(w|d) lika med:

som är punktprodukten av ϴtd och Фwt för varje ämne t.

Detta kan representeras i form av en matris så här:

Kredit: När vi tittar på detta kan vi tänka oss att LDA liknar matrisfaktorisering eller SVD, där vi dekomponerar sannolikhetsfördelningsmatrisen för ett ord i ett dokument i två matriser som består av fördelningen av ett ämne i ett dokument och fördelningen av ord i ett ämne.

Det vi får fram är till exempel detta:

Credit: David M. Blei

Och för att återknyta till vårt exempel med tärningar kan vi säga att varje ord i fördelningen av ord i ett ämne liknar en sida av tärningen, och vi har Dirichlet-parametern för att kontrollera om alla ord har samma sannolikhet i ett ämne eller om ämnet kommer att ha en extrem förskjutning mot vissa ord. Samma intuition gäller för fördelningen av ämnen i ett dokument.

Godt. Nu kommer den viktiga delen. Hur lär vi oss vikterna för dessa två matriser?

För att börja med, låt oss slumpmässigt tilldela vikter till båda matriserna och anta att våra data genereras enligt följande steg:

1. Välj slumpmässigt ett ämne från fördelningen av ämnen i ett dokument baserat på deras tilldelade vikter. I det tidigare exemplet, låt oss säga att vi valde rosa ämne

2. Därefter, baserat på fördelningen av ord för det valda ämnet, välj ett slumpmässigt ord och placera det i dokumentet

3. Upprepa det här steget för hela dokumentet

I den här processen, om vår gissning av vikterna är felaktig, kommer de faktiska data som vi observerar att vara mycket osannolika enligt våra antagna vikter och process för att generera data. Låt oss till exempel säga att vi har dokument D1 som består av följande text:

”Qualcomm® Adreno™ 630 Visual Processing Subsystem featuring room-scale 6DoF with SLAM, Adreno Foveation”

och låt oss säga att vi tilldelar höga vikter till ämnet T1 som har höga vikter för ord som Spoon, Plates, Onions etc. Då kommer vi att se att med tanke på vårt antagande om hur data genereras, så är det mycket osannolikt att T1 hör till D1 eller att dessa ord hör till T1. Vad vi gör är därför att vi försöker maximera sannolikheten för våra data givet dessa två matriser.

För att identifiera de korrekta vikterna kommer vi att använda en algoritm som kallas Gibbs sampling. Låt oss nu förstå vad Gibbs sampling är och hur den fungerar i LDA.

Gibbs sampling

Gibbs sampling är en algoritm för successivt sampling av betingade fördelningar av variabler, vars fördelning över tillstånden konvergerar mot den sanna fördelningen på lång sikt. Detta är ett något abstrakt begrepp och kräver en god förståelse för Monte Carlo Markov-kedjor och Bayes-satsen. Dessa begrepp och matematiken bakom dem är ganska komplexa och ligger utanför ramen för den här bloggen. Här ska jag försöka ge en intuition om hur Gibbs Sampling fungerar för att identifiera ämnen i dokumenten.

Som jag nämnde tidigare kommer vi till att börja med att anta att vi känner till ϴ- och Ф-matriserna. Vad vi nu kommer att göra är att vi långsamt ändrar dessa matriser och kommer fram till ett svar som maximerar sannolikheten för de data vi har. Vi kommer att göra detta ord för ord genom att ändra ämnestilldelningen för ett ord. Vi kommer att anta att vi inte känner till ämnestilldelningen för det givna ordet men att vi känner till tilldelningen för alla andra ord i texten och vi kommer att försöka härleda vilket ämne som kommer att tilldelas detta ord.

Om vi ser på detta på ett matematiskt sätt är det vi gör att vi försöker hitta en villkorlig sannolikhetsfördelning för ett enskilt ords ämnestilldelning som är villkorad av resten av ämnestilldelningarna. Om vi bortser från alla matematiska beräkningar får vi en betingad sannolikhetsekvation som ser ut så här för ett enskilt ord w i dokument d som tillhör ämne k:

Credit: Jordan Boyd-Graber

här:

n(d,k): Antal gånger dokument d använder ämne k

v(k,w): Antal gånger dokument d använder ämne k

v(k,w): Antal gånger dokument d använder ämne k: Antal gånger ämne k använder det givna ordet

αk: Dirichlet-parameter för fördelningen mellan dokument och ämne

λw: Dirichlet-parameter för fördelningen mellan ämne och ord

Det finns två delar två denna ekvation. Den första delen talar om hur mycket varje ämne förekommer i ett dokument och den andra delen talar om hur mycket varje ämne gillar ett ord. Observera att vi för varje ord får en vektor av sannolikheter som förklarar hur troligt det är att ordet hör till varje ämne. I ekvationen ovan kan man se att Dirichlet-parametrarna också fungerar som utjämningsparametrar när n(d,k) eller v(k,w) är noll, vilket innebär att det fortfarande finns en viss chans att ordet kommer att välja ett ämne framöver.

Låt oss gå igenom ett exempel nu:

För att börja antar vi att vi har ett dokument med en slumpmässig ämnestilldelning av ord, till exempel enligt nedan:

Vi har också vår räkningsmatris v(k,w) som visas nedan:

Nu ändrar vi tilldelningen av ordet world i dokumentet.

  • Först kommer vi att minska antalet värld i ämne 1 från 28 till 27 eftersom vi inte vet vilket ämne värld tillhör.
  • För det andra ska vi representera matrisen n(d,k) på följande sätt för att visa hur mycket ett dokument använder varje ämne

– Tredje, Låt oss representera v(k,w) på följande sätt för att visa hur många gånger varje ämne tilldelas detta ord

  • Fjärde, multiplicerar vi dessa två matriser för att få våra villkorliga sannolikheter

  • Slutligt väljer vi slumpmässigt ut något av ämnena och tilldelar det ämnet till världen, och vi upprepar dessa steg för alla andra ord också. Intuitivt bör det ämne som har högst villkorad sannolikhet väljas, men som vi kan se har andra ämnen också en viss chans att väljas

Det var allt. Detta är vad Gibbs sampling-algoritmen gör under huven. Även om vi hoppade över vissa detaljer som hyperparameteravstämning, men ur ett intuitivt perspektiv är detta hur Gibbs sampling fungerar för ämnesmodellering.

Så, detta är allt för teorin om Latent Dirichlet Allocation. Jag hoppas att detta var till hjälp för att förstå vad ämnesmodellering är och hur vi använder LDA med Gibbs för ämnesmodellering. I nästa artikel kommer jag att publicera implementeringen av LDA med hjälp av Python.

Tack!

admin

Lämna ett svar

Din e-postadress kommer inte publiceras.

lg