Visualización de datos de correo

Si has llegado hasta este punto del tutorial, ya debes de estar bastante familiarizado con nuestros ficheros de datos mbox-short.txt y mbox.txt. Ahora es el momento de llevar nuestro análisis de datos de correo electrónico al siguiente nivel.

En el mundo real, a veces se tienen que descargar datos de correo desde los servidores. Eso podría llevar bastante tiempo y los datos podrían tener inconsistencias, estar llenos de errores, y necesitar un montón de limpieza y ajustes. En esta sección, trabajaremos con la aplicación más compleja que hemos visto hasta ahora, que descarga casi un gigabyte de datos y los visualiza.

Puedes descargar la aplicación desde:

www.py4e.com/code3/gmane.zip

Utilizaremos los datos de un servicio de archivo de listas de correo electrónico libre, llamado www.gmane.org. Este servicio es muy popular en proyectos de código abierto, debido a que proporciona un buen almacenaje con capacidad de búsqueda de su actividad de correo. También tienen una política muy liberal respecto al acceso a los datos a través de su API. No tienen límites de acceso, pero te piden que no sobrecargues su servicio y descargues sólo aquellos datos que necesites. Puedes leer los términos y condiciones de gmane en su página:

http://gmane.org/export.php

Es muy importante que hagas uso de los datos de gname.org con responsabilidad, añadiendo retrasos en tu acceso a sus servicios y extendiendo la realización de los procesos de larga duración a periodos de tiempo lo suficientemente largos. No abuses de este servicio libre y lo estropees para los demás.

Al usar este software para rastrear los datos de correo de Sakai, se generó casi un gigabyte de datos, requiriendo una cantidad considerable de ejecuciones durante varios días. El archivo README.txt del ZIP anterior contiene instrucciones sobre cómo descargar una copia pre-rastreada del archivo content.sqlite con la mayor parte del contenido de los correos de Sakai, de modo que no tengas que rastrear durante cinco días sólo para hacer funcionar los programas. Aunque descargues el contenido pre-rastreado, deberías ejecutar el proceso de rastreo para recuperar los mensajes más recientes.

El primer paso es rastrear el repositorio gmane. La URL base se puede modificar en gmane.py, y por defecto apunta a la lista de desarrolladores de Sakai. Puedes rastrear otro repositorio cambiando la url base. Asegúrate de borrar el fichero content.sqlite si realizas el cambio de url.

El archivo gmane.py opera como una araña caché responsable, que funciona despacio y recupera un mensaje de correo por segundo para evitar ser bloqueado por gmane. Almacena todos sus datos en una base de datos y puede ser interrumpido y reanudado tantas veces como sean necesarias. Puede llevar muchas horas descargar todos los datos. De modo que quizá debas reanudarlo varias veces.

He aquí una ejecución de mane.py recuperando los últimos cinco mensajes de la lista de desarrolladores de Sakai:

El programa revisa content.sqlite desde el principio hasta que encuentra un número de mensaje que aún no ha sido rastreado y comienza a partir de ahí. Continúa rastreando hasta que ha recuperado el número deseado de mensajes o hasta que llega a una página que no contiene un mensaje adecuadamente formateado.

A veces gmane.org no encuentra un mensaje. Tal vez los administradores lo borraron, o quizás simplemente se perdió. Si tu araña se detiene, y parece que se atasca en un mensaje que no puede localizar, entra en SQLite Manager, añade una fila con el id perdido y los demás campos en blanco y reinicia gmane.py. Así se desbloqueará el proceso de rastreo y podrá continuar. Esos mensajes vacíos serán ignorados en la siguiente fase del proceso.

Algo bueno es que una vez que has rastreado todos los mensajes y los tienes en content.sqlite, puedes ejecutar gmane.py otra vez para obtener los mensajes nuevos según van siendo enviados a la lista.

Los datos en content.sqlite están guardados en bruto, con un modelado de datos ineficiente y sin comprimir. Esto se ha hecho así intencionadamente, para permitirte echar un vistazo en content.sqlite usando SQLite Manager y depurar problemas con el proceso de rastreo. Sería mala idea ejecutar consultas sobre esta base de datos, ya que puede resultar bastante lenta.

