Análisis de Sentimientos usando la API Natural Language de GCP

Oliver Fierro
GDG Cloud Santiago
Published in
5 min readNov 12, 2022

Aplicando Machine Learning para determinar el sentimiento de un texto escrito en lenguaje natural.

Los clientes envían información a las marcas a través de distintos mecanismos, muchos de ellos en lenguaje natural. Por ejemplo, los comentarios de los productos comprados en un e-commerce (reviews), comentarios en las redes sociales, entre otros.

En este contexto, el desafío consiste primeramente en capturar esa información “no estructurada”, que muchas veces no es considerada, pero que podría ocultar el verdadero sentir de los clientes. Las organizaciones deberán preocuparse de nutrir sus sistemas con este tipo de información de los clientes, para ir construyendo una vision más integral de éstos, una vision realmente 360°. De esta forma, podrán ofrecer a sus clientes experiencias cada vez más personalizadas y mejorar sus indices de conversion o retención, entre otros.

Para dar solución a este desafío, existen hoy en día herramientas poderosas que facilitan la implementación de soluciones enfocadas al procesamiento de lenguaje natural, aplicando técnicas de Machine Learning, para intentar conocer mejor a tus clientes y ofrecerles experiencias, productos y/o servicios más personalizados.

Podemos encontrar distintos niveles de abstracción en cuanto a las herramientas disponibles en GCP (API’s, AutoML, BigqueryML, etc.).

Servicios de Machine Learning

En este oportunidad nos centraremos en el funcionamiento de la API Natural Language de GCP.

La API Natural Language es un servicio dentro de la suite de IA de GCP, para determinar el sentimiento que prevalece en un texto escrito en lenguaje natural.

La API ofrece una serie de funcionalidades de análisis de sentimientos:

Sentiment analysis: Identifica en un texto dado la emoción prevalente, para determinar la actitud positiva, negativa o neutra del usuario.

Entity analysis: Identifica las entidades (nombres propios, puntos de referencia, nombres comunes de lugares, etc.) y su información respectiva.

Entity sentiment analysis: Identifica las entidades conocidas (nombres propios, nombres comunes) y su información respectiva, e identifica la prevalencia emocional de la opinión sobre la entidad dentro de un texto, para determinar la actitud positiva, negativa o neutra.

Syntactic analysis: Extrae información lingüística, analiza el texto en series de sentencias y tokens y provee análisis sobre esos tokens.

Content classification: Analiza el contenido de un texto y determina la categoría de éste.

Variables más relevantes:
Score: Corresponde a la prevalencia emocional general del texto.
La puntuación del sentimiento oscila entre -1 (negativo) y 1 (positivo), donde 0 es neutro.
Magnitud: Indica la intensidad general de la emoción (tanto positiva como negativa) dentro de un texto, y su rango está entre 0.0 e infinito. La magnitud no está normalizada; cada expresión de emoción dentro del texto contribuye a la magnitud del texto (por lo que los bloques de texto más largos pueden tener magnitudes mayores).

Caso de Uso

Se analizarán los tweets referentes a una marca de empresa en particular. Para efectos de simplicidad del proceso, utilizaremos un dataset preprocesado de tweets.

Cada tweet del dataset se procesará en forma individual (simulando el mismo procedimiento que se tendría que realizar si tuviéramos una integración directa con Twitter)

Pre-requisitos

  • Plataforma: Google Cloud
  • Cuenta de servicio de GCP: Con acceso a los recursos utilizados.
  • Ambiente local: Para desarrollar y ejecutar el componente procesador.
  • DataSet: Archivo .txt que contiene un consolidado de tweets de varias marcas o compañías, las cuales los usuarios mencionan al momento de dar sus opiniones o comentarios.

Solución

Accesos: Preliminarmente, debe generar una cuenta de servicio de GCP (IAM) y otorgarle los permisos mínimos necesarios (roles) para acceder a los recursos utilizados. En este caso, a Cloud Storage y a la API Natural Language.

La solución consiste en un componente principal, Processor, el cual leerá un dataset (txt) desde Cloud Storage, el cual contiene tweets que hacen referencia a diversas marcas o compañías y por cada tweet se invocará a la API Natural Language, con el fin de obtener el sentimiento y magnitud de dicho tweet, así como las entidades (nombres propios o comunes) y el sentimiento que representa cada una.

Arquitectura

Implementación

Para simpleza de esta demostración, no vamos a contenerizar aún los componentes, sino que simplemente vamos a ejecutar localmente (notebook) nuestro componente procesador (Processor), el cual fue desarrollado en Java.

Existen dos formas de invocar a la API. Una es realizando una llamada REST explicita, la cual tu debes armar y controlar y la otra es utilizando librerías embebidas en tu código fuente. Para efectos de esta implementación utilizaremos las librerías.

Se realizarán por ahora dos consultas a través de los métodos disponibles en la API Natural Language:

1. Análisis del sentimiento de cada texto (tweet)

Método de API: analyzeSentiment

2. Análisis del sentimiento de las entidades dentro de cada texto.

Método de API: analyzeEntitySentiment

Resultados

A continuación vamos a revisar uno de los casos que se desprende de los resultados obtenidos.

Resultados API Natural Language

Ejemplo de resultados:

Tweet original: “First flight for long time with @British_Airways. Now over one 1h delay for the short jump FRA-LCY and NO one here to provide status updates”
Sentiment score: -0.2 -> Sentimiento que destaca en la frase. En este caso es un sentimiento negativo (recuerde el rango del score, entre -1 y 1).
Sentiment magnitude: 1.2 -> Intensidad del sentimiento que prevalece en la frase. En este caso la intensidad de la emoción negativa es relativamente baja (recuerde el rango de la magnitud, entre 0 e infinito).

Entidades detectadas en la frase y su sentimiento:

Entity: flight
Magnitude: 0.2
Sentiment score : 0.2
Type: COMMON

Entity: @British_Airways
Magnitude: 0.3
Sentiment score : 0.3
Type: PROPER

Entity: delay
Magnitude: 0.3
Sentiment score : -0.3
Type: COMMON

Entity: NO one
Magnitude: 0.4
Sentiment score : -0.4
Type: COMMON

Entity: FRA
Magnitude: 0.4
Sentiment score : -0.4
Type: PROPER

Entity: status updates
Magnitude: 0.3
Sentiment score : -0.3
Type: COMMON

Entity: LCY
Magnitude: 0.3
Sentiment score : -0.3
Type: PROPER

Próximos pasos

En el próximo capitulo veremos cómo contenerizar los componentes de la solución, persistir y analizar los resultados y visualizarlos.

Dónde me puedes encontrar

Linkedin: https://www.linkedin.com/in/oliverfierro/
Comunidad: https://gdg.community.dev/gdg-cloud-santiago-de-chile/
Meetups y charlas

Oliver Fierro

--

--

Oliver Fierro
GDG Cloud Santiago

Cloud Architect & Tech Lead | Speaker & Writter | Co-organizer @GDG Cloud Santiago Chile