Kaip mes pakeitėme neprižiūrimą LDA į pusiau prižiūrimą LDA

Tai pasakojimas apie tai, kaip ir kodėl mes turėjome parašyti savo formą „Latent Dirichlet Allocation“ (LDA). Taip pat kalbu apie tai, kodėl mums reikėjo sukurti „Guided Topic Model“ („GuidedLDA“), ir apie „GitHub“ atviro šaltinio procesą.

Kas yra LDA (temų modeliavimas)?

Leiskite pasakyti, kad turite rinkinį naujienų straipsnių, kurie buvo dokumentai. Skaitydami tuos straipsnius galėsite sužinoti, ar jie susiję su sportu, politika ar mokslu.

Dėl šių pavadinimų sutiksite, kad 1 ir 5 yra apie politiką, 2 ir 4 - apie sportą, 3 ir 6 - apie mokslą:

Žmogui nėra iššūkis išsiaiškinti, kuriai temai priklauso naujienų straipsnis. Bet kaip mes galime išmokyti kompiuterį suprasti tas pačias temas?

Čia atsiranda temų modeliavimas. Temų modeliavimas yra neprižiūrima mašininio mokymosi algoritmų klasė. Šie modeliai paprastai sugeba sugrupuoti žodžius į temas. LDA yra populiariausia temų modeliavimo technika.

Kai žodžiai bus sugrupuoti į temas, dabar galime pamatyti, apie kurią žodžių grupę kalbama naujienų straipsniuose ir dokumentuose. Tada galime jį suskirstyti į tą grupę ar temą.

Kaip matome, šiame naujame naujienų straipsnyje kalbama apie Nobelio premiją . Dabar galime nuspėti, kad šiame dokumente kalbama mokslo tema.

Pastaba : žodžiai nėra grupuojami tiesiai į temas. Veikiau apskaičiuojama tikimybė, pvz., „Kokia yra žodžio, priklausančio temai, tikimybė?“.

Tai suteikia p (t | w). Arba tikimybė temą t suteikta žodį W . Jo esmė yra tik Bayesian_probability.

Mielai apie tai pakalbėčiau daugiau, bet nenoriu nukrypti nuo pagrindinės problemos. Jei jus domina, galite apie tai daugiau sužinoti čia.

Taigi, kas yra vadovaujama LDA?

Temų modeliavimas paprastai yra neprižiūrimas mokymosi algoritmas. Mes žinome tą kosmosą ir technikąyra atskiros temos. Bet jei negausime daug straipsnių apie juos arba jei jie bus minimi kartu, jie gali būti suskirstyti į vieną temą.

Neseniai susidūriau su panašia problema. Aš dirbu duomenų mokslininku „Belong.co“ ir „Natural Language Processing“ yra pusė mano darbo. Neseniai atlikau LDA temos modeliavimą pagal mūsų duomenų korpusą. Dauguma temų pasirodė taip, kaip tikėjausi. Tačiau kai kurios temos nebuvo prasmingos.

Pora temų sutapo, o kai kurių, kurių tikėjausi pasirodyti, nebuvo. Kažkas tokio įvyko, „Space“ ir „Tech“ susijungė.

Prižiūrimo mokymosi algoritme galite grįžti ir derinti, kur suklydote priimant sprendimus. Galbūt jums reikėjo daugiau funkcijų. Arba daugiau treniruočių duomenų. O gal geresnė nuostolių funkcija, metrika ir atranka.

Bet nuo ko pradėti, kai modelis neprižiūrimas? Mes nusprendėme derinti ...

Mes nustatėme, kad temos, kurios buvo derinamos kartu, neturėjo pakankamai dokumentų, kad išsiskirtų.

Mes nusprendėme pasakyti modeliui, kad „Space“ ir „Tech“ būtų atskirai. Idėja buvo nustatyti keletą pagrindinių žodžių kosmosui ir keletą pradinių žodžių „Tech“. Tada vadovaukitės modeliu, kad sutaptų su šiomis sąlygomis.

Tai buvo paprasta ir intuityvi idėja, tačiau nepavyko rasti „GuidedLDA“ įgyvendinimo. Buvo labai nedaug dokumentų, kuriuose kalbėta apie vadovavimą LDA.

Mes paminėjome Jagadeesho Jagarlamudi, Hal Daume III ir Raghavendra Udupa pranešimą „Leksinių kunigų įtraukimas į teminius modelius“. Straipsnyje kalbama apie tai, kaip priors (šiuo atveju priors reiškia sėjamus žodžius) galima nustatyti pagal modelį, kuris jį nukreiptų tam tikra linkme. Mes šiek tiek įsigilinsime į detales.

Kai atlikome tuos pakeitimus, modelis suartėjo taip, kaip norėjome mes.

Taigi, kaip mes pakeitėme LDA į „GuidedLDA“?

Norėdami paaiškinti šią dalį, turėsime išsiaiškinti, kaip veikia LDA. Pasistengsiu, kad viskas būtų paprasta. Jei nenorite į tai patekti, galite pereiti į skyrių „ Naudojant„ GuidedLDA ““ .

