El Análisis de Sentimientos es “el proceso de identificar y categorizar computacionalmente las opiniones expresadas en texto, especialmente para determinar si la actitud del escritor hacia un tema, producto, etc… en particular es positiva, negativa o neutral”.

En el caso particular de las redes sociales, los usuarios tienen hoy en día todo tipo de facilidades para mostrar sus opiniones sobre cualquier tema que deseen. Tener constancia sobre las opiniones referentes a una marca, producto o situación y medir su impacto es actualmente de vital importancia para todas las empresas, pero el análisis de sentimientos no solo permite responder “qué opinan los internautas sobre algo”, sino que, facilita, mediante los medios adecuados, obtener ventajas competitivas en diferentes ámbitos.

Una vez visto lo que es el análisis de sentimiento y sus usos, la siguiente pregunta es: ¿Cómo podemos construir un analizador de sentimientos automatizado? Una respuesta es: utilizando Machine Learning.

Existen varias herramientas que nos permiten analizar sentimientos en textos de forma automática, pero si las que tenemos no nos cubren las necesidades, queremos personalizar el comportamiento o incluso por un tema de costes, podemos montarnos un analizador nosotros mismos de forma muy sencilla.

Con esta finalidad, uno de los mejores entornos donde empezar a crear modelos de Machine Learning es Microsoft Azure Machine Learning Studio. Esta herramienta nos permite crear sistemas automatizados de forma sencilla, sin necesidad de altos conocimientos en programación y, una vez entrenado el modelo, nos permite publicarlo en un servicio web para poder consumirlo.

En este artículo partiremos de una serie de tweets ya catalogados respecto al Coronavirus en España, aunque podría ser cualquier otro texto, como entradas a un foro. A partir de estos datos construiremos un modelo, lo publicaremos en un servicio web y lo consumiremos a través de Excel para realizar nuestras predicciones.

 

Construcción de un modelo predictivo en Azure ML Studio

 

Para desarrollar un modelo de análisis predictivo, normalmente se utilizan datos de una o varias fuentes, se transforman, analizan los datos a través de diversas funciones estadísticas y de manipulación de datos y se genera un conjunto de resultados. Microsoft Azure Machine Learning Studio nos permite hacer todo esto, pero en lugar de tener que hacerlo completamente a través de código, nos facilita una interfaz gráfica sencilla dónde conectaremos los conjuntos de datos y módulos para construir el modelo de análisis predictivo.

 

Carga de datos

 

Para poder entrenar nuestro analizador de sentimientos lo primero que necesitaremos, como para cualquier modelo de Machine Learning, son datos. En nuestro caso, nuestro objetivo es predecir el sentimiento en textos, por lo que para entrenar el modelo necesitaremos un conjunto de textos que ya tengan el sentimiento asignado. Lo primero que haremos será cargar estos datos.

 

 Azure ML Studio datasets

 

Ahora solo tendremos que arrastrar el módulo al espacio de trabajo y ya tendremos nuestro conjunto de datos listo para usar.

 

 

Nuestro conjunto de datos consta de dos columnas, una con los fragmentos de texto y otra con el sentimiento asociado; 4 para sentimientos positivos, 2 para sentimientos neutros y 0 para sentimientos negativos.

Ya hemos completado el primer paso para construir nuestro analizador de sentimientos.

 

Pre-procesado de los datos

 

Primero debemos asegurarnos de que nuestros datos se encuentran en el formato correcto, para ello incluiremos el módulo Edit Metadata, en el cual indicaremos el tipo de datos de cada columna. En nuestro caso tendremos una columna con valores de texto y otra con valores categóricos.

El siguiente paso será procesar estos datos. Los textos suelen estar desestructurados, con gran cantidad de caracteres especiales, enlaces a páginas web, hashtags y palabras muy comunes que aportan poco valor a la predicción (conocidas como stopwords). El rendimiento de nuestro modelo puede aumentar considerablemente al limpiar estos datos.

