Comunidad de diseño web y desarrollo en internet

Sistemas y herramientas para visualizar y extraer datos de Twitter

En Twitter se publican muchas cosas, desde las opiniones sobre la polémica política del momento hasta actualizaciones con relación a la vida íntima. Según [1] la taza de publicación de tweets, durante la transmisión del super tazón, fue de 10.000 tweets por segundo.

Y por qué habría de resultar esto interesante?


Cuánto nos tardaría leer sólo lo publicado en 1 segundo (10.000 tweets), y cuánto nos tardaríamos en encontrar información de interés entre esos 10.000 tweets?

Sí, muchísimo tiempo!

Ahora imaginemos que no sólo queremos los 10.000 tweets, si no que deseamos tener una idea general de lo que se está comentando…leerías todo? y como encontrarías la relación de los tweets entre sí?

La Extracción de información es una tarea que consiste en:

  • de gran cantidad (hablo de gigas o teras) de información (en formato texto)
  • extraer una lista con información que sea de interés.


A partir de esas listas de eventos, ítems o información, se pueden hacer otros tipos de procesamientos más interesantes, por ejemplo, análisis de sentimientos para intentar determinar la opinión general sobre cierto tema en particular.


Corpus


A la gran cantidad de información se le llama corpus, un corpus es simplemente una colección de texto, por ejemplo podríamos guardar todos los tweets publicados durante el super tazón, y a esa colección de tweets la podríamos llamar "corpus de tweets publicados durante el super tazón".

Voy a intentar aclarar un poco más en qué consiste la extracción de información. Supongamos que hemos recolectado un corpus sobre videojuegos, que está compuesto de artículos de revistas sobre videojuegos, entradas de blog, de foros etc..

Ahora queremos generar, a partir de ese corpus, una lista con la siguiente información:

NombreVideoJuego - Compañía - FechaDeSalida


Supongamos que en nuestro corpus existe una frase que diga algo como:

:

" Square Enix ya está trabajando en Final Fantasy X"


La extracción agregaría el siguiente registro a nuestra lista:


  • NombreVideoJuego: "Final Fantasy X"
  • Compañía:"Square Enix"
  • FechaDeSalida: "null"


El resultado final, debería ser una tabla llena con todos los videojuegos y la respectiva compañía desarrolladora. Sin embargo, existen retos, muchos retos. Uno de ellos, por ejemplo, consiste en que alguien puede escribir "Final Fantasy X" o puede referirse al mismo juego escribiendo "FFX". De hecho, si hablamos de juegos, a los gamers les encanta usar acrónimos, y podríamos tener casos en los que dos juegos diferentes tengan acrónimos iguales.


Experimento


Algunas semanas atrás, leí una entrada sobre Extracción y Visualización de Información en Twitter [2], aunque el experimento resultaba bastante sencillo, y la extracción es bastante ingenua, me pareció un reto interesante para el fin de semana.

Corrí mi implementación sobre algunos trends de Colombia, y sobre tweets relacionados con Cristalab, aquí les dejo algunas imágenes.

click en las imagenes para agrandar


El tema en la imagen es "cartoons", y se ven las ramificaciones sobre los diferentes cartoons:


El tema en la imagen es "qué aman las mujeres":


El tema principal en la imagen es "la liberación de secuestrados en colombia":


Sobre los "tweets de cristalab en marzo":




Básicamente, la imagen es un árbol donde cada nodo representa una palabra, dos palabras se relacionan entre sí si existieron tweets en los cuales las cuales las palabras se usaron.

Los nodos adyacentes a cada palabra representan tweets que incluyeron los términos de la raíz hasta el nodo.

Las "estrellas" en el árbol representan los temas más populares.


Intentaré explicar algunos de los pasos y la idea en general:



En resumen:

  1. capturar tweets
  2. limpiar tweets

    • Corrección de cadenas
    • Quitar Símbolos, caracteres extraños
    • POS tagger de los tweets
    • Reconocimiento de nombres

  3. limpieza final
  4. Conteo y frecuencia de palabras
  5. representación en grafo



Selección de Tweets


El primer paso es construir el corpus que necesitamos, y para eso podemos usar el API de Twitter. En el API de twitter podemos hacer búsquedas de tweets con respecto a un radio geográfico o también por palabras.

Sobre el corpus generado hay que dejar claro que es un corpus lleno de basura.
Sí! basura, necesitamos limpiarlo, de muchas formas. Pueden haber tweets que no nos sirvan o que simplemente tengan errores de escritura.


Pre-procesamiento


Cosas que usualmente se hacen en el pre-procesamiento o limpieza:


  • transformar palabras como: 'muuuuuuuuuuuuuuuy' a 'muy'.
  • encontrar posibles errores de escritura, por ejemplo: 'encontrar' 'necontrar'..
  • quitar URLS, emails y símbolos que consideremos extraños.


Similitud de Cadenas


Este tipo de limpieza implica por ejemplo medir similitud de cadenas. La similitud consiste en si tienes dos strings A y B, identificar qué tan parecidos o diferentes son.

Sólo el tema de similitud de cadenas puede ser un tutorial completo. En general existen diferentes estrategias para medir la similitud de cadenas, entre los más conocidos están Jaro, Jaro-Winkler, Soundex y Levenstein.

La más conocida es Levenstein, pero a nivel personal no me agrada mucho por dos razones, primero la comparación de cadenas no es normalizada, es decir, el número que arroja depende del largo de las cadenas. Mientras Jaro y Jaro-Winkler son normalizadas, sin importar el largo, si las cadenas son completamente iguales, el resultado es 1.