Kaip veikia įprastas LDA, pirmiausia kiekvienas žodis atsitiktinai priskiriamas temai. Šį inicijavimą galima valdyti Dirichlet priors naudojant „Alpha“ parametrą. Štai kur LDA („Latent Dirichlet Allocation“) gauna savo pavadinimą. Šis atsitiktinumas gali būti vienodas inicijavimas, jei alfa yra didelė, arba iškreiptas inicijavimas, kai alfa yra maža. Kol kas pradėkime vienodą inicijavimą.

Kitas žingsnis - išsiaiškinti, kuris terminas priklauso kuriai temai. Tai yra temų modeliavimo algoritmo dalis. LDA laikosi labai paprasto požiūrio, ieškodama temos vienam terminui vienu metu.

Tarkime, kad norite rasti „ mėlynosios kilmės “ termino temą . LDA pirmiausia manys, kad kas antras korpuso terminas priskiriamas tinkamai temai. Paskutiniame etape mes vienodai paskirstėme kiekvieną terminą visose temose, todėl manysime, kad tai yra teisinga tų terminų tema.

Tada mes apskaičiuojame, kurie terminai „ Blue Origin“ dažnai būna. Tada tai yra labiausiai paplitusi tema tarp tų terminų. Šiai temai priskirsime „ Blue Origin“ .

„Blue Origin “ tikriausiai artės prie bet kurios „ SpaceX“ ir NASA temos . Dabar matote, kad NASA , „ SpaceX“ ir „ Blue Origin“ yra šiek tiek arčiau viena kitos nei buvo prieš šį žingsnį. Tada pereisime prie kito termino ir pakartosime procesą. Pakartosime visą šį procesą tiek kartų, kiek reikia, kad modelis suartėtų.

Tai bus tokia formulė:

ProbabilityBlue Origin“, kad tilptų į temą Z{0,1,2, ..}, kai ji įvyksta a, documentyra lygi „ Blue Origin “ priskyrimo temai kartų Zpadaugintai iš kitų wordsto dokumento, kuriam jau priklauso, skaičiaus Z, padalinto iš viso, kiek kartų žodis priskiriamas temai Z.

Štai tikroji formulė:

Kiekvienam dokumentui ( D) ir kiekvienam to dokumento žodžiui ( W) apskaičiuosime to žodžio, priklausančio kiekvienai temai, tikimybę ( Z) .

for d in all_documents_D: for w in all_words_W_in_d: for z in all_topics_Z: w_in_z = count(across all documents w belongs to z) d_in_z = count(in d all words that belong to z) tokens_in_z = count(all assignments in z) p(z| w, d) = w_in_z * d_in_z / tokens_in_z # so w belong to max p(z) # whichever topic the probability was maximum for w w_z = max(p(z| w, d))

The initial results will be wrong. But we will run this entire process multiple times and with each iteration they will get better. Over time they will converge to form word topic distribution.

What changes when we seed the documents?

Say we want to seed SpaceX, NASAto converge towards topic_0. During initialization we can give some extra boost to SpaceXand NASA to lie in this specific topic.

We can control this parameter of how much extra boost should be given to a term. In our algorithm we call it seed_confidence and it can range between 0 and 1. With a seed_confidence of 0.1 you can bias the seeded words by 10% more towards the seeded topics.

In the above shown initialization, NASA and SpaceX are being seeded for Topic_0, Apple and Google for Topic_1, and Physics and Chemistry for Topic_2.

Now when we run the above process we will have higher count for seeded words belonging to the seeded topics. The formula will remain the same for GuidedLDA and the convergence will change towards the seeded topics.

# for seeded words belonging to seeded topics# this count will be higher now for seeded z.
w_in_z = count(across all documents w belongs to z)
# Thus probability of p belonging to seeded z will be higher
p(z| w, d) ∝ w_in_z

Hence guiding the LDA. Or GuidedLDA.

We tried a lot of different approaches before finally making this one work.

Using GuidedLDA

GuidedLDA is a python library that I have open sourced on GitHub repo.

You can install it with a simple pip install:

pip install guidedlda

The code to use it is fairly simple. Create a dictionary for seed_topics with word_id to topic_id map. And pass it to the model.fit() method.

  1. seed_confidence can vary between 0 to 1.
  2. seed_topicsyra žodynas { word_idto topic_id}
  3. X yra dokumento termino matrica.
seed_topics = { 'NASA': 0, 'SpaceX': 0, 'Apple': 1, 'Google': 1, 'Physics': 2, 'Chemistry': 2,}model.fit(X, seed_topics=seed_topics, seed_confidence=0.15).

Čia pateikiama „GuidedLDA“ dokumentacija.

Kreditai

Didžioji kodo dalis yra pasiskolinta iš python LDA bibliotekos.

Didžiulis šauksmas tos bibliotekos autoriams: Allenui Riddelliui ir Timui Hopperiui.

Ypatingas ačiū Vinodhui Ravindranathui, kuris mane konsultavo viso projekto metu.

Naudodamiesi „GuidedLDA“, mes galėjome išskirti temas, kurių korpusas buvo mažesnis, ir vadovautis dokumentų klasifikavimu.

Su šiuo modeliu matėme sėkmę gamyboje. Tačiau vis tiek algoritmas ir jo įgyvendinimas yra ankstyvoje stadijoje. Prašome išbandyti ir pasidalinti mintimis, eksperimentais ir rezultatais. Norėčiau išgirsti iš jūsų.