Gensim - Tworzenie modelu młotka LDA
W tym rozdziale wyjaśniono, czym jest model młotka utajonego alokacji Dirichleta (LDA) i jak go stworzyć w Gensim.
W poprzedniej sekcji zaimplementowaliśmy model LDA i pobraliśmy tematy z dokumentów ze zbioru danych 20Newsgroup. To była wbudowana wersja algorytmu LDA firmy Gensim. Istnieje również wersja Mallet Gensim, która zapewnia lepszą jakość tematów. Tutaj zastosujemy LDA Malleta na poprzednim przykładzie, który już zaimplementowaliśmy.
Co to jest model młotka LDA?
Mallet, zestaw narzędzi open source, został napisany przez Andrew McCulluma. Jest to w zasadzie pakiet oparty na Javie, który jest używany do NLP, klasyfikacji dokumentów, klastrowania, modelowania tematów i wielu innych aplikacji do uczenia maszynowego do tekstu. Dostarcza nam zestaw narzędzi Mallet Topic Modeling, który zawiera wydajne, oparte na próbkowaniu implementacje LDA oraz Hierarchical LDA.
Mallet2.0 to aktualne wydanie MALLET, zestawu narzędzi do modelowania tematów w języku Java. Zanim zaczniemy go używać z Gensim dla LDA, musimy pobrać pakiet mallet-2.0.8.zip w naszym systemie i rozpakować go. Po zainstalowaniu i rozpakowaniu, ustaw zmienną środowiskową% MALLET_HOME% tak, aby wskazywała na katalog MALLET ręcznie lub za pomocą kodu, który będziemy dostarczać, podczas wdrażania LDA z Malletem.
Gensim Wrapper
Python zapewnia opakowanie Gensim dla Latent Dirichlet Allocation (LDA). Składnia tego opakowania togensim.models.wrappers.LdaMallet. Moduł ten, zwinięty próbkowanie Gibbsa z MALLET, umożliwia oszacowanie modelu LDA na podstawie korpusu szkoleniowego i wnioskowanie o rozkładzie tematów na nowych, niewidocznych dokumentach.
Przykład implementacji
Będziemy używać LDA Mallet na wcześniej zbudowanym modelu LDA i sprawdzimy różnicę w wydajności, obliczając wynik koherencji.
Zapewnienie ścieżki do pliku Mallet
Przed zastosowaniem modelu Mallet LDA w naszym korpusie zbudowanym w poprzednim przykładzie, musimy zaktualizować zmienne środowiskowe i podać ścieżkę do pliku Mallet. Można to zrobić za pomocą następującego kodu -
import os
from gensim.models.wrappers import LdaMallet
os.environ.update({'MALLET_HOME':r'C:/mallet-2.0.8/'})
#You should update this path as per the path of Mallet directory on your system.
mallet_path = r'C:/mallet-2.0.8/bin/mallet'
#You should update this path as per the path of Mallet directory on your system.
Gdy już podaliśmy ścieżkę do pliku Malleta, możemy go teraz użyć w korpusie. Można to zrobić za pomocąldamallet.show_topics() działają w następujący sposób -
ldamallet = gensim.models.wrappers.LdaMallet(
mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))
Wynik
[
(4,
[('gun', 0.024546225966016102),
('law', 0.02181426826996709),
('state', 0.017633545129043606),
('people', 0.017612848479831116),
('case', 0.011341763768445888),
('crime', 0.010596684396796159),
('weapon', 0.00985160502514643),
('person', 0.008671896020034356),
('firearm', 0.00838214293105946),
('police', 0.008257963035784506)]),
(9,
[('make', 0.02147966482730431),
('people', 0.021377478029838543),
('work', 0.018557122419783363),
('money', 0.016676885346413244),
('year', 0.015982015123646026),
('job', 0.012221540976905783),
('pay', 0.010239117106069897),
('time', 0.008910688739014919),
('school', 0.0079092581238504),
('support', 0.007357449417535254)]),
(14,
[('power', 0.018428398507941996),
('line', 0.013784244460364121),
('high', 0.01183271164249895),
('work', 0.011560979224821522),
('ground', 0.010770484918850819),
('current', 0.010745781971789235),
('wire', 0.008399002000938712),
('low', 0.008053160742076529),
('water', 0.006966231071366814),
('run', 0.006892122230182061)]),
(0,
[('people', 0.025218349201353372),
('kill', 0.01500904870564167),
('child', 0.013612400660948935),
('armenian', 0.010307655991816822),
('woman', 0.010287984892595798),
('start', 0.01003226060272248),
('day', 0.00967818081674404),
('happen', 0.009383114328428673),
('leave', 0.009383114328428673),
('fire', 0.009009363443229208)]),
(1,
[('file', 0.030686386604212003),
('program', 0.02227713642901929),
('window', 0.01945561169918489),
('set', 0.015914874783314277),
('line', 0.013831003577619592),
('display', 0.013794120901412606),
('application', 0.012576992586582082),
('entry', 0.009275993066056873),
('change', 0.00872275292295209),
('color', 0.008612104894331132)]),
(12,
[('line', 0.07153810971508515),
('buy', 0.02975597944523662),
('organization', 0.026877236406682988),
('host', 0.025451316957679788),
('price', 0.025182275552207485),
('sell', 0.02461728860071565),
('mail', 0.02192687454599263),
('good', 0.018967419085797303),
('sale', 0.017998870026097017),
('send', 0.013694207538540181)]),
(11,
[('thing', 0.04901329901329901),
('good', 0.0376018876018876),
('make', 0.03393393393393394),
('time', 0.03326898326898327),
('bad', 0.02664092664092664),
('happen', 0.017696267696267698),
('hear', 0.015615615615615615),
('problem', 0.015465465465465466),
('back', 0.015143715143715144),
('lot', 0.01495066495066495)]),
(18,
[('space', 0.020626317374284855),
('launch', 0.00965716006366413),
('system', 0.008560244332602057),
('project', 0.008173097603991913),
('time', 0.008108573149223556),
('cost', 0.007764442723792318),
('year', 0.0076784101174345075),
('earth', 0.007484836753129436),
('base', 0.0067535595990880545),
('large', 0.006689035144319697)]),
(5,
[('government', 0.01918437232469453),
('people', 0.01461203206475212),
('state', 0.011207097828624796),
('country', 0.010214802708381975),
('israeli', 0.010039691804809714),
('war', 0.009436532025838587),
('force', 0.00858043427504086),
('attack', 0.008424780138532182),
('land', 0.0076659662230523775),
('world', 0.0075103120865437)]),
(2,
[('car', 0.041091194044470564),
('bike', 0.015598981291017729),
('ride', 0.011019688510138114),
('drive', 0.010627877363110981),
('engine', 0.009403467528651191),
('speed', 0.008081104907434616),
('turn', 0.007738270153785875),
('back', 0.007738270153785875),
('front', 0.007468899990204721),
('big', 0.007370947203447938)])
]
Ocena wydajności
Teraz możemy również ocenić jego wydajność, obliczając wynik koherencji w następujący sposób -
ldamallet = gensim.models.wrappers.LdaMallet(
mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))
Wynik
Coherence Score: 0.5842762900901401