Una de mis favoritas es Soundex, que mide la similitud entre cadenas en base a la fonética, por ejemplo las palabras "rupert" y "robert" serían muy parecidas, dado que fonéticamente son similares. De hecho el pre-procesamiento usualmente incluye también NLP, dependiendo de lo que deseamos realizar.

Lo que ocurre usualmente es que deseamos anotar nuestros datos con información extra. En este caso el resultado final será un grafo conectando las palabras clave, así que necesitaba incluir en la limpieza una forma de evitar ramificaciones adicionales por ejemplo:

Si los tweets extraídos hablaban sobre el tema "liberación de secuestrados", tendremos tweets donde se mencionará: "liberacion", "liberaran", "liberaron", "liberarian", dado que el español es un idioma con bastantes declinaciones, terminaríamos con un árbol con muchas ramas, todas refiriéndose en esencia al mismo verbo "liberar". Otro ejemplo podría ser con los plurales y singulares. Una forma de evitar este tipo de problemas es usando un POS-tagger.



POS Tagger


POS-tagger (Part of Speech Tagger) es una herramienta cuya entrada es texto, y la salida es texto anotado. A cada palabra le va asignada su función dentro de la oración. Por ejemplo si la oración es:

:

'Juan visita Alemania'

Entonces la salida será algo como:


  • Juan - Sustantivo
  • Visita -Verbo Transitivo - tiempo: presente- Infinitivo: Visitar
  • Alemania - Sustantivo


Existen POS-taggers ya entrenados para ciertos idiomas, entre ellos el español. Dependiendo de la herramienta podría arrojarnos información adicional, por ejemplo si el sustantivo es plural o singular.

El pos-tagger también nos ayuda a limpiar palabras que no tengan significado por sí mismas. Por ejemplo, podemos limpiar posteriormente todas las palabras que sean preposiciones.

StopWords


Existen palabras que no tienen significado por sí mismas y otras que sí lo tienen pero que resultan muy comunes. Estas palabras se llaman stopwords. En la visualización del grafo quería evitar este tipo de palabras, ya que resultan ser basura (no en todos los casos lo son). Existen utilidades que ya traen una lista de Stopwords para español. Por ejemplo la librería nltk en python ya trae una lista de stopwords para español.

Reconocimiento de Entidades


Es también una herramienta a partir de la cual se reconocen nombres propios, lugares y fechas. No es un diccionario, eso quiere decir que no es una lista definida de nombres, es una herramienta entrenada usando técnicas de inteligencia artificial para reconocer nombres propios.

Existen herramientas especializadas para la detección de nombres en dominios particulares. El reconocimiento de nombres propios se resume en 2 tareas:

  • Reconocer nombres propios dentro de texto
  • Desambiguación de nombres.


La desambiguación se refiere por ejemplo a que pueden existir múltiples formas de nombrar a una misma entidad. Si habláramos de "Barack Obama", en los tweets se pueden referir al mismo personaje de muchas formas: "Obama", "B. Obama", "Barack O.", "El presidente de estados unidos"...

La segunda tarea puede ser muy complicada, sin embargo la primera es relativamente un problema resuelto.

Lo que hice para este extractor ingenuo fue simplemente usar una herramienta ya entrenada para reconocimiento de nombres pero no para la desambiguación. Quería mantener dentro de las palabras claves dibujadas dentro del grafo, aquellos nombres propios y lugares que tuvieran cierta frecuencia dentro del corpus de tweets.


Limpieza final


La última limpieza consiste en reemplazar todas las conjugaciones de verbos por infinitivos y todos los plurales por singulares. Si esta limpieza se hace antes, el reconocimiento de nombres y el POS tagger no funcionarán adecuadamente.

Estando el corpus ya limpio, se procede a crear una tabla de frecuencias, es decir, vamos a contar cuántas veces está cada palabra dentro del corpus, de esas palabras seleccionaremos aquellas que tengan una frecuencia más alta, y a partir de ellas, vamos a empezar a crear el grafo.


Representación del grafo


Para la visualización se usó la herramienta gource [3]. Básicamente los que hice fue iterar sobre la lista de tweets. Sobre cada tweet preguntaba en orden descendente con respecto a la frecuencia si la palabra se encontraba dentro del tweet.

Supongamos que nuestra lista de frecuencias era algo como:

    palabra - frecuencia
    "secuestro" - 400
    "liberacion" - 300
    "violencia" - 30


Así, si un tweet contiene las palabras "secuestro" y "liberación", existirá una arista conectando "secuestro" y "liberacion" y, finalmente, "liberacion" tendrá una arista a un nodo que será la representación del tweet.


Para terminar


Esto fue sólo un experimento de fin de semana y la extracción de información usualmente tiene muchos retos. El objetivo de este post es simplemente dar a conocer un poco de qué trata la extracción de información y las herramientas disponibles.

La extracción de información es usada para construir un sistema de preguntas y respuestas que son eficaces para un dominio específico y que al parecer, empieza a ser popular pues algunas compañías están pidiendo sus sistemas automáticos de preguntas y respuestas para sus sitios webs.

Adicionalmente dada la cantidad de información que está siendo generada por los usuarios, muchas compañías están interesadas en aplicar procesamiento del lenguaje natural para saber qué quieren sus clientes o qué opinan sus clientes sobre sus productos. Vale mencionar que también lo están implementando las agencias de seguridad.

Muchas cosas quedaron sin mencionar y aquellas que se mencionaron se podrían mencionar a un nivel más profundo, pero este post ya es suficientemente largo y aburrido así que decidí acortar la idea inicial.

Espero les haya gustado.

@dav009


[1] Tweets per second - http://yearinreview.twitter.com/en/tps.html
[2] http://highwire-dtc.co.uk/2011/05/real-time-twitter-topic-clustering-and-data-visualisation/
[3] http://code.google.com/p/gource/

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate