Cómo cambiamos LDA no supervisado a LDA guiado semi-supervisado

Esta es la historia de cómo y por qué tuvimos que escribir nuestra propia forma de asignación de Dirichlet latente (LDA). También hablo sobre por qué necesitábamos crear un modelo de tema guiado (GuidedLDA) y el proceso de código abierto de todo en GitHub.

¿Qué es LDA (modelado de temas)?

Digamos que tiene un conjunto de artículos de noticias que eran documentos. Al leer esos artículos, podrá saber si son sobre deportes, política o ciencia.

Para los siguientes títulos estarás de acuerdo en que el 1 y el 5 son sobre política, el 2 y 4 sobre deportes y el 3 y 6 sobre ciencia:

Para un ser humano no es un desafío descubrir a qué tema pertenece un artículo de noticias. Pero, ¿cómo podemos enseñarle a una computadora a comprender los mismos temas?

Aquí es donde entra en escena el modelado de temas. El modelado de temas es una clase no supervisada de algoritmos de aprendizaje automático. Estos modelos generalmente son buenos para agrupar palabras en temas. LDA es la técnica de modelado de temas más popular.

Una vez que tenemos las palabras agrupadas en temas, ahora podemos ver de qué grupo de palabras hablan los artículos de noticias y el documento. Entonces podemos clasificarlo en ese grupo o tema.

Como vemos, esta nueva Noticia habla del Premio Nobel . Ahora podemos predecir que este documento habla sobre el tema de la ciencia .

Nota : las palabras no se agrupan directamente en temas. Más bien se calcula una probabilidad como "¿Cuál es la probabilidad de que una palabra pertenezca a un tema?".

Está dado por p (t | w). O probabilidad del tema t dada la palabra w . En esencia, es solo probabilidad_Bayesiana.

Me encantaría hablar más sobre ello, pero no quiero desviarme del problema central. Si está interesado, puede leer más al respecto aquí.

Entonces, ¿qué es la LDA guiada?

El modelado de temas es generalmente un algoritmo de aprendizaje no supervisado. Sabemos que Space and Techson temas propios. Pero si no recibimos muchos artículos sobre ellos o si se mencionan juntos, es posible que se clasifiquen en un tema.

Me encontré con un problema similar recientemente. Trabajo como científico de datos en Belong.co y el procesamiento del lenguaje natural es la mitad de mi trabajo. Recientemente, estaba haciendo un modelado de temas LDA en nuestro corpus de datos. La mayoría de los temas salieron como esperaba. Pero algunos de los temas no tenían sentido.

Un par de temas se superpusieron y algunos de los temas que esperaba que surgieran no estaban allí. Algo de este tipo sucedió, Space y Tech se fusionaron.

En un algoritmo de aprendizaje supervisado, puede volver atrás y depurar dónde salió mal en el proceso de toma de decisiones. Quizás necesitabas más funciones. O más datos de entrenamiento. O tal vez una mejor función de pérdida, métricas y muestreo.

Pero, ¿por dónde empezar cuando el modelo no está supervisado? Decidimos depurar…

Descubrimos que los temas que se estaban fusionando no tenían suficientes documentos para destacar.

Decidimos decirle al modelo que mantuviera Space y Tech separados. La idea era establecer algunas palabras clave para Space y algunas palabras clave para Tech. Luego, guíe el modelo para que converja en torno a esos términos.

Fue una idea simple e intuitiva, pero no pudimos encontrar ninguna implementación de GuidedLDA. Hubo muy pocos artículos que hablaran de guiar a la LDA.

Nos referimos al artículo de Jagadeesh Jagarlamudi, Hal Daume III y Raghavendra Udupa Incorporando Lexical Priors into Topic Models. El artículo habla de cómo los a priori (en este caso, los priores significan palabras sembradas) se pueden establecer en el modelo para guiarlo en una determinada dirección. Entraremos en detalles en un momento.

Una vez que hicimos esos cambios, el modelo convergió de la manera que queríamos.

Entonces, ¿cómo cambiamos LDA a GuidedLDA?

Para explicar esta parte, tendremos que entrar en los detalles de cómo funciona LDA. Haré todo lo posible para que sea sencillo. Si no desea participar, puede pasar a la sección Uso de GuidedLDA .

La forma en que funciona LDA normal es, primero, cada palabra se asigna aleatoriamente a un tema. Esta inicialización se puede controlar con previos de Dirichlet mediante el parámetro Alpha. Ahí es donde LDA (Latent Dirichlet Allocation) obtiene su nombre. Esta aleatoriedad podría ser una inicialización uniforme si el alfa es grande, o una inicialización sesgada cuando el alfa es pequeño. Sigamos adelante con la inicialización uniforme por ahora.

El siguiente paso es averiguar qué término pertenece a qué tema. Esta es la parte de modelado de temas del algoritmo. LDA opta por un enfoque muy simple al encontrar el tema para un período a la vez.

Supongamos que desea encontrar un tema para el término Origen azul . La LDA asumirá primero que todos los demás términos del corpus se asignan al tema correcto. En el último paso habíamos distribuido uniformemente cada término en todos los temas, por lo que asumiremos que es el tema correcto para esos términos.

Luego calculamos con qué términos viene Blue Origin con frecuencia. Entonces, cuál es el tema más común entre esos términos. Asignaremos Blue Origin a ese tema.

Blue Origin probablemente se acercará a cualquier tema en el que se encuentren SpaceX y NASA . Ahora puede ver que NASA , SpaceX y Blue Origin están un poco más cerca entre sí de lo que estaban antes de este paso. Luego pasaremos al siguiente término y repetiremos el proceso. Repetiremos todo este proceso el número de veces necesario para hacer que el modelo converja.

La fórmula para esto será:

Probability of Blue Origin to fit in topic Z {0,1,2,..} when it occurs in a document is equal to the number of times Blue Origin is assigned to topic Z multiplied by the number of other words in that document that already belong to Z, divided by total the number of times any word is assigned to topic Z.

Here’s the actual formula:

For each Document (D) and for each word (W) in that document, we will calculate the probability of that word belonging to each topic (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))

The initial results will be wrong. But we will run this entire process multiple times and with each iteration they will get better. Over time they will converge to form word topic distribution.

What changes when we seed the documents?

Say we want to seed SpaceX, NASAto converge towards topic_0. During initialization we can give some extra boost to SpaceXand NASA to lie in this specific topic.

We can control this parameter of how much extra boost should be given to a term. In our algorithm we call it seed_confidence and it can range between 0 and 1. With a seed_confidence of 0.1 you can bias the seeded words by 10% more towards the seeded topics.

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.

  1. seed_confidence can vary between 0 to 1.
  2. seed_topics is the dictionary {word_id to topic_id}
  3. 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.