Como hacer minería de datos de Twitter y no morir en el intento
Llevo unos meses sin actualizar el blog debido a mi dedicación con pico y pala a la extracción y análisis de datos en Twitter, labor nada trivial ni exenta de riesgos como se podrá constatar tras leer los obstáculos más importantes que me he encontrado en el ejercicio del data mining Twitter:
- No hay conexión que tres días dure: El uso del streaming API requiere una conexión permanente. Pero esta conexión se puede romper (y se rompe) por unos de los dos extremos: el de Twitter y el del propio servidor. Dado que la captura de datos para un experimento puede durar meses, es evidente que hay un problema importante que resolver.
- Agua que no has de beber, déjala correr: desde que el flujo de tweets es del orden de 700 TPS (Tweets Per Second) no hay conexión que los soporte ni servidor que lo almacene, aparte de que Twitter no permite la modalidad de statuses/firehose a cualquiera. Por tanto, hay que elegir lo que se quiere recibir y consecuentemente renunciar al resto.
- ¿Qué fue antes la gallina o el huevo? Cuando se quiere monitorizar un evento anunciado no se sabe de antemano cuales serán los hashtag dominantes ya que son los usuarios de Twitter los que mandan y marcan las tendencias. Cuando se quiere monitorizar un hashtag que es trendring es ya too late: con el Streaming API se habrán perdido todos los tweets que lo auparon a la cima y con el search API solo se obtendrá los 1.500 últimos tweets. Véase el caso de la huelga general del 29-O ¿Quién iba a saber de antemano cual serían los hashtags más usados?
- Nunca están todos los tweets que son ni son todos los que están: Cuando se escogen los hashtags para monitorizar la información deseada es como jugar a las siete y media: que te pasas o que no llegas: Si se eligen hashtags que no son muy específicos se corre el riesgo de que haya tweets que no sean relevantes (problemas de ambiguación) y si se opta por otros más específicos se quedarán muchos tweets en el tintero, eso sin contar a la cantidad de tweets que no se etiquetan mediante hashtags.
- El tamaño sí importa. Una captura de continua de tweets durante meses significa un volumen de información muy considerable, tanto para almacenar como para procesar. A 50 TPS, guardando la información en modo texto plano (200bytes) son 10K por segundo, 600K por minuto, 36 Megas por hora, 864 megas, casi un giga, al día.
El data mining en Twitter requiere paciencia, perseverancia e ingenio. Es necesario saber de antemano que se trabaja en un entorno difuso y que hay que adaptarse al medio para capturar la información de la manera más eficiente. Estos son unos consejos para obtener tweets y no morir en el intento:
- Para mantener la conexión siempre viva es necesario realizar una aplicación de captura de tweets robusta y resolver el problema de la disponibilidad de servidores La aplicación de captura de tweets cuando pierda la conexión con Twitter debe intentar restablecerla de nuevo hasta que lo consiga y dejar toda la historia de las conexiones en un fichero de log. Es preciso crear un daemon para arrancar esta aplicación automáticamente en el inicio del sistema y para pararla de una manera ordenada antes del apagado del servidor. Si la captura de tweets no se realiza en paralelo con un servidor de backup es conveniente que el daemon avise mediante un email de alerta antes de ser apagado para activar la captura en un servidor provisional.
- Para elegir los hashtags hay que anticiparse “adivinando” los hashtags triunfadores, monitorizar por exceso e ir ajustando los hashtags conforme vayan definiéndose. Esto requiere estar pendiente de lo que ocurre en Twitter hasta que se tengan identificados los hashtags relevantes y que la aplicación de captura de tweets permita ser reconfigurada sobre la marcha.
- Para seleccionar la información relevante hay que posprocesar la información obtenida actuando en tres frentes: crear filtros para eliminar posible spam, suprimir información no relevante, y refinar la selección que ofrece Twitter:
- Filtrar spam es fácil porque los spamers son muy cansinos: Twittean siempre lo mismo y los hacen con algún bot de forma compulsiva. Cuando se selecciona el top de los autores quedan al descubierto. Solo es necesario crear un filtro de tweets con los nombres de usuarios spamers más destacados.
- Filtrar información no relevante lo más práctico es buscar el top de los hashtags y ver cuales de ellos no son relevantes con los datos que estamos analizando y se les añade al filtro de tweets.
- Refinar selección de Twitter: Twitter intenta dar información por exceso, por ejemplo si monitorizamos el hashtags #esp, enviará los tweets que contengan esp o #esp, tanto en mayúsculas como en minúsculas. En algunos casos esto no es conveniente y se debe hacer un filtrado más estricto de los hashtags.
- Para aliviar el uso masivo de disco se pueden almacenar los tweets en módulos de un tamaño manejable y comprimirlos. Algunos lenguajes como Python son capaces de abrir ficheros comprimidos e incluso leerlos a la misma velocidad que a la de los descomprimidos.
Espero que estos consejos sean de utilidad y si alguien está trabajando con datos de Twitter y quiere compartir experiencias, me encantaría que contactase conmigo.
Hoa Faustino:
Encantada de conocer a otro minero de Twitter. Yo estoy usando python. Ya tenemos el DM para comunicarnos dudas o problemas.
Hola
He llegado aquí por casualidad, cortesía de #acampadasol. Me resulta muy interesante los distintos problemas que planteas. Los técnicos los resolví en su momento, salvando las distancias: para un producto de información bursatil uso el streaming con un número escogido de cuentas a las que seguir, pero el flujo es constante y, de momento y tocando todo el amazonas, sólo he tenido dos paradas del daemon en seis semanas.
Uso PHP como lenguaje y MySQL como motor de datos, con la previsión de reprogramar el daemon en C++ cuando pase de un cierto límite de users a seguir. Y, si lo requiere, pasar el motor de datos a MongoDB. Almacenas los twits directamente en JSON, tal como llegan de twitter.
En fín, si quieres que compartamos notas, o quieres que te comente más de mi sistema o ver el código, aquí estoy.
un saludo.
Hola Juanma,
El número de tweets dependerá de la query que hagas.
– Si la query tiene menos de 1500 tweets te dará los de la última semana
– En los demás casos te dará los 1500, pero es conveniente que guardes el último tweet que te ha dado para que la proxima query se lo pases como parémtro (since=id_ultim_tweet) para no tener tweets repetidos. Esta vez te dará los que tenga. Si te da 1500 posiblemente no estás consultando con la frecuencia adecuada y estés perdiendo tweets
Otra cosa es la paginación. Le puedes decir que te de lo tweets de 100 en 100 (rpp=100) para economizar querys (por defecto te los da de 15 en 15)
En el API lo explica muy bien: http://apiwiki.twitter.com/w/page/22554756/Twitter-Search-API-Method:-search
Hola Mari Luz, tengo una duda, cuando quieres traerte el mayor número de tweets con la search api (1500) sabes qué opción hay que utilizar?
Hola juanma:
No sabes lo que me alegra que os intereséis en la investigación sobre twitter, estoy un poco sola en estos temas y cuantos más seamos, más avanzaremos.
Seguimos en contacto, ya te sigo tambien en twitter.
Buenas Mari Luz!! me parece este post muy muy interesante, por lo siguiente:
Soy alumno de Grado en Ingenieria Informatica de la UCLM y a dia de hoy me encuentro haciendo mi trabajo fin de grado, la tematica de este es el tratamiento de datos en Twitter y estaba muy confundido en como poder hacer esto. Ahora voy viendo un poco de luz en ello, espero que cambiemos opiniones al respecto. Por cierto te sigo ahora en Twitter! Algun consejo sobre esto? Gracias!! ;)
Marcos: No hay de qué. Siempre he compartido mi conocimiento y siempre he encontrado gente dispuesta a ayudarme.
Si duda, colaborar es siempre mucho más productivo ( y agradable) que competir.
Muchas gracias por compartir tanto conocimiento.
;)
Foskyto: Los 700 TPS no te los da twitter ni pidiendoselos de rodillas, pero los 50 TPS lo he recogido en un servidor de gama alta aunque no los trato en tiempo real (por ahora) sino que los almaceno en disco y los posproceso.
Creo que la clave es saber filtrar la basurilla en tiempo real (eso da para un paper) y tratar solo lo relevante.
Nunca viene mal haber trabajado en sistemas en tiempo real y alta disponibilidad para aplicarlo a otros campos, porque al final son siempre los mismos problemas los que hay que resolver.
El GE…R trata 300 alarmas por segundo y para ello hace falta un maquinón de 32 CPUs y creo que 48 gigas de RAM. Capturar 700 tweets por segundo por Internet y con un PC es imposible, incluso filtrando y dejándolo en 50 TPS es heroico. Deberías buscar alguna aproximación estadística y paralelizar con varios equipos a la escucha.
Julen: Puesta a complicarme la vida, me he buscado algo que me entretenga de por vida. La verdad es que da un poco de miedo ese alubión de datos, Twitter es la mayor fuente pública de información en tiempo real, lo difícil es llevarte en el cántaro lo que realmente buscas y ahí estoy yo para averiguarlo.
.
Anonadado me dejas en tu descomunal intento por hacer algo con esas toneladas de información. Sólo queda dar ánimo. He hecho cuentas y salen 60 millones de actualizaciones al día.
Relájate ;-)
Besos.