
Ez a történet arról, hogyan és miért kellett megírnunk a saját formáját a látens Dirichlet-allokációról (LDA). Beszélek arról is, hogy miért kellett felépítenünk egy irányított témamodellt (GuidedLDA), és a nyílt beszerzés folyamatáról a GitHubon.
Mi az LDA (témamodellezés)?
Mondjuk, hogy van egy sor hírcikked, amelyek dokumentumok voltak. Ezeket a cikkeket elolvasva megtudhatja, hogy a sportról, politikáról vagy a tudományról szólnak-e.
A következő címeknél egyetért abban, hogy az 1. és az 5. a politikáról, a 2. és a 4. a sportról, a 3. és a 6. a tudományról szól:

Egy ember számára nem kihívás kitalálni, hogy egy hírcikk melyik témához tartozik. De hogyan taníthatjuk meg a számítógépet ugyanazok a témák megértésére?
Itt jön létre a téma modellezése. A témamodellezés a gépi tanulási algoritmusok felügyelet nélküli osztálya. Ezek a modellek általában jól tudják a szavakat témákba csoportosítani. Az LDA a legnépszerűbb témamodellezési technika.

Miután a szavakat témák szerint csoportosítottuk, láthatjuk, hogy a hírcikkek és a dokumentumok mely szavakról beszélnek. Ezután besorolhatjuk abba a csoportba vagy témába.

Mint láthatjuk, ez az új hírcikk a Nobel-díjról szól . Most megjósolhatjuk, hogy ez a dokumentum a Science témáról szól.
Megjegyzés : A szavakat nem csoportosítják közvetlenül témákba. Inkább egy valószínűséget számolnak, például: „Mi a valószínűsége egy témához tartozó szónak?”.
Ez adott p (t | w). Vagy a t téma valószínűsége adott w szó . Lényegében csak a bayesi_probability.
Szívesen beszélnék erről többet, de nem akarok eltérni az alapvető problémától. Ha érdekel, itt olvashat erről bővebben.
Tehát mi az irányított LDA?
A témamodellezés általában felügyelet nélküli tanulási algoritmus. Ismerjük azt az űrt és a technikátsaját témák. De ha nem kapunk sok cikket róluk, vagy ha együtt említik őket, akkor egy témába sorolhatják őket.
Nemrégiben hasonló problémába ütköztem. Adatkutatóként dolgozom a Belong.co-nál, és a természetes nyelv feldolgozása munkám fele. Nemrégiben LDA téma modellezést végeztem az adatkorpuszunkon. A legtöbb téma akkor jelent meg, amikor számítottam rá. De néhány témának nem volt értelme.
Néhány téma átfedésben volt, és néhány olyan téma, amelyre számítottam, nem volt ott. Valami ilyesmi történt, a Space és a Tech összeolvadt.

Felügyelt tanulási algoritmusban visszamehet és hibakeresést végezhet ott, ahol tévedett a döntéshozatali folyamat során. Talán több funkcióra volt szüksége. Vagy több edzési adat. Vagy talán jobb veszteségfunkció, mutatók és mintavétel.
De hol kezdjük, amikor a modellt nem felügyelik? Úgy döntöttünk, hogy hibakeresést folytatunk ...

Megállapítottuk, hogy az összeolvadó témákban nem volt elég dokumentum ahhoz, hogy kitűnjön.

Úgy döntöttünk, hogy elmondjuk a modellnek, hogy az Space és a Tech legyen külön. Az ötlet az volt, hogy néhány kezdőszót állítsunk be a Space-hez, és néhány magszót a Tech-hez. Ezután vezesse a modellt, hogy közeledjen ezekhez a kifejezésekhez.

Egyszerű és intuitív ötlet volt, de nem találtuk a GuidedLDA megvalósítását. Nagyon kevés olyan cikk volt, amely az LDA irányításáról beszélt.
Hivatkoztunk Jagadeesh Jagarlamudi, Hal Daume III és Raghavendra Udupa dolgozatára, amely a Lexikai Priorokat Témamodellekbe foglalja. A cikk arról beszél, hogy a priorok (ebben az esetben a priors magozott szavakat jelentenek) hogyan állíthatók be a modellbe, hogy egy bizonyos irányba irányítsák. Kicsit belemerülünk a részletekbe.
Miután elvégeztük ezeket a változtatásokat, a modell összeforrt, ahogy szerettük volna.

