Usando Twitter para sintetizar informes y trabajar colaborativamente: el Informe de la CNC

Javier de la Cueva
Tags: Twitter.

Uno de los problemas que todos tenemos actualmente es el de la gestión del exceso de información. Si bien tenemos herramientas ya tradicionales, no está de más explorar las nuevas posibilidades que la tecnología ofrece.

La primera noticia que tuve de la publicación del Informe de la Comisión Nacional de la Competencia (CNC) de diciembre de 2009 fue mediante un tweet de Miriam Ruiz a las 18:00 horas del día 19 de enero. Lo comentamos por teléfono brevemente David Bravo y yo, quien también ya había descargado el informe, y una vez acabada nuestra jornada laboral, ambos nos pusimos a estudiarlo.

El informe de la CNC consta de 99 folios y en lugar de imprimirlo e ir subrayando las partes relevantes, decidí utilizar Twitter para sintetizarlo, permitiendo de esa manera compartir mis impresiones con David y ya, de paso, con las demás personas. Para ello, utilicé el hashtag #cnc, solicitando perdón por el ruido que iba a producir:

Perdón a todos los followers por este #cnc spam, (luego uso la api de twitter, parseo mi timeline y ya tengo mis notas)

Paso a explicar cómo uso la API de Twitter para obtener las notas a las que me refería y las herramientas que utilizo para ello, por si fueren de utilidad para otras personas. Asimismo, transcribo más abajo las notas y los enlaces a los tweets, ofreciendo de esta manera un resumen del Informe de la Comisión Nacional de la Competencia sobre el monopolio de las Entidades de Gestión.

En primer lugar y para interactuar con la API de Twitter, utilizo el script en Python mytweets, de Simon Willison, uno de los autores de Investigate the MPs expenses, la magnífica herramienta del periódico The Guardian para analizar los gastos de los parlamentarios británicos.

Para instalar y utilizar mytweets, los pasos son los siguientes desde consola:

1. Clonar el repositorio:

git clone git://github.com/simonw/mytweets.git

2. Crear en el mismo directorio del script el archivo de configuración config.py con los siguientes parámetros:

USERNAME = ‘nombre-de-usuario’
PASSWORD = ‘contraseña-de-twitter’

3. Ejecutar el comando:

python fetch.py

4. Todos los tweets del usuario quedarán guardados en formato json en un archivo llamado my_tweets.json, que es una lista de diccionarios del que ofrezco un ejemplo:

{u'created_at': u'Fri Dec 04 14:12:11 +0000 2009',
u'favorited': False,
u'geo': None,
u'id': 6337691951L,
u'in_reply_to_screen_name': None,
u'in_reply_to_status_id': None,
u'in_reply_to_user_id': None,
u'source': u'web',
u'text': u'Muy interesante del #manifiesto ha sido lo distribuido. 
Antes, todos firmaban en una página, ahora todos son su página.',
u'truncated': False}
Las llaves que me interesan del anterior diccionario son id (del que podremos luego extraer la URI del tweet), created_at (fecha de creación) y text. Para tratar el contenido de my_tweets.json, he creado un archivo en el mismo directorio llamado functions.py, con el siguiente código:
from config import USERNAME
URL_STATUS = "http://twitter.com/%s/status/" % USERNAME

def extract_hashtag(hashtag, tweets):
    "Extracts tweets with the selected hashtag"
    tagged_tweets = []
    for item in tweets:
        if hashtag in item['text']:
            created_at = item['created_at']
            url = URL_STATUS + str(item['id'])
            text = item['text']
            data = {'created_at': created_at,
                    'url': url,
                    'text': text}
            tagged_tweets.append(data)
    return tagged_tweets

def save_file(tagged_tweets, filename):
    "Saves file inserting hyperlinks to each tweet"
    f = open(filename, 'w')
    for item in tagged_tweets:
        text = "%s: %s\n" % (item['url'],
                                          item['created_at'],
                                          item['text'])
        f.write(text.encode('utf-8'))
    f.close()

Iniciamos el intérprete ipython y cargamos el anterior archivo:

run functions.py

Importamos el archivo my_tweets.json:

import json tweets = json.load(open('my_tweets.json'))

Ejecutando desde el intérprete la función extract_hashtag extraemos los hashtags que nos interesan, en este caso #cnc:

tagged_tweets = extract_hashtag('#cnc', tweets)

Para guardar la selección obtenida, utilizamos la función save_file. Esta última función genera asimismo el código HTML de los enlaces a la URL donde se halla el tweet.

