Automatizamos el análisis y pusimos el código a disposición en GitHub.
Se me ocurrió cuando intenté reproducir el artículo “Learning Word Vectors for Sentiment Analysis” de Maas et al. (2011).
En ese momento, todavía estaba en mi último año de la escuela de ingeniería. El objetivo era reproducir el artículo, cuestionar los métodos de los autores y, si es posible, compararlos con otras representaciones de palabras, incluidos los enfoques basados en LLM.
Lo que me llamó la atención fue lo simple y elegante que era el método. En cierto modo, me recordó a la regresión logística en la calificación crediticia: simple, interpretable y aún poderosa cuando se usa correctamente.
Disfruté tanto leyendo este artículo que decidí compartir lo que aprendí de él.
Recomiendo encarecidamente leer el artículo original. Le ayudará a comprender lo que está en juego en la representación de palabras, especialmente cómo analizar la proximidad entre dos palabras tanto desde una perspectiva semántica como desde una perspectiva de polaridad de sentimiento, dados los contextos específicos en los que se usan esas palabras.
Al principio, el modelo parece simple: desarrollar un vocabulario, aprender vectores de palabras, incorporar información sobre sentimientos y evaluar los resultados en las revisiones de IMDb.
Pero cuando comencé a implementarlo, me di cuenta de que varios detalles son muy importantes: cómo se construye el vocabulario, cómo se representan los vectores de documentos, cómo se optimiza el objetivo semántico y cómo se inyecta la señal de sentimiento en los vectores de palabras.
En este artículo, reproduciremos las ideas principales del artículo usando Python.
Primero explicaremos la intuición detrás del modelo. Luego presentaremos la estructura de datos utilizada en el artículo, construiremos el vocabulario, implementaremos el componente semántico, agregaremos el objetivo de sentimiento y finalmente evaluaremos las representaciones aprendidas utilizando el clasificador lineal SVM.
El SVM nos permitirá medir la precisión de la clasificación y comparar nuestros resultados con los informados en el artículo.
¿Qué problema resuelve el papel?
Los modelos tradicionales de Bolsa de palabras son útiles para la clasificación, pero no aprenden relaciones significativas entre palabras. Por ejemplo, las palabras maravilloso y sorprendente deben ser cercanas porque expresan significados y sentimientos similares. Por otro lado, lo maravilloso y lo terrible pueden aparecer en contextos similares de reseñas de películas, pero expresan sentimientos opuestos.
El objetivo del artículo es aprender vectores de palabras que capturen tanto la similitud semántica como la orientación sentimental.
estructura de datos
El conjunto de datos contiene:
25 000 revisiones o documentos de capacitación etiquetados 50 000 revisiones de capacitación no etiquetadas 25 000 revisiones de pruebas etiquetadas
Las reseñas etiquetadas están polarizadas:
Las reseñas negativas tienen calificaciones de 1 a 4 Las reseñas positivas tienen calificaciones de 7 a 10
Las calificaciones se asignan linealmente al intervalo [0, 1], lo que permite que el modelo trate el sentimiento como una probabilidad continua de polaridad positiva.
aclImdb/ ├── tren/ │ ├── pos/ "0_10.txt" -> reseña #0, 10 estrellas, muy positiva │ │ "1_7.txt" -> reseña #1, 7 estrellas, positiva │ ├── neg/ "10_2.txt" -> reseña #10, 2 estrellas, muy negativo │ │ "25_4.txt" -> reseña #25, 4 estrellas, negativo │ └── unsup/ "938_0.txt" -> reseña #938, 0 estrellas, sin etiquetar └── prueba/ ├── pos/ reseñas positivas, nunca visto durante el entrenamiento └── críticas negativas/negativas, nunca vistas durante el entrenamiento
Por lo tanto, podemos almacenar cada documento en una clase de Revisión con los siguientes atributos: texto, estrellas, etiqueta y depósito.
Por supuesto, no tiene que ser una clase llamada específicamente Revisión. Se puede utilizar cualquier objeto siempre que proporcione al menos estos atributos.
desde clases de datos importar clase de datos desde escribir importar Opcional clase @dataclass Revisión: texto: str estrellas: int etiqueta: str depósito: str
Construcción de vocabulario
El documento construye un vocabulario fijo ignorando primero los 50 términos más frecuentes y luego conservando los siguientes 5.000 tokens más frecuentes.
No se aplica derivación. No se utiliza ninguna eliminación de palabras vacías estándar. Esto es importante porque algunas palabras vacías, especialmente las negaciones, pueden contener información sobre sentimientos.
Antes de desarrollar este vocabulario, primero debemos observar los datos sin procesar.
Notamos que las reseñas no están completamente limpias. Algunos documentos contienen etiquetas HTML, por lo que las eliminamos durante el paso de carga de datos. También eliminamos la puntuación adjunta a palabras, como ".", ",", "!" o "?".
Esta es una ligera diferencia con el documento original. Los autores conservan algunos tokens que no son palabras porque pueden ayudar a captar el sentimiento. Por ejemplo, "!" o ":-)" pueden contener información emocional. En nuestra implementación, elegimos eliminar esta puntuación y luego evaluar cuánto afecta esta decisión al rendimiento final del modelo.
Cuando se trabaja con datos de texto, la siguiente pregunta es siempre la misma:
¿Cómo debemos representar numéricamente los documentos y las palabras?
Los autores comienzan recopilando todos los tokens del conjunto de capacitación, incluidas las revisiones etiquetadas y no etiquetadas. Podemos pensar en esto como poner todas las palabras de los documentos de capacitación en una gran canasta.
Luego, para representar palabras en un espacio donde podamos entrenar un modelo, construyen un conjunto de palabras llamado vocabulario.
Los autores construyen un diccionario que asigna cada token, que en términos generales llamaremos palabra, a su frecuencia. Esta frecuencia es simplemente la cantidad de veces que el token aparece en el conjunto de capacitación completo, incluidas las revisiones etiquetadas y no etiquetadas.
Luego seleccionan las 5.000 palabras más frecuentes, tras eliminar los 50 términos más frecuentes.
Estas 5.000 palabras forman el vocabulario V.
Cada palabra en V corresponderá a una columna de la matriz de representación R. Los autores eligen representar cada palabra en un espacio de 50 dimensiones. Por tanto, la matriz R tiene la siguiente forma:
R∈ℝβ=50×|V|=5000R in mathbb{R}^{beta = 50times |V| = 5000}
Cada columna de R es la representación vectorial de una palabra:ϕw=Rw phi_w = Rw
El objetivo del modelo es aprender esta matriz R para que los vectores de palabras capturen dos cosas al mismo tiempo:
La información semántica, es decir, las palabras utilizadas en contextos similares deben ser cercanas; La información de sentimiento, es decir, palabras que tienen polaridad similar, también debe ser cercana.
Ésta es la idea central del artículo.
Una vez que los datos se cargan, se limpian y se crea el vocabulario, podemos pasar a la construcción del modelo en sí.
La primera parte del modelo no está supervisada. Aprende representaciones semánticas de palabras de reseñas etiquetadas y no etiquetadas.
Luego, la segunda parte agrega supervisión mediante el uso de calificaciones de estrellas para inyectar sentimiento en el mismo espacio vectorial.
Componente semántico
El componente semántico define un modelo probabilístico de un documento.
Cada documento está asociado con un vector theta latente. Este vector representa la dirección semántica del documento.
Cada palabra tiene una representación vectorial ϕw phi_w, almacenada como una columna de la matriz R.
La probabilidad de observar una palabra w en un documento viene dada por un modelo softmax:
p(w|θ;R,b)=exp(θ⊤ϕw+bw)∑w′∈Vexp(θ⊤ϕw′+bw′)p(w mid theta; R, b) = frac{exp(theta^top phi_w + b_w)}{sum_{w' in V} exp(theta^top phi_{w'} + b_ {w'})}
Intuitivamente, una palabra se vuelve probable cuando su vector ϕwphi_w está bien alineado con el vector theta del documento.
Estimación MAP de theta
El modelo alterna entre dos pasos.
Primero, fija R y b y estima un vector theta para cada documento.
Luego, corrige theta y actualiza R y b.
Los vectores theta no se almacenan como parámetros finales. Son variables temporales específicas de documentos que se utilizan para actualizar las representaciones de palabras.
Para estimar los parámetros del modelo, los autores utilizan la máxima verosimilitud.
La idea es simple: queremos encontrar los parámetros R y b que hacen que los documentos observados sean lo más probables posible según el modelo.
Partiendo de la formulación probabilística de un documento, introducen una estimación MAP θ̂ₖ para cada documento dₖ. Luego, al tomar el logaritmo de la probabilidad y agregar términos de regularización, obtienen la función objetivo utilizada para aprender la matriz de representación de palabras R y el vector de sesgo b:
ν‖R‖F2+∑dk∈Dλ‖θ^k‖22+∑i=1Nklogp(wi|θ^k;R,b)nu |R|_F^2 + sum_{d_k in D} lambda |hat{theta}_k|_2^2 + sum_{i=1}^{N_k} log p(w_i mid hat{theta}_k; R, b)
que se maximiza con respecto a R y b. Los hiperparámetros del modelo son los pesos de regularización (λ y ν) y la dimensionalidad del vector de palabras β.
En este paso, aprendemos la matriz de representación semántica. Esta matriz captura cómo las palabras se relacionan entre sí según los contextos en los que aparecen.
Componente de sentimiento
Sólo el modelo semántico puede aprender que las palabras ocurren en contextos similares. Pero esto no es suficiente para captar el sentimiento.
Por ejemplo, en las reseñas de películas pueden aparecer cosas maravillosas y terribles, pero expresan opiniones opuestas.
Para solucionar esto, el documento añade un objetivo de sentimiento supervisado:
p(s=1|w;R,ψ)=σ(ψ⊤ϕw+bc)p(s = 1 mid w; R, psi) = sigma(psi^top phi_w + b_c)
El vector ψ define una dirección de sentimiento en el espacio vectorial de palabras. Aquí sólo se utilizan los datos etiquetados.
Si un vector de palabras se encuentra a un lado del hiperplano, se considera positivo. Si está del otro lado, se considera negativo.
Combinaron el sentimiento objetivo y la parte del sentimiento para construir el aprendizaje objetivo final y completo:
ν‖R‖F2+∑k=1|D|λ‖θ^k‖22+∑i=1NklogP(wi|θ^k;R,b)+∑k=1|D|1|Sk|∑i=1NklogP(sk|wi;R,ψ,bc)begin{alineado} nu |R|_F^2 &+ sum_{k=1}^{|D|} lambda |hat{theta}_k|_2^2 + sum_{i=1}^{N_k} log P(w_i mid hat{theta}_k; R, b) \ &+ sum_{k=1}^{|D|} frac{1}{|S_k|} sum_{i=1}^{N_k} log P(s_k mid w_i; R, psi, b_c) end{aligned}
La primera parte aprende similitudes semánticas. La segunda parte inyecta información sobre sentimientos. Los términos de regularización evitan que los vectores crezcan demasiado.
|SkS_k| denota el número de documentos en el conjunto de datos con el mismo valor redondeado de sks_k. La ponderación 1|Sk|frac{1}{|S_k|} se introduce para combatir el conocido desequilibrio en las calificaciones presente en las colecciones de reseñas.
Clasificación y resultados
Una vez que hemos aprendido la matriz de representación de palabras R, podemos usarla para crear características a nivel de documento.
El objetivo ahora es clasificar cada reseña de película como positiva o negativa.
Para hacer esto, los autores entrenan una SVM lineal en las 25.000 revisiones de capacitación etiquetadas y la evalúan en las 25.000 revisiones de prueba etiquetadas.
La pregunta importante no es sólo si los vectores de palabras tienen significado, sino también si ayudan a mejorar la clasificación de sentimientos.
Para responder a esta pregunta, evaluamos varias representaciones de documentos y las comparamos con los resultados reportados en la Tabla 2 del artículo.
Lo único que cambia de una configuración a otra es la forma en que se representa cada reseña antes de pasar al clasificador.
1. Línea base de la Bolsa de Palabras
La primera representación es una Bolsa de Palabras estándar. En el artículo, esta línea de base se informa como Bolsa de Palabras (bnc). La notación significa:
b = ponderación binaria n = sin ponderación IDF c = normalización del coseno
Una reseña o documento se representa mediante un vector v de tamaño 5000, porque el vocabulario contiene 5000 palabras.
Para cada palabra j en el vocabulario:
νj={1si la palabra j aparece en la reseña0de lo contrarionu_j = begin{cases} 1 & text{si la palabra } j text{ aparece en la reseña} \ 0 & text{de lo contrario} end{cases}
Entonces esta representación solo registra si una palabra aparece al menos una vez. No cuenta cuantas veces aparece.
Luego el vector se normaliza por su norma euclidiana:
νbnc=ν‖ν‖2nu_{bnc} = frac{nu}{|nu|_2}
Esto proporciona la línea base de Bag of Words utilizada para entrenar el SVM.
Esta línea de base es sólida porque la clasificación de sentimientos a menudo se basa en pistas léxicas directas. Palabras como excelente, aburrido, horrible o excelente ya contienen información sentimental útil.
2. Representación de vectores de palabras únicamente semántica
La segunda representación utiliza los vectores de palabras aprendidos mediante el modelo sólo semántico.
Los autores primero representan un documento como un vector v de Bolsa de palabras. Luego calculan una representación de documento denso multiplicando este vector por la matriz aprendida:
zsemántico=Rsemántico×νz_{text{semántico}} = R_{text{semántico}} times nu
Donde Rsemantic∈ℝ50×5000, ν∈ℝ5000⟹zsemantic∈ℝ50R_{text{semántico}} in mathbb{R}^{50 times 5000}, nu in mathbb{R}^{5000} quadimpliesquad z_{text{semántico}} in mathbb{R}^{50}
Este vector se puede interpretar como una combinación ponderada de los vectores de palabras que aparecen en la reseña.
En el artículo, al generar características de documentos a través del producto Rv, los autores utilizan la ponderación bnn para v. Esto significa:
b = ponderación binaria n = sin ponderación IDF n = sin normalización de coseno antes de la proyección
Luego, después de calcular Rv, aplican la normalización del coseno al vector denso final.
Entonces la representación final es:
z‾semántico=Rsemánticoν‖Rsemánticoν‖2bar{z}_{text{semántico}} = frac{R_{text{semántico}} nu}{| R_{text{semántico}} nu |_2}
Esta representación utiliza información semántica aprendida de las revisiones de capacitación, incluidos documentos etiquetados y no etiquetados.
3. Representación semántica + sentimental completa
La tercera representación sigue la misma construcción, pero utiliza la matriz completa Rfull.
Esta matriz se aprende con ambos componentes del modelo:
el objetivo semántico, que aprende la similitud contextual entre palabras; El objetivo de sentimiento, que inyecta información de polaridad de las calificaciones de estrellas.
Para cada documento, calculamos:
zfull=Rfullνz_{text{completo}} = R_{text{completo}} nu
Luego normalizamos:
z‾full=Rfullν‖Rfullν‖2bar{z}_{text{full}} = frac{R_{text{full}} nu}{| R_{text{completo}} nu |_2}
La intuición es que RfullR_{full} debería producir características del documento que capturen tanto de qué se trata la reseña como si el lenguaje es positivo o negativo.
Ésta es la principal contribución del artículo: aprender vectores de palabras que combinan similitud semántica y orientación sentimental.
4. Representación completa + Bolsa de palabras
La configuración final combina la representación densa aprendida con la representación original de Bag of Words.
Concatenamos las dos representaciones para obtener:
x=[z‾full‖νbnc]x = left[ bar{z}_{text{full}} ;middle|; nu_{bnc} right]
Esto le da al clasificador dos fuentes complementarias de información:
una representación densa de 50 dimensiones aprendida por el modelo; una representación léxica escasa que conserva la información exacta de la presencia de palabras.
Esta combinación es útil porque los vectores de palabras pueden generalizarse entre palabras similares, mientras que las funciones de Bolsa de palabras mantienen evidencia léxica precisa.
Por ejemplo, la representación densa puede aprender que lo maravilloso y lo asombroso están cerca, mientras que la representación de la Bolsa de palabras aún conserva la presencia exacta de cada palabra.
Luego entrenamos una SVM lineal en el conjunto de entrenamiento etiquetado y la evaluamos en el conjunto de prueba.
Esto nos permite responder a dos preguntas.
Primero, ¿los vectores de palabras aprendidos mejoran la clasificación de sentimientos?
En segundo lugar, ¿agregar información sobre sentimientos a los vectores de palabras ayuda más allá de la información semántica?
Implementación en Python
Implementamos el modelo en cinco pasos:
Cargue y limpie el conjunto de datos de IMDb. Construya el vocabulario. Entrene el componente semántico. Entrene el modelo semántico + de sentimiento completo. Evalúe las representaciones aprendidas usando SVM.
La siguiente tabla muestra los vecinos más cercanos de las palabras objetivo seleccionadas en el espacio vectorial aprendido.
Para cada palabra objetivo, informamos las cinco palabras más similares según la similitud del coseno. El modelo completo, que combina los objetivos semánticos y de sentimiento, tiende a recuperar palabras cercanas tanto en significado como en orientación de sentimiento. El modelo solo semántico captura la similitud contextual y léxica, pero no utiliza explícitamente etiquetas de sentimiento durante el entrenamiento.
La siguiente tabla compara nuestros resultados con los resultados informados en el artículo. Para cada representación, entrenamos una SVM lineal en las revisiones de entrenamiento etiquetadas e informamos la precisión de la clasificación en el conjunto de prueba. Esto nos permite evaluar qué tan bien se desempeña cada representación de documento en la tarea de clasificación de sentimientos de IMDb.
El modelo completo está muy cerca del resultado informado en el artículo. Esto sugiere que el objetivo de sentimiento se implementa correctamente.
La brecha más grande aparece en el modelo sólo semántico. Esto puede deberse a detalles de optimización, preprocesamiento o la forma en que se construyen las características a nivel de documento para la clasificación.
Conclusión
En este artículo reproducimos los principales componentes del modelo propuesto por Maas et al. (2011).
Implementamos el objetivo semántico, agregamos el objetivo de sentimiento y evaluamos los vectores de palabras aprendidas en la clasificación de sentimiento de IMDb.
El modelo muestra cómo los datos sin etiquetar pueden ayudar a aprender la estructura semántica, mientras que los datos etiquetados pueden inyectar información de sentimiento en el mismo espacio vectorial.
Esta es una idea simple pero poderosa: los vectores de palabras no solo deben capturar lo que significan las palabras, sino también cómo se sienten.
Si bien esta publicación no cubre todos los detalles del artículo, recomendamos encarecidamente leer el trabajo original de los autores. Nuestro objetivo era compartir las ideas que nos inspiraron y el disfrute que encontramos tanto al leer el artículo como al escribir esta publicación.
Esperamos que lo disfrutes tanto como nosotros.
Créditos de imagen
Todas las imágenes y visualizaciones de este artículo fueron creadas por el autor utilizando Python (pandas, matplotlib, seaborn y plotly) y Excel, a menos que se indique lo contrario.
Referencias
[1]𝗔𝗻𝗱𝗿𝗲𝘄 𝗟. 𝗠𝗮𝗮𝘀, 𝗥𝗮𝘆𝗺𝗼𝗻𝗱 𝗘. 𝗗𝗮𝗹𝘆, 𝗣𝗲𝘁𝗲𝗿 𝗧. 𝗣𝗵𝗮𝗺, 𝗗𝗮𝗻 𝗛𝘂𝗮𝗻𝗴, 𝗔𝗻𝗱𝗿𝗲𝘄 𝗬. 𝗡𝗴, 𝗮𝗻𝗱 𝗖𝗵𝗿𝗶𝘀𝘁𝗼𝗽𝗵𝗲𝗿 𝗣𝗼𝘁𝘁𝘀. 2011. Aprendizaje de vectores de palabras para el análisis de sentimientos. En Actas de la 49ª Reunión Anual de la Asociación de Lingüística Computacional: Tecnologías del Lenguaje Humano, páginas 142–150, Portland, Oregon, EE. UU. Asociación de Lingüística Computacional.
Conjunto de datos: Conjunto de datos de reseñas de películas grandes de IMDb (CC BY 4.0).