El segundo proceso consiste en ejecutar el programa gmodel.py. Este programa lee los datos en bruto de content.sqlite y produce una versión limpia y bien modelada de los datos, que envía al fichero index.sqlite. Este fichero es mucho más pequeño (puede ser 10 veces menor) que content.sqlite, porque también comprime la cabecera y el texto del cuerpo.

Cada vez que gmodel.py se ejecuta, borra y reconstruye index.sqlite. Esto permite ajustar sus parámetros y editar las tablas de asignación de content.sqlite para ajustar el proceso de limpieza de datos. Esto es un ejemplo de ejecución de gmodel.py. El programa imprime una línea en pantalla cada vez que son procesados 250 mensajes de correo para que puedas ver su evolución, ya que puede quedarse funcionando durante un buen rato mientras procesa alrededor de un Giga byte de datos de correo.

El programa gmodel.py maneja una serie de tareas de limpieza de datos.

Los nombres de dominio son truncados a dos niveles para .com, .org, .edu y .net. Otros nombres de dominio son truncados a tres niveles. De modo que si.umich.edu se transforma en umich.edu, y caret.cam.ac.uk queda como cam.ac.uk. Las direcciones de correo electrónico también son transformadas a minúsculas, y algunas de las direcciones de @gmane.org, como la siguiente…

…son convertidas en direcciones reales, cuando esa dirección de correo real existe en otra parte del cuerpo del mensaje.

En la base de datos mapping.sqlite existen dos tablas que te permiten asignar tanto nombres de dominios como direcciones de correo individuales que van cambiando a lo largo del tiempo de existencia de la lista de correo. Por ejemplo, Steve Githens ha usado las direcciones de correo siguientes, según iba cambiando de trabajo a lo largo de la existencia de la lista de desarrolladores de Sakai:

Podemos añadir dos entradas en la tabla de asignación (Mapping) de mapping.sqlite, de modo que gmodel.py enlazará las tres direcciones en una:

Puedes crear entradas similares en la tabla DNSMapping si hay múltiples nombres DNS que quieres asignar a una única DNS. En los datos de Sakai se ha realizado la siguiente asignación…

…de modo que todas las cuentas de los distintos campus de las Universidades de Indiana son monitorizadas juntas.

Puedes volver a ejecutar gmodel.py una y otra vez mientras vas mirando los datos, y añadir asignaciones para hacer que los datos queden más y más limpios. Cuando lo hayas hecho, tendrás una bonita versión indexada del correo en index.sqlite. Éste es el archivo que usaremos para analizar los datos. Con ese archivo, el análisis de datos se realizará muy rápidamente.

El primer y más sencillo análisis de datos consistirá en determinar “¿Quién ha enviado más correos?”, y “¿Qué organización ha enviado más correos?”. Esto se realizará usando gbasic.py:

Fíjate cómo gbasic.py funciona mucho más rápido que gmane.py, e incluso que gmodel.py. Todos trabajan con los mismos datos, pero gbasic.py está usando los datos comprimidos y normalizados de index.sqlite. Si tienes un montón de datos que gestionar, un proceso con varios pasos como el que se realiza en esta aplicación puede ser más largo de desarrollar, pero te ahorrará un montón de tiempo cuando realmente comiences a explorar y visualizar los datos.

Puedes generar una vista sencilla con la frecuencia de cada palabra en las líneas de título, usando el archivo gword.py:

Esto genera el archivo gword.js, que puedes visualizar utilizando gword.htm para producir una nube de palabras similar a la del comienzo de esta sección, gline.py genera también una segunda vista. En este caso cuenta la participación en forma de correos de las organizaciones a lo largo del tiempo.

Su resultado es guardado en gline.js, que se puede visualizar usando gline.htm.

Esta aplicación es relativamente compleja y sofisticada, y dispone de características para realizar recuperación de datos reales, limpieza y visualización.