Gensim - Création d'un modèle de maillet LDA

Ce chapitre explique ce qu'est un modèle de maillet d'allocation de dirichlet latent (LDA) et comment le créer dans Gensim.

Dans la section précédente, nous avons implémenté le modèle LDA et récupérons les sujets à partir des documents de l'ensemble de données 20Newsgroup. C'était la version intégrée de Gensim de l'algorithme LDA. Il existe également une version Mallet de Gensim, qui offre une meilleure qualité des sujets. Ici, nous allons appliquer le LDA de Mallet sur l'exemple précédent que nous avons déjà implémenté.

Qu'est-ce que le modèle LDA Mallet?

Mallet, une boîte à outils open source, a été écrite par Andrew McCullum. Il s'agit essentiellement d'un package basé sur Java qui est utilisé pour la PNL, la classification de documents, la mise en cluster, la modélisation de sujets et de nombreuses autres applications d'apprentissage automatique en texte. Il nous fournit la boîte à outils Mallet Topic Modeling qui contient des implémentations efficaces et basées sur l'échantillonnage de LDA ainsi que de LDA hiérarchique.

Mallet2.0 est la version actuelle de MALLET, la boîte à outils de modélisation de sujets Java. Avant de commencer à l'utiliser avec Gensim pour LDA, nous devons télécharger le paquet mallet-2.0.8.zip sur notre système et le décompresser. Une fois installé et décompressé, définissez la variable d'environnement% MALLET_HOME% sur le point vers le répertoire MALLET soit manuellement, soit par le code que nous fournirons, lors de l'implémentation du LDA avec Mallet ensuite.

Emballeuse Gensim

Python fournit un wrapper Gensim pour l'allocation de dirichlets latents (LDA). La syntaxe de ce wrapper estgensim.models.wrappers.LdaMallet. Ce module, un échantillonnage de gibbs réduit de MALLET, permet l'estimation du modèle LDA à partir d'un corpus d'entraînement et l'inférence de la distribution des sujets sur de nouveaux documents invisibles.

Exemple d'implémentation

Nous utiliserons LDA Mallet sur un modèle LDA précédemment construit et vérifierons la différence de performance en calculant le score de Coherence.

Fournir le chemin vers le fichier Mallet

Avant d'appliquer le modèle Mallet LDA sur notre corpus construit dans l'exemple précédent, nous devons mettre à jour les variables d'environnement et fournir également le chemin du fichier Mallet. Cela peut être fait à l'aide du code suivant -

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.

Une fois que nous avons fourni le chemin d'accès au fichier Mallet, nous pouvons maintenant l'utiliser sur le corpus. Cela peut être fait avec l'aide deldamallet.show_topics() fonction comme suit -

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

Production

[
   (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)])
]

Évaluation des performances

Maintenant, nous pouvons également évaluer ses performances en calculant le score de cohérence comme suit -

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

Production

Coherence Score: 0.5842762900901401