Exploraciones

Bot Emmett Brown

Un bot de Twitter que genera texto a partir de los diálogos del Doc en las 3 películas de Volver al Futuro.

{% twitter https://twitter.com/BotEmmettBrown/status/938891636632846336 %}

Bot Emmett Brown es un bot muy listo. Inventó los viajes en el tiempo allá por 1955 con un pequeño aparato llamado el Condensador de Flujo. Además es muy buena plática y le encanta publicar sus pensamientos en su cuenta oficial de Twitter.

En pocas palabras, es un bot que genera texto a partir de los diálogos del Doc en las 3 películas de Volver al Futuro.

Veamos cómo puedes reproducir esto si algún día te dan ganas de hacer el tuyo.

Aquí no vamos a programar de verdad, pero puedes seguir el repo. Lo primero que tenemos que hacer es descargar los guiones, que están disponibles en The Daily Script

wget https://www.dailyscript.com/scripts/bttf4th.pdf

Después tenemos que convertir estos archivos a un formato legible, o sea, texto plano. Hay varias herramientas que te permiten hacerlo; la que yo usé es una de Python que se llama pdf2text.

Ya con el texto plano podemos usar nuestra arma favorita para limpiar el guion y quedarnos solo con los diálogos del Doc Emmett Brown. Por ejemplo, a mí me gusta mucho sed, porque es como usar vim directo en la terminal. Entonces, por ejemplo, tenemos que quedarnos con las líneas que empiezan con Doc:, pero también con las que siguen y no son de otro personaje (diálogos de varias líneas), y luego borrar el texto "Doc:" y los saltos de línea '\n'.

sed -n /^Doc:/,/^$/p 1_screen_play.txt | sed s/Doc:'\s'//g | sed '/^\s*$/d' | tr '\n' ' ' > 1_Doc.txt

Luego juntamos las 3 películas con cat y ya estamos listos para entrenar nuestro modelo.

Este bot se entrenó con un tipo de red neuronal llamada Long Short Term Memory (LSTM), que está muy bien explicada en este blog. Lo especial de estas redes es que toman en cuenta el pasado y no solo el estado actual, como lo haría una cadena de Markov. Esa propiedad nos da la oportunidad de generar texto usando las palabras anteriores (o incluso caracteres, como hace este post). Yo, por ejemplo, entrené el modelo con cadenas de 5 palabras, así que cuando el bot genera un nuevo tweet agrega una palabra según la probabilidad de que esa palabra venga después de las 5 anteriores.

El modelo lo escribí en Python usando Keras con Tensorflow como backend. Tengo CUDA instalado en mi computadora, y te lo recomiendo si piensas entrenar tu propio modelo, porque reduce muchísimo el tiempo que tarda.

{% twitter https://twitter.com/BotEmmettBrown/status/939258300511735808 %}

Docker es, por mucho, una de mis herramientas favoritas, porque reduce las dependencias a una sola si quieres compartir tu código o correrlo en distintas computadoras. Y como el propósito principal de este bot es ser un bot de Twitter, tiene que estar alojado en una computadora que esté prendida todo el tiempo, y obviamente no va a ser mi PC, así que usar Docker hace que pasar el código de una máquina a otra sea mucho más fácil. Bot Emmett Brown vive actualmente en una VM de Google Cloud Platform.

Un crontab y un multiplexor como Screen, Tmux o Byobu son fundamentales, porque queremos correr el o los scripts cada cierto tiempo (al azar entre las 8am y las 11pm, como cualquier humano normal) y olvidarnos de todo lo demás, excepto de leer las frases chistosas que se le ocurren.

¡Aquí está el código!

{% twitter https://twitter.com/BotEmmettBrown maxwidth=500 limit=5 %}