save_file(tagged_tweets, 'cnc.txt')

Salimos del intérprete de Python y tenemos un archivo de texto denominado ‘cnc.txt’. El resultado de la extracción del hashtag #cnc me ofrece el resumen de las partes del informe que creí conveniente sintetizar. El texto que transcribo a continuación está directamente copiado y pegado del archivo ‘cnc.txt’ generado por las funciones anteriores.

Tue Jan 19 20:36:21 +0000 2010: televisiones y radios aglutinan casi un 50% de la recaudación de la SGAE #cnc

Tue Jan 19 20:37:33 +0000 2010: Según Balance de Situación de SGAE al cierre del ejercicio 2008, los derechos pendientes de reparto ascendían a 164,3 MM euros #cnc

Tue Jan 19 20:39:30 +0000 2010: En 2007 total derechos: 413,7 millones euros. 87,7% titulares nacionales, 12,3% restante titulares otros países #cnc

Tue Jan 19 20:41:59 +0000 2010: Alguien cree que en nuestro país se consume más entretenimiento nacional que extranjero? Se está birlando a los autores de fuera? #cnc

Tue Jan 19 20:43:49 +0000 2010: SGAE, 600 titulares (un 1,7% del total de titulares beneficiarios) concentran el 75% de lo que se reparte #cnc pag 27

Tue Jan 19 20:55:32 +0000 2010: En los casos en que directiva europea permite gestión opcional el legislador español impone gestión obligatoria #cnc 38

Tue Jan 19 20:57:16 +0000 2010: la LPI no justifica por qué se restringe la libertad individual de los titulares #cnc 39

Tue Jan 19 21:03:14 +0000 2010: Perdón a todos los followers por este #cnc spam, (luego uso la api de twitter, parseo mi timeline y ya tengo mis notas)

Tue Jan 19 21:04:58 +0000 2010: La mera suposición de que los titulares decidirían la gestión colectiva no es justificación para imponer su obligatoriedad #cnc 39

Tue Jan 19 21:06:21 +0000 2010: Para esta misma situación, las Directivas europeas no imponen la gestión colectiva obligatoria #cnc 39

Tue Jan 19 21:13:00 +0000 2010: Periodos excesivos de duración del contrato o de obligación de preaviso dificultan la movilidad de los titulares #cnc 45

Tue Jan 19 21:13:41 +0000 2010: No existen razones que justifiquen una duración tan dilatada de los contratos de gestión #cnc 46

Tue Jan 19 21:15:37 +0000 2010: la gestión individal refuerza el derecho moral de los autores #cnc 48

Tue Jan 19 21:18:06 +0000 2010: Las tarifas no tienen en cuenta el uso efectivo #cnc 50

Tue Jan 19 21:19:14 +0000 2010: La falta de transparencia sobre los repertorios incide negativamente en la competencia #cnc 52

Tue Jan 19 21:21:46 +0000 2010: Hay una ausencia de control ex-ante sobre las tarifas #cnc 53

Tue Jan 19 21:22:30 +0000 2010: No existe ningún tipo de supervisión de las tarifas por parte de la autoridad competente #cnc 53

Tue Jan 19 21:24:08 +0000 2010: Las obligaciones de la LPI son muy generales, inadecuadas e insuficientes para contrarrestar posición monopolística de las EEGG #cnc 54

Tue Jan 19 21:25:41 +0000 2010: Las Comunidades Autónomas no han ejercido ningún tipo de función sobre las entidades de gestión #cnc 56

Tue Jan 19 21:29:26 +0000 2010: TS: el silencio d MCult sobre tarifas no significa su aprobación tácita o sean equitativas, en contra d lo dicho por las EEGG #cnc 56

Tue Jan 19 21:30:10 +0000 2010: Hay una ineficacia de los mecanismos de negociación #cnc 56

Tue Jan 19 21:31:33 +0000 2010: El contexto legal actual no incentiva a las EEGG a fijar tarifas equitativas ni a negociar tarifas equitativas con los usuarios #cnc 57

Tue Jan 19 21:35:12 +0000 2010: El artículo 157.2 de la LPI ahonda en el desequilibrio de la negociación #cnc 57

Tue Jan 19 21:36:03 +0000 2010: Hay una ausencia de un control ex-post eficaz en la negociación de las tarifas #cnc 58

Tue Jan 19 21:37:12 +0000 2010: La principal razón que explica la ineficacia de la CPI es precisamente su naturaleza arbitral extendida a su función mediadora #cnc 60