Tehát hogyan változtattuk az LDA-t GuidedLDA-ra?
Ennek a résznek a magyarázatához be kell vennünk az LDA működésének részleteit. Igyekszem mindent megtenni az egyszerűség érdekében. Ha nem akar belemenni, ugorjon előre a GuidedLDA használata szakaszra.
A rendes LDA működésének módja, hogy először minden szót véletlenszerűen rendelünk hozzá egy témához. Ez az inicializálás a Dirichlet priors segítségével vezérelhető az Alpha paraméteren keresztül. Az LDA (Latent Dirichlet Allocation) nevet kapta. Ez a véletlenszerűség lehet egyenletes inicializálás, ha az alfa nagy, vagy ferde inicializálás, ha az alfa kicsi. Most folytassuk az egységes inicializálást.

A következő lépés annak kiderítése, melyik kifejezés melyik témához tartozik. Ez az algoritmus témamodellező része. Az LDA nagyon egyszerű megközelítést alkalmaz, ha egyszerre egy-egy kifejezésre keresi a témát.
Mondja el, hogy szeretne témát találni a Kék eredet kifejezéshez . Az LDA először azt feltételezi, hogy a korpuszban minden más kifejezés a megfelelő témához van rendelve. Az utolsó lépésben az egyes kifejezéseket egységesen osztottuk el az összes témában, ezért feltételezzük, hogy ez a helyes téma ezekhez a kifejezésekhez.
Ezután kiszámoljuk, hogy a Blue Origin mely kifejezésekkel jár gyakran. Akkor ez a kifejezés a leggyakoribb téma. A témához hozzárendeljük a Kék eredetet .
A Blue Origin valószínűleg a SpaceX és a NASA bármelyik témája közelében jár . Most már láthatja, hogy a NASA , a SpaceX és a Blue Origin alig áll közelebb egymáshoz, mint a lépés előtt. Ezután áttérünk a következő kifejezésre és megismételjük a folyamatot. Elég sokszor megismételjük ezt a folyamatot ahhoz, hogy a modell közeledjen.
Ennek képlete a következő lesz:
Probability
ha a kék eredet beilleszkedik a Z
{0,1,2, ..} témába , ha a-ban fordul elő, document
megegyezik a kék eredet témához Z
rendelésének számával, szorozva words
az adott dokumentumban már meglévő többi számmal Z
, osztva összesítve, hogy hány szó van hozzárendelve témához Z
.
Itt van a tényleges képlet:

Minden dokumentumhoz ( D
) és a dokumentum minden egyes szavához ( W
) kiszámítjuk annak valószínűségét, hogy az adott szó az egyes témákhoz tartozik ( 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))
A kezdeti eredmények rosszak lesznek. De ezt az egész folyamatot többször lefuttatjuk, és minden egyes iterációval jobbak lesznek. Idővel össze fognak állni, hogy szóterjesztést alkossanak.
Mi változik, amikor kivesszük a dokumentumokat?
Mondjuk, hogy be akarunk vetni magunkat SpaceX
, NASA
és felé akarunk közeledni topic_0
. Az inicializálás során adhatunk némi extra lendületet ennek a sajátos témának SpaceX
és NASA
hazudhatunk.
Ezt a paramétert ellenőrizhetjük, hogy mekkora extra lendületet kell adni egy kifejezésnek. Algoritmusunkban hívjuk, seed_confidence
és 0 és 1 között mozoghat. A seed_confidence
0,1-es értékkel 10% -kal jobban torzíthatja a beolvasott szavakat a beillesztett témák felé.

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.
seed_confidence
can vary between 0 to 1.seed_topics
is the dictionary {word_id
totopic_id
}X
is the document term matrix.
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).
Documentation for GuidedLDA is linked here.
Credits
A major part of the code is borrowed from python LDA library.
A huge shoutout to the authors of that library : Allen Riddell and Tim Hopper.
Special thanks to Vinodh Ravindranath, who mentored me throughout the project.
By using GuidedLDA we were able to separate out topics which had smaller representation in the corpus and guide the classification of documents.
We have seen success with this model in production. But still, the Algorithm and the implementation is at an early stage. We request you to try it out and share your thoughts, experiments and results. Would love to hear from you.