Gensim - Creación del modelo de mazo LDA
Este capítulo explicará qué es un modelo de mazo de asignación de Dirichlet latente (LDA) y cómo crearlo en Gensim.
En la sección anterior hemos implementado el modelo LDA y obtenemos los temas de los documentos del conjunto de datos de 20Newsgroup. Esa era la versión incorporada de Gensim del algoritmo LDA. También hay una versión Mallet de Gensim, que proporciona una mejor calidad de los temas. Aquí, vamos a aplicar LDA de Mallet en el ejemplo anterior que ya hemos implementado.
¿Qué es el modelo LDA Mallet?
Mallet, un conjunto de herramientas de código abierto, fue escrito por Andrew McCullum. Básicamente es un paquete basado en Java que se utiliza para NLP, clasificación de documentos, agrupamiento, modelado de temas y muchas otras aplicaciones de aprendizaje automático para texto. Nos proporciona el kit de herramientas de modelado de temas de Mallet que contiene implementaciones eficientes y basadas en muestras de LDA, así como LDA jerárquico.
Mallet2.0 es la versión actual de MALLET, el kit de herramientas de modelado de temas de Java. Antes de comenzar a usarlo con Gensim para LDA, debemos descargar el paquete mallet-2.0.8.zip en nuestro sistema y descomprimirlo. Una vez instalado y descomprimido, establezca la variable de entorno% MALLET_HOME% para que apunte al directorio MALLET ya sea manualmente o por el código que le proporcionaremos, mientras implementamos el LDA con Mallet a continuación.
Envoltorio Gensim
Python proporciona un contenedor Gensim para la asignación de Dirichlet latente (LDA). La sintaxis de ese contenedor esgensim.models.wrappers.LdaMallet. Este módulo, muestreo de Gibbs contraído de MALLET, permite la estimación del modelo LDA a partir de un corpus de capacitación y la inferencia de la distribución de temas en documentos nuevos y no vistos también.
Ejemplo de implementación
Usaremos LDA Mallet en un modelo LDA construido previamente y verificaremos la diferencia en el rendimiento calculando la puntuación de coherencia.
Proporcionar ruta al archivo Mallet
Antes de aplicar el modelo Mallet LDA en nuestro corpus construido en el ejemplo anterior, debemos tener que actualizar las variables de entorno y proporcionar la ruta del archivo Mallet también. Se puede hacer con la ayuda del siguiente código:
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.
Una vez que proporcionamos la ruta al archivo Mallet, ahora podemos usarlo en el corpus. Se puede hacer con la ayuda deldamallet.show_topics() funciona de la siguiente manera:
ldamallet = gensim.models.wrappers.LdaMallet(
mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))
Salida
[
(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)])
]
Evaluación del desempeño
Ahora también podemos evaluar su desempeño calculando la puntuación de coherencia de la siguiente manera:
ldamallet = gensim.models.wrappers.LdaMallet(
mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))
Salida
Coherence Score: 0.5842762900901401