Tue Jan 19 21:38:34 +0000 2010: La CPI no se ha convertido en un mecanismo eficaz para solventar los conflictos para cuya resolución fue creada #cnc 61

Tue Jan 19 21:39:47 +0000 2010: Muchos países disponen de un control ex-post más fuerte que el aplicado en España #cnc 63

Tue Jan 19 21:42:02 +0000 2010: Posición monopolística de EEGG da lugar a problema tarifario fundamental: la fijación de tarifas inequitativas y/o discriminatorias #cnc 64

Tue Jan 19 21:45:11 +0000 2010: Las EEGG cobran precios distintos a distintos tipos de usuarios por la utilización del mismo repertorio #cnc 65

Tue Jan 19 21:46:46 +0000 2010: El problema en torno a la equidad de las tarifas que fijan las entidades de gestión es recurrente en este sector #cnc 66

Tue Jan 19 21:48:37 +0000 2010: Las tarifas que no tienen en cuenta el uso efectivo generan distorsiones en la asignación de recursos #cnc 69

Tue Jan 19 21:50:25 +0000 2010: El progreso tecnológico y la digitalización permiten en muchos casos monitorizar el uso a un coste razonable (pero no se hace) #cnc 71

Tue Jan 19 21:52:37 +0000 2010: No existe la suficiente transparencia con respecto a los repertorios #cnc 74

Tue Jan 19 21:54:39 +0000 2010: Hay numerosas resoluciones de la CNC sobre discriminación en las tarifas #cnc 77

Tue Jan 19 21:58:33 +0000 2010: Las conclusiones hay que leerlas todas pero: la LPI constituye un marco legal muy restrictivo de la competencia #cnc 81

Tue Jan 19 21:59:17 +0000 2010: Las facultades que la LPI asigna a las Administraciones Públicas son muy generales y ambiguas, y sin ningún poder sancionador #cnc 82

Tue Jan 19 22:01:04 +0000 2010: La CNC considera que debe realizarse una revisión integral de la LPI en materia de gestión colectiva #cnc 84

Tue Jan 19 22:01:45 +0000 2010: La competencia requiere de modelos de gestión colectiva distintos al existente #cnc 84

Tue Jan 19 22:02:29 +0000 2010: Para introducir competencia es preciso apostar por la libertad de gestión #cnc 85

Tue Jan 19 22:08:00 +0000 2010: No es d todo descartable según jurisprudencia comunitaria que España sea responsable d infracción del artículo 86 del Tratado CE #cnc 86

Tue Jan 19 22:08:45 +0000 2010: Deberá procederse a la revisión general de la LPI #cnc 86

Wed Jan 20 00:24:46 +0000 2010: Trabajando #cnc

Tras comentar con David Bravo el contenido del informe ya estudiado por ambos, habiéndolo releído nuevamente, repasar las notas tomadas mediante Twitter y coincidir ambos en el análisis jurídico, procedimos sobre las 00:24 horas a redactar la denuncia, escribir conjuntamente el artículo para nuestros blogs, subir las plantillas al repositorio de los Procedimientos Libres y poner la acción legal a disposición pública. A las 01:48 horas, ya todo estaba finalizado y nacía el quinto de los Procedimientos Libres. A las 02:12 y 02:15 horas del 20 de enero, el tiempo de repasar todo lo publicado, lo anunciamos en Twitter. Del resto ya se ha encargado la Red.

Tweet de David Bravo 02:12: Madrugando con @jdelacueva. Denuncia contra el Estado español por el monopolio de las entidades de gestión: http://tinyurl.com/ykyuk6g

Tweet de Javier de la Cueva 02:15: Junto con @dbravo Denuncia contra el Estado español por el monopolio de las entidades de gestión http://bit.ly/7QXxZ2

No creo que cuando se creara Twitter se pudiera pensar en su utilización como herramienta de síntesis de informes, pero la experiencia con este nuevo método de trabajo colaborativo ha resultado muy satisfactoria, si bien es mejorable puesto que, para no producir ruido a los seguidores de Twitter, el usuario podría crear una cuenta destinada especialmente para su labor de síntesis de textos.

No hace falta decir que los scripts descritos sirven para seleccionar cualquier otra información de nuestro timeline de Twitter y no sólo los hashtags, utilizando para ello la función extract_hashtag y guardando después el resultado en un archivo de texto plano:

text_pattern = "Texto de nuestros tweets que deseamos seleccionar y guardar" tagged_tweets = extract_hashtag(text_pattern, tweets) save_file(tagged_tweets, 'filename.txt')