Usando Google Colaboratory para entrenar un Twitter bot

Primera parte

Andrés H.
6 min readJul 19, 2018

En mi primer post, relacionado con ciencia de datos voy a describir un proyecto personal que desarrolle entorno a las elecciones presidenciales de Colombia 2018, y con muy alta inspiración del trabajo encontrado aquí.

Como ligero trasfondo del tema, la elección enfrentaba a dos candidatos provenientes de dos puntos completamente opuestos del espectro político, Sin embargo ese no es el tema que voy a tratar en el presente post.Mi objetivo en esta ocasión sera mostrar como entrenar una red neural utilizando Google Collab, en un dataset minado de la red social Twitter. Empecemos

El dataset

Existen una serie de datasets utilizados frecuentemente en problemas de procesamiento de lenguaje natural ( o NLP para abreviar ). La inspiración para desarrollar este proyecto provino de experimentos similares en los que se replica el comportamiento en Twitter de Donal Trump. Uno de los mas notables es la cuenta @deepdrumpf , construidos con base a datasets como este de acá

Lo cierto es que tal colección de Tweets no existe para nuestros políticos criollos, razón por la cual me di a la tarea de recolectarla. Como programador soy mas bien un buen cantante de opera, por lo tanto me dirigí a Google y escribí el famoso “How to …” con el que se pueden aprender tantas cosas.

Encontre entonces un proyecto en Github para realizar el minado, el funcionamiento del código es bastante sencillo, editando el archivo scrape.py colocando el user, las fechas de interés start y end. Una vez ajustados los parámetros es cuestión de dejar el script procesar. El scraper.py recolectara las IDS de todos los tweets, mientras que el archivo get_metadata.py recolecta los datos de los tweets en cuestión, es importante recordar que se requiere una cuenta de desarrollador de Twitter con el fin de utilizar el API y colectar los datos.

Alvaro Uribe Velez

Uno de los politicos mas populares de Colombia, su cuenta de twitter @alvarouribevel. Si bien no era candidato presidencial en este año, la cuenta de twitter de su esbirro y nuevo presidente Iván Duque, no me pareció tan interesante de explorar. Quizás en una futura oportunidad.

Recolecte sus Tweets desde el primero de Enero del 2013 hasta el 4 de Marzo del 2018. Para un total de 46499. El dataset completo lo pueden encontrar aquí.

Gustavo Petro Urrego

El candidato que representaba el espectro político de izquierda,su cuenta de Twitter @petrogustavo , una vez realizado el minado para la mismas fechas que el anterior político, obtuve un total de 14533 Tweets. También he publicado el dataset en Kaggle.

Un análisis muy breve de los datos puede ser encontrado en este kernel de Kaggle. Dado que mi interés no era extraer mucha información de los mismos tweets sino mas bien poner a prueba el concepto de redes neurales recurrentes, y en particular la arquitectura char-rnn.

En este caso el plan es el siguiente. Dada la colección de texto disponible, formar un corpus con los tweets disponibles, y con ellos entrenar una red neural que, dada una secuencia de caracteres prediga el siguiente carácter

Google Colaboratory redes neurales

Google Colaboratory es una herramienta interesante liberada por Google hace poco, que permite la ejecución de código python mediante jupyter notebooks en un entorno virtual equipado con una GPU ( Tesla K80) , de forma que podamos acelerar los cálculos de nuestros modelos de redes neurales con tensorflow/Keras.

Google Colaboratoy resulta una excelente forma de reducir la barrera de entrada al mundo del machine learning, ya que en muchas ocasiones sin el hardware apropiado, resulta imposible ( o sencillamente demasiado costoso en tiempo) implementar modelos de deep learning, así sea para realizar experimentos simples. Vale la pena probar sus características adicionales, tales como compartir notebooks como si se tratara de archivos alojados en Drive.

Una vez entramos a Colaboratory veremos una pantalla como esta:

SI es la primera vez que entras en Colaboratory probablemente no tengas ningun notebook

En esta pantalla se puede sencillamente dar cancelar y el menú File crear un nuevo notebook.

Ya en el notebook se podrá ver la familiar interfaz de celdas de Jupyter.

La primera celda de mi trainer del petrobot luce así:

Estas lineas son necesarias para instalar en la maquina virtual que ejecuta nuestro notebook, las librerías para acceder a los datos de Google Drive ( que es donde alojaremos el dataset de los tweets de los políticos )

Luego podemos ejecutar:

!mkdir -p drive
!google-drive-ocamlfuse drive

!pip install -q keras

Estas ordenes crearan una carpeta llamada drive, y la montaran para acceder a los contenidos de la cuenta enlazada en el paso anterior. Adicionalmente instalamos Keras, una excelente librería de deep learning, que puede funcionar con el backend de Tensorflow o Theano. En este caso utilizaremos Tensorflow, que es la librería de facto de Google para machine learning.

A continuación procedemos a cargar el dataset y a realizar algunos pasos de procesamiento:

Mi código horrible

Primero y principal realizar los imports de las librerías necesarias.

lo siguiente que vale la pena notar es que el archivo “gustavopetro.csv” esta siendo accedido en la ruta ./drive/petrobot/datasets/gustavopetro.csv. Este archivo lo he guardado en mi unidad de Drive previamente y por tanto lo puedo acceder de esta forma. Por razones de rendimiento es preferible cargar los archivos que van a ser utilizados para el entrenamiento en la memoria, ya que las operaciones de lectura o escritura en la unidad de Drive son lentas en Colaboratory.

En este momento ya estamos en disposición de realizar cualquier operación sobre el dataframe donde hemos cargado los datos. Procesamos el texto, convirtiendo todo a minúsculas y eliminando las URLs de los tweets. Utilizando la librería string, construimos una lista de posibles caracteres que pueden aparecer en el texto. Esto es necesario ya que la salida de nuestra red neural, debe ser una distribución de probabilidad sobre los posibles caracteres, indicándonos así cual es el carácter que más probablemente suceda a una secuencia. La red neural va a aprender cual es la siguiente letra que va en el texto, o cual seria la siguiente letra que “Petro escribiría” en un tweet.

Es importante también remover las menciones de los tweets( este paso no lo muestro acá, pues lo he realizado antes de subir el archivo a Drive) con el fin de evitar confusiones ya que una mención no necesariamente corresponde a una forma natural del lenguaje.

Con esto en mente definimos la arquitectura de la red neural:

Aquí creamos una red neural recurrente, con un numero de capas igual a layer_count la función retorna un modelo de Keras. No es el objetivo de este post discutir las cualidades particulares de las redes neuronales recurrente ( o de la particular implementación de las mismas utilizando Keras), vale por ahora decir que se trata de una de las técnicas del estado del arte en problemas de procesamiento de lenguaje natural.

Con esto solo queda implementar un par de lógicas adicionales con el fin de alimentar el modelo de Keras. En esta ocasión dado que el modelo correrá en Google Colaboratory y esta maquina provee una poderosa GPU en adición al hecho de que el dataset no es muy demandante en términos de memoria, podemos darnos el lujo de almacenar todo el texto en la RAM y alimentar en batches el modelo. Un enfoque mas económico en memoria podria incluir implementaciones utilizando Dask o estructuras de data generator, de Keras.

La ultima parte del modelo consiste en una función que tome el texto y lo convierta en las entradas de la red ( X ) y la salida ( y ). La entrada es una secuencia de caracteres y la salida, es el carácter siguiente, por ejemplo:

X: hola mund

y: o

Dado que una red neural no entiende letras, es natural codificar la información de los caracteres como one-hot vectors.

Voy a dejar un enlace a un Gist donde se pueden consultar el código completo del notebook. Alguna de las tareas que falta por aclarar son:

  • Como interpretar la salida de la red a texto nuevamente
  • Como generar nuevos tweets utilizando la red entrenada
  • Como poner estos tweets in Twitter en tiempo real

Estas cuestiones las abordare en la segunda parte.

Por ahora dejare una imagen de algunos de los tweets generados por la red neural luego de unas 6 horas de entrenamiento, utilizando como semilla la frase “las mafias son”

Nunca entenderé a los políticos

Aun queda mucho por explorar con el fin de mejorar la producción de tweets, explorar otras arquitecturas, mejorar la consistencia del dataset son algunas de las ideas que podrían abordarse en busca de mejoras. esto puede quedar para otra entrega.

No siendo mas por ahora, me despido y hasta una próxima oportunidad.

Gracias por tu lectura.

--

--