Este proceso de limpieza podría hacerse directamente con un script de Python o R, pero en este caso vamos a utilizar un módulo incluido en Azure ML Studio llamado Preprocess Text. Este módulo nos permite realizar varias transformaciones, además de las mencionadas anteriormente:

 Azure ML Studio sentiment analysis

El siguiente paso será tranformar las secuencias de texto obtenidas tras la transformación anterior en un conjunto de características representadas como enteros (conocido como Feature Hashing). La ventaja de utilizar Feature Hashing es que podemos representar textos de longitud variable como vectores de entidades numéricas de igual longitud y así lograr una reducción de la dimensionalidad; por el contrario, si tratamos de utilizar una columna de texto para entrenar sin convertir, se trataría como una columna categórica con muchos valores distintos, lo que empeoraría el rendimiento. Para realizar esta transformación utilizaremos el módulo Feature Hashing, incluido en Azure ML Studio.

Por último, utilizaremos el módulo Select Columns in Dataset para quitar la columna de texto original.

Con esto ya tendríamos nuestro conjunto de datos transformado, por lo que el siguiente paso será empezar a entrenar.

 Azure ML Studio analysis

 

Entrenamiento del modelo

 

Con nuestro conjunto de datos ya transformado, el siguiente paso será entrenar el modelo, para ello, lo primero será dividir los datos en un conjunto de entrenamiento y otro de testeo. El conjunto de entrenamiento lo utilizaremos para entrenar el modelo y el de testeo para evaluar el modelo.

Para dividir los datos utilizaremos el módulo Split Data. Debemos indicar la fracción por la que dividir, que en nuestro caso será 0.7 para entrenamiento y 0.3 para testeo, y definiremos el modo de división como estratificado.

 

 Azure ML Studio data

 

El siguiente paso será decidir el algoritmo de Machine Learning que vamos a utilizar. En nuestro caso nos encontramos frente a un problema de clasificación, ya que estamos buscando predecir una categoría, y esta categoría tiene tres posibles valores, por lo que deberemos escoger un algoritmo multiclase. Azure ML Studio nos facilita varios algoritmos, de los cuales, en este caso vamos a utilizar un Multiclass Decision Forest, pero se puede probar cualquier otro para comprobar cual se ajusta mejor a nuestros datos.

Una vez decidido el algoritmo, lo que nos queda es entrenar el modelo. Para ello, añadiremos el módulo Train Model y le conectaremos como entradas el algoritmo que vamos a utilizar y nuestro conjunto de entrenamiento. También deberemos escoger cuál es el valor que queremos predecir, en nuestro caso será el sentimiento.

 

 

Evaluar el modelo

 

Una vez entrenado el modelo, lo único que quedaría por hacer sería evaluarlo. Para ello utilizaremos los módulos Score Model y Evaluate Model. Con el módulo Evaluate Model obtenemos medidas del rendimiento del modelo que hemos creado, para con ellas decidir si nuestro modelo es lo suficientemente bueno o debemos realizar ajustes para mejorarlo.

 

 

Creación de un servicio web y consumo a través de Microsoft Excel

 

Además de crear y entrenar modelos, Azure ML Studio nos permite publicarlos como un servicio web para después consumirlo y realizar nuestras predicciones.

Para publicar un modelo de Azure ML Studio como servicio web lo primero que debemos hacer es, dentro de nuestro experimento, seleccionar la opción Set Up Web Service, en la barra inferior de la interfaz. Se nos abrirá una nueva pestaña en la parte superior del espacio de trabajo llamada Predictive Experiment y veremos como Azure ML Studio simplifica nuestro diagrama añadiendo una entrada Web Service Input y una salida Web Service Output. Estos nuevos módulos serán los datos de entrada y salida de nuestro servicio web.

 

 

Al entrenar el modelo, introducíamos un conjunto de datos con dos columnas, el texto y el sentimiento, pero en este caso no es eso lo que buscamos, sino que buscamos que la entrada sea únicamente un texto sin sentimiento asignado y que el modelo se encargue de asignarlo. Lo mismo sucede con la salida, ahora mismo nos está devolviendo todo el conjunto de datos con la predicción como una nueva columna añadida, pero nosotros solo queremos esa columna como salida.

Lo que haremos será añadir dos módulos Select Columns in Dataset, una al principio y otra al final, para definir así los datos que vamos a introducir y los datos que queremos que el modelo nos devuelva.

Ejecutamos de nuevo y si todo está correcto el modelo resultante debería quedar de la siguiente manera:

 

 

Una vez ha ejecutado todo correctamente, solo deberemos pulsar sobre Deploy Web Service y ya tendremos nuestro servicio web activo y listo para ser consumido.

 

 

Azure ML Studio nos permite probar directamente el modelo pulsando en Test, pero vamos a utilizarlo para predecir el sentimiento de un conjunto de tweets en un libro de Microsoft Excel. Para ello solo tenemos que descargar el archivo Excel que se muestra en el apartado Apps, en la fila de Request/Response.

Una vez estemos dentro del libro, veremos que se nos muestra en la parte derecha el add-in de Azure ML Studio. Ahora tendremos que introducir en el libro los datos cuyo sentimiento queremos predecir, seleccionar nuestro modelo en el menú de Azure, seleccionar los datos de entrada, la celda de salida y, con solo pulsar en Predict, tendremos una nueva columna con todas las predicciones. ¡Así de sencillo!

 

 

Visualización de los resultados

 

Con los pasos anteriores ya tendríamos nuestro conjunto de datos de resultados listo, pero resulta complicado sacar conclusiones teniendo únicamente el texto de los tweets y los sentimientos; por lo que vamos a visualizarlos para poder sacar nuestras conclusiones. Esto lo haremos a través de Python.

Lo primero que deberemos hacer es cargar las librerías que necesitamos para hacer funcionar nuestro código.

 

import pandas as pd
import numpy as np
import unicode
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS
from PIL import Image
import random
from collections import Counter
from palettable.colorbrewer.sequential import Reds_9
from palettable.cmocean.diverging import Balance_20
from palettable.tableau import BlueRed_12
from scipy.misc import imread
from nltk.corpus import stopwords
def color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    return tuple(Balance_20.colors[random.randint(2,18)])

 

A continuación, cargaremos nuestro conjunto de resultados y sustituiremos los valores de sentimiento por su correspondiente significado:

 

df = pd.read_excel('predicciones.xlsx', encoding = 'utf8')

df['Scored Labels'] = df['Scored Labels'].replace(0, 'Negativo').replace(4, 'Positivo').replace(2, 'Neutro)

 

Una vez tenemos los datos cargados, vamos a realizar una serie de visualizaciones.

 

Distribución sentimientos

 

Lo primero que podemos visualizar es la distribución de los tweets categorizados como positivos contra los tweets categorizados como negativos.

 

labels = 'Positivo', 'Negativo'
sizes = [df[df['Scored Labels'] == 'Positivo'].shape[0], df[df['Scored Labels'] == 'Negativo'].shape[0]]
colors = ['green', 'red', ]
explode = (0.1,0)

plt.pie(sizes, explode = explode, labels = labels, colors = colors, autopct = '%1.1f%%', shadow = True, startangle = 140)
plt.axis('equal')
plt.show()

 

 Azure ML Studio graph

Wordcloud

 

Un wordcloud es una visualización que nos permite ver las palabras más frecuentes, es decir, las palabras que más se repiten a lo largo del texto. Para ello, wordcloud visualiza con un tamaño más grande las palabras más frecuentes y en tamaño más pequeño aquellas menos frecuentes.

Para realizar la visualización correctamente, como sucedía al entrenar el modelo, deberemos eliminar las palabras que no aportan significado (stopwords).

 

otras = stopwords.words('spanish')
sw = set(STOPWORDS)
for word in otras:
   sw.add(word)
sw.add('RT')
sw.add('http')
sw.add('https')

 

Vamos a crear dos wordclouds, uno para los tweets positivos y otro para los tweets negativos.

 

# Wordcloud tweets positivos

positivos = df[df['Scored Labels'] == 'Positivo']
textos_positivo = ' '.join(positivos.fillna('')['tweet_text'].tolist())

wc = WordCloud(
    background_color = 'rgba(255, 255, 255, 0)', mode = 'RGBA',
    width = 1800,
    height = 1400,
    stopwords = sw
).generate(textos_positivo)
wc.recolor(color_func=color_func, random_state=3)

%matplotlib notebook
plt.imshow(wc)
plt.axis('off')
plt.savefig('./wordcloud_positivo.png', dpi=600)
plt.show()

 

 Azure ML Studio word analysis

 

# Wordcloud tweets negativos

negativos = df[df['Scored Labels'] == 'Negativo'] 
textos_negativo = ' '.join(negativos.fillna('')['tweet_text'].tolist()) 
wc = WordCloud( 
    background_color = 'rgba(255, 255, 255, 0)', mode = 'RGBA', 
    width = 1800, 
    height = 1400, 
    stopwords = sw 
).generate(textos_negativo) 
wc.recolor(color_func=color_func, random_state=3) 

%matplotlib notebook 
plt.imshow(wc) 
plt.axis('off') 
plt.savefig('./wordcloud_negativo.png', dpi=600) 
plt.show()

 

 Azure ML Studio wordmap

 

Top palabras más frecuentes

 

Por último, también podemos visualizar, mediante un gráfico de barras, el top de palabras más frecuentes, tanto en tweets positivos como en tweets negativos.

 

# Positivas

textos_positivo = unicode.unidecode(textos_positivo)
word_tokens = word_tokenize(textos_positivo)
filtered_text = []
for w in word_tokens:
    if w not in sw:
        filtered_text.append(w)

counter_pos = Counter(filtered_text)
most_occur_pos = counter_pos.most_common(10)

df_pos = pd.DataFrame(most_occur_pos, columns=['palabra', 'count']).sort_values(by='count', ascending=True)
df_pos.plot.barh(x='palabra', y='count', rot=0, title='Palabras más frecuentes tweets positivos', color='royalblue')
plt.tight_layout()

 

 

# Negativas

textos_negativo = unicode.unidecode(textos_negativo) 
word_tokens = word_tokenize(textos_negativo) 
filtered_text = [] 
for w in word_tokens: 
    if w not in sw: 
        filtered_text.append(w) 

counter_neg = Counter(filtered_text) 
most_occur_neg = counter_neg.most_common(10) 
df_neg = pd.DataFrame(most_occur_neg, columns=['palabra', 'count']).sort_values(by='count', ascending=True) 
df_neg.plot.barh(x='palabra', y='count', rot=0, title='Palabras más frecuentes tweets negativos', color='royalblue') 
plt.tight_layout()

 

¿Quieres formarte en Machine Learning? En SolidQ venimos trabajando en proyectos de Machine Learning desde hace algunos años y esta experiencia nos ha servido para adaptar nuestro conocimiento y crear los contenidos formativos objeto de este Módulo de Machine Learning con el que adquirir nuevos conceptos y conocimientos relacionados con analítica avanzada, dar el salto para no quedarte en el BI Tradicional” y seguir creciendo como profesional. Aprovecha la oportunidad y no dejes escapar el descuento que tenemos para ti… ¡antes de que se agote!

¿Quieres poner en marcha tu proyecto de Machine Learning? Conseguir el éxito en proyectos de analítica avanzada y su monetización requiere de datos, un buen modelo… y su interpretación asociada al caso de negocio. Esta combinación es imprescindible para que el proyecto tenga sentido y sea rentable. Por esta razón, durante nuestro Ideation Workshop nos reunimos en una sesión con todas las partes implicadas de tu equipo, para poner en contexto el proyecto y asegurar tanto su viabilidad técnica como los hitos de negocio en términos de rentabilidad. ¡Infórmate! Mira: Machine Learning Ideation Workshop: ¿Cómo empiezo mi proyecto?