Obtener el número óptimo de topics en un topic modeling

Autor: | Última modificación: 12 de abril de 2024 | Tiempo de Lectura: 3 minutos
Temas en este post: ,

Algunos de nuestros reconocimientos:

Premios KeepCoding

En un post anterior vimos cómo entrenar un modelo LDA por medio de un ejercicio de topic modeling, donde separamos un dataset en temáticas por medio de los topics. Ahora, en este artículo, veremos cómo obtener el número óptimo de topics en un topic modeling.

Para optimizar el número de topics, un punto muy importante. Podemos hacerlo de forma empírica o manual, probando nosotros a mano y haciendo una evaluación a partir de nuestro criterio personal de por que n es el número óptimo de topics y por qué no incrementarlo o disminuirlo. No obstante, también podemos emplear una optimización para obtener el número óptimo de topics en un topic modeling. Veamos cómo hacemos esto.

Obtener el número óptimo de topics en un topic modeling

Para hacer esto debemos utilizar alguna métrica. En este caso, vamos a emplear la coherencia de modelo. Vamos a calcular n modelos con diferentes números de topics y vamos a evaluar la métrica de coherencia para cada uno de ellos.

Entonces, la métrica de coherencia que mejor resultado nos dé relacionará el mejor número de topics que debemos usar.

Aquí hemos creado una función denominada compute coherence values y le daremos como parámetros el diccionario, el corpus y los textos. También le vamos a pasar cuál es número límite de temas que queremos probar y vamos a decirle que empiece con un mínimo en dos topics y que va a saltar de 3 en 3, es decir, primero va a probar con 2, luego con 5, luego con 8, etc.

#Obtener el número óptimo de topics en un topic modeling
def compute_coherence_values (dictionary, corpus, texts, limit, start = 2, step = 3):
" " "
Compute c_v coherence for various number of topics

Parameters:
- - - - - - - - - - - 
dictionary : Gensim dictionary
corpus : Gensim corpus
texts : List of input texts
limit : Max num of topics

Returns:
- - - - - - - -
model_list : List of LDA topic models
coherence_values : Coherence values corresponding to the LDA model with respective number of topics
" " "
coherence_values = [  ]
model_list = [  ]
for num_topics in range (start, limit, step):

      #Build LDA model
      model = gensim.models. ldamodel.LdaModel (corpus = corpus, id2word = dictionary, num_topics = num_topics)

      #Obtener el número óptimo de topics en un topic modeling
      #Create a list of LDA models
      model_list.append (model)

      #Compute the Coherence for each model
      coherencemodel = CoherenceModel (model = model, texts = texts, dictionary = dictionary, coherence = 'c_v')
      coherence_values.append (coherencemodel. get_coherence ())

return model_list, coherence_values

Grid sobre el número de topics (puede tardar un buen rato en ejecutarse).

Establecemos nuestras variables:

#Obtener el número óptimo de topics en un topic modeling
start_ = 2
end_ = 10
step_ = 1

Ahora vamos a ejecutar la función con los parámetros que le hemos designado:

#Obtener el número óptimo de topics en un topic modeling
model_list, coherence_values = compute_coherence_values (
dictionary = dictionary,
corpus = corpus,
texts = processed_texts,
start = start_,
limit = end_,
step = step_
)
Obtener el número óptimo de topics en un topic modeling

Ahora haremos una visualización de los valores de coherence que ha obtenido para cada uno de los números de topics. Así podremos ver cómo sería el valor óptimo:

#Obtener el número óptimo de topics en un topic modeling
x = range (start_, end_, step_)
plt.plot (x, coherence_values)
plt.xlabel ('Num Topics')
plt.ylabel ('Coherence score')
plt.legend (('coherence_values'), loc = 'best')
plt.show ()
Obtener el número óptimo de topics en un topic modeling

Aquí vemos que cuantos más números de topics ponemos, más aumenta el coherence score.

En caso de que sea el número más alto, el valor más óptimo de topics sería el 7. Entonces, si escogemos el 7, el modelo que tenemos que escoger es el 5.

#Obtener el número óptimo de topics en un topic modeling
optimal_model_id = 5
#Obtener el número óptimo de topics en un topic modeling
optimal_model = model_list [optimal_model_id]

word_dict = {  };
for i in range (optimal_model_id):
      words = optimal_model. show_topic (i, topn = 20)
      word_dict ['Topic #' + '{:02d}' .format (i + 1)] = [i [0] for i in words]
pd.DataFrame (word_dict)

Con 5 topics este es el resultado:

Obtener el número óptimo de topics en un topic modeling
Obtener el número óptimo de topics en un topic modeling

Veamos cómo se visualizaría:

#Obtener el número óptimo de topics en un topic modeling
#Visualizar los topics
pyLDAvis.enable_notebook ()
vis = pyLDAvis.gensim. prepare (optimal_model, corpus, dictionary)
vis
Obtener el número óptimo de topics en un topic modeling

No está nada mal. Tenemos 3 temas claramente diferenciados con mucha distancia, por lo que, en este caso, sí que ha hecho una buena discriminación entre temáticas.

¿Quieres seguir avanzando?

Para poder acceder a las opciones laborales del Big Data, una de las áreas en el mundo de la industria IT mejor pagadas y con mayor demanda, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación de alta calidad adquirirás los conocimientos imprescindibles para conseguir el trabajo de tus sueños en pocos meses. ¡No esperes más para impulsar tu futuro y solicita información ahora!

Artículos ms leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado