Análisis de sentimientos utilizando BERT en español
04 Aug 2020
A pesar de que el análisis de sentimientos no es algo nuevo, se hace difícil encontrar ejemplos utilizando el modelo BERT en español. Por esa razón, me pareció interesante realizar este análisis y ver su comportamiento en comparación con modelos mucho más simples. Para esto último, decidí usar Naive Bayes para crear un modelo base, que servirá de referencia para evaluar los resultados.
¿Que es BERT?
BERT es un modelo de deep learning del lenguaje natural creado por Google. Si te interesa conocer su arquitectura en más detalle te recomiendo leer este post, que posee una excelente explicación.
Particularmente, para el análisis que les presento en este post, utilizaré BETO, que corresponde al modelo BERT entrenado en español por el DCC de la Universidad de Chile.
Recopilación de datos
Para comenzar el análisis busqué datos del tipo ‘review’ (que contaran con un comentario y una valorización) y me pareció que un contenido accesible eran las opiniones de usuarios en la Google Play Store. Particularmente, decidí recolectar las de la app de yapo.cl y así tener un dataset en español.
Para esto construí un scraper utilizando Selenium, que se encarga de hacer scroll para ir mostrando más opiniones, también expande los textos de estas y por último guarda el texto junto con la valorización en un archivo .csv.
El código es el siguiente:
Esto no das una recopilación de 1080 opiniones y que tienen la siguiente distribución:
Limpieza y preparación de datos
Una vez obtenidos los datos, es necesario limpiarlos y prepararlos antes de ingresarlos a los modelos. Primero transformé las valorizaciones que se encuentra como strings (por ejemplo: “3 estrellas”) a las categorías que utilizaremos: negative, neutral y positive. Esto lo hice con la siguiente equivalencia:
1 o 2 estrellas: negative
3 estrellas : neutral
4 o 5 estrellas: positive
También transforme estas categorías a una codificación con valores numéricos, que es el formato que necesita el modelo con BERT. Por último, corregí palabras con errores ortográficos, eliminé las tildes (solo para el modelo Naive Bayes) y guardé todo en un archivo .csv. Aquí está el código de lo señalado:
Modelo base de referencia: Naive Bayes
Para establecer una referencia de comparación cree un modelo utilizando Naive Bayes, que nos servirá para evaluar los resultados con BERT.
El código busca el parámetro óptimo alpha y también utiliza validación cruzada para calcular la exactitud del modelo.
Este es el código:
Este modelo nos da una exactitud de 0.791 y la siguiente matriz de confusión:
Como se observa, la exactitud del modelo no es mala pero tiene un bajo desempeño a la hora de clasificar las opiniones del tipo neutral.
Modelo utilizando BETO
El primer paso fue descargar el modelo preentrenado para PyTorch . También empleé la librería transformers de hugginfface que posee un modelo BERT predefinido para clasificación: BertForSequenceClassification. Este último no es mas que BERT con una capa de clasificación encima.
Después de cargar los datos debemos tokenizar nuestro dataset. Este paso nos generará los vectores con los tokens y la attention mask. Debemos tener cuidado de que el valor de max_length sea mayor al número mayor de tokens por review.
Este es el código:
Luego creamos los dataloaders de PyTorch para el dataset de entrenamiento y de validación.
Ahora establecemos los valores aleatorios, de manera de que nuestros resultados sean reproducibles. También cargamos el modelo, el optimizador, definimos los epochs y el scheduler en PyTorch.
Definimos una función para formatear el tiempo y otra para calcular la exactitud.
Por último definimos la función que se encargará de entrenar el modelo y también de entregar los resultados en el set de validación.
El modelo que da mejores resultados es con 3 epochs y un batch de 32. Este nos da una exactitud de 0.83 y la siguiente matriz de confusión:
Conclusiones
A pesar de que con BERT obtenemos mejores resultados que en nuestro modelo de referencia, de igual manera tiene problemas en clasificar las opiniones del tipo neutral. Esto puede ser porque nuestro dataset no presenta muchos casos de esta categoría y también porque es una tarea difícil (incluso para una persona) y donde la capacidad de detectar contexto de BERT no parece ayudar demasiado . Por ejemplo, de estas opiniones ¿cuáles uno calificaría como neutral? ( es solo una):
n°
Opiniones
1
Funciona bien ,pero su opción de chat funciona de forma errática
2
Buena app pero deberían agregar una categoría de pesca, caza y outdoors.
3
Me encanta Yapo y lo ocupo a diario, pero a nivel de Aplicación le falta harto para lograr ser más amigable.
4
Buena aplicación solo que debería notificar cuando el aviso no es publicado después de ser revisado.