seminario twitter dynamics

71
TWITTER DYNAMICS Adquisición, procesado y visualización de datos Roberto Maestre [email protected] @rmaestrem F. Javier Alba [email protected] @fjavieralba @paradigmalabs

Upload: paradigma-tecnologico

Post on 26-Jan-2015

116 views

Category:

Technology


1 download

DESCRIPTION

Seminario "Twitter Dynamics" del 19 de enero de 2012

TRANSCRIPT

Page 1: Seminario Twitter Dynamics

TWITTER DYNAMICSAdquisición, procesado y visualización de datos

Roberto [email protected]

@rmaestrem

F. Javier [email protected]

@fjavieralba

@paradigmalabs

Page 2: Seminario Twitter Dynamics

ÍNDICE

IntroducciónAPI Twitter

Adquisición y persistencia de datosConceptos básicos sobre grafos

Visualización en Gephi y GraphStreamCasos de uso

Page 3: Seminario Twitter Dynamics

INTRODUCCIÓN

Page 4: Seminario Twitter Dynamics

INTRODUCCIÓNArquitectura

Page 5: Seminario Twitter Dynamics

INTRODUCCIÓN¿Qué es twitter?

Es una red social basada en microblogging

Red social porque puedo elegir a

quien seguir y que información crear o

retransmitir.

Microblogging porque solo puede postear un texto con un tamaño máximo de 140

carácteres.

Page 6: Seminario Twitter Dynamics

INTRODUCCIÓN

#hashtag

@mención

url.by/

Page 7: Seminario Twitter Dynamics

INTRODUCCIÓNAlgunos números

*** http://blog.twitter.com/2011/03/numbers.html

250 Millones de tweets enviados de media cada día (Octubre 2011) *

460.000 nuevas cuentas abiertas por día (de media en 2010) ***

Incremento del 186 % de usuarios móviles en 2010 ***

100 Millones de usuarios activos estimados (Septiembre 2011) **

* http://techcrunch.com/2011/10/17/twitter-is-at-250-million-tweets-per-day/

** http://techland.time.com/2011/09/09/twitter-reveals-active-user-number-how-many-actually-say-something/

Page 8: Seminario Twitter Dynamics

INTRODUCCIÓN

Page 9: Seminario Twitter Dynamics

INTRODUCCIÓN

Page 10: Seminario Twitter Dynamics

INTRODUCCIÓNCasos de estudio interesantes

Predicción de valores de bolsa (Down Jones Industrial Average) correlacionado con análisis de sentiment de tweets (Bollen et al. 2011).

En Achrekar et al. (2011) se muestra una alta correlación (en datos almacenados entre los años 2009 y 2010) entre el número de tweets relacionados con la gripe y el numero de casos reales.

Una línea de investigación abierta por el DARPA llamada Topic Detection and Tracking research (1996).

Page 11: Seminario Twitter Dynamics

INTRODUCCIÓNCasos de estudio interesantes

Spotinfluence.com

Page 12: Seminario Twitter Dynamics

API DE TWITTER

Page 13: Seminario Twitter Dynamics

INTRODUCCIÓN

Herramienta de acceso a todos los datos del ecosistema Twitter : Tweets, Retweets, Hashtags, Usuarios, ... etc

Para empezar a experimentar, sólo necesitamos conocimientos básicos sobre HTTP y JSON

Page 14: Seminario Twitter Dynamics

INTRODUCCIÓN

• REST API

• Search API

• Streaming API

Consumo puntual de datos

Búsquedas

Consumo masivo de datos

Page 15: Seminario Twitter Dynamics

REST API

• Tweets / retweets

• Followers y Friends

• Mensajes directos

• Listas

• ...

Consulta y creación de:

Page 16: Seminario Twitter Dynamics

REST APIhttps://api.twitter.com/1/trends/766273.json

Page 17: Seminario Twitter Dynamics

REST API

• La API limita la frecuencia a la que podemos realizar peticiones

• Algunos métodos requieren autenticación via OAuth => Límite va contra el usuario autenticado (350 requests/hora)

• Otros pueden ser invocados anónimamente => Límite va contra la IP (150 requests/hora)

¿Cuanta información puedo obtener?

Page 18: Seminario Twitter Dynamics

API RESTAlgunos ejemplos sencillos

Obtener listas en las que se ha incluído a un

usuario

Obtener la red de followers de un

usuario

Page 19: Seminario Twitter Dynamics

REST API

import requestsimport jsonimport sys

user_lists = []max_pages = 5next_cursor = -1

for i in range(0, max_pages):    url = 'https://api.twitter.com/1/lists/memberships.json?screen_name=%s&cursor=%s' % (sys.argv[1], next_cursor)    content = requests.get(url).content    data = json.loads(content)    next_cursor = data['next_cursor']

    for list_data in data['lists']:        name = list_data['name']        uri = list_data['uri']        description = list_data['description']        user_lists.append("%s (%s): %s" % (name, uri, description))

for l in user_lists:    print l

Limitamos páginas de resultados para evitar baneos

Método lists/memberships

Paginación

listas en las que está un usuario

Page 20: Seminario Twitter Dynamics

REST APIif __name__ == "__main__":    # USER    # obtain main user info    main_user_name = sys.argv[1]    main_user_info = obtain_users_info(screen_names=[main_user_name])[0]

    follower_network = { 'nodes' : {},                            'edges': []                        }    follower_network['nodes'][main_user_name] = main_user_info

    try:        traverse_followers(main_user_name, follower_network, 1, MAX_RECURSION_LEVEL)    except RateLimitReachedError as e:        print "Ooops! we reached the rate limit!!! Follower Network will not be complete."    except:        print "Some error occurred!. We will go on with the current Follower Network!"

    generate_tsv(follower_network, main_user_name, 1)    generate_dot(follower_network, main_user_name, 0)

Hash donde almacenamos el grafo

Ficheros de salida

Red de followers de un usuario

Page 21: Seminario Twitter Dynamics

REST APIdef traverse_followers(user_name, follower_network, recursion_level, max_recursion_level):    check_rate_limit()    # retrieve up to MAX_IDS user followers:    url = 'https://api.twitter.com/1/followers/ids.json?screen_name=%s&cursor=-1' % user_name    content = client.get(url).content    data = {}    try:        data = json.loads(content)    except:        print 'Error! rate limit?'        return

    if 'error' in data:        print 'Error: %s' % data['error']        return

    followers_ids = data['ids'][:MAX_IDS]

    #obtain info for each follower (in batches of 100)    for i in range(0, len(followers_ids), 100):        id_group = followers_ids[i:i+100]        followers_info = obtain_users_info(ids = id_group)        if followers_info is not None:            for follower_info in followers_info:                follower_name = follower_info['screen_name']                #add node info (if not exists yet)                if follower_name not in follower_network['nodes']:                    follower_network['nodes'][follower_name] = follower_info                #add edge                follower_network['edges'].append((follower_name, user_name))                follower_network['nodes'][user_name]['indegree'] += 1                if recursion_level < max_recursion_level:                    traverse_followers(follower_name, follower_network, recursion_level+1, max_recursion_level)

Obtener followers IDs

Page 22: Seminario Twitter Dynamics

REST APIdef obtain_users_info(ids = [], screen_names=[]):    check_rate_limit()    result = []    #transform ids into strings:    ids = map(lambda x: str(x), ids)    string_ids = ','.join(ids)    screen_names = ','.join(screen_names)    url = 'https://api.twitter.com/1/users/lookup.json?'    if string_ids and screen_names:         url += 'user_id=%s&screen_name=%s' % (string_ids, screen_names)    elif string_ids:        url += 'user_id=%s' % string_ids    else:        url += 'screen_name=%s' % screen_names    print url    content = client.get(url).content    data = json.loads(content)    if 'error' in data:        print 'Error: %s' % data['error']        return    for user_info in data:        relevant_info = {            'screen_name' : user_info['screen_name'],            'profile_image_url': user_info['profile_image_url'],            'followers_count': user_info['followers_count'],            'indegree' : 0        }        result.append(relevant_info)    return result

Obtener info detallada de cada

follower

Page 23: Seminario Twitter Dynamics

REST API

En el ejemplo almacenamos un hash en memoria con toda la información de la red

Persistimos estos datos en el formato más conveniente para luego visualizarlos: JSON, grafo .DOT, documento en MongoDB ...etc.

Ejemplo “de juguete”: una aplicación real requiere un diseño más elaborado: cache de llamadas, manejo de errores, balanceo de IPs/usuarios...

Page 24: Seminario Twitter Dynamics

SEARCH API

Page 25: Seminario Twitter Dynamics

SEARCH API

Búsqueda de tweets recientes por palabras clave, nombres de usuario, hashtags...

Lenguaje de queries básico con operadores

#dataviz OR #visualization:

http://search.twitter.com/search.json?q=%23dataviz%20OR%20%23visualization&rpp=100&page=1

¿Para qué sirve?

Page 26: Seminario Twitter Dynamics

STREAMING API

• Para un consumo masivo de datos, REST API no es suficiente

• Streaming API es un "chorro" (firehose) de información, cercana al tiempo real, que normalmente filtraremos por algún criterio (hashtag, usuario...)

• Si no filtramos, no obtendremos el 100% del stream de Twitter sino un muestreo del 1% aprox. (es posible obtener más información estableciendo acuerdos con Twitter)

¿Por qué Streaming?

Page 27: Seminario Twitter Dynamics

STREAMING API

curl -d "track=SOPA" https://stream.twitter.com/1/statuses/filter.json -u[USER]:[PASSWD]

• Abrir una conexión con autenticación y mantenerla abierta.

• Procesar el flujo de datos recibido

Ejemplo simple:

¿Cómo usarla?

Page 28: Seminario Twitter Dynamics

RADIOGRAFÍA DE UN TWEET{ "possibly_sensitive": false, "in_reply_to_screen_name": null, "text": "Feeling for students today. Time to prise those unused library cards from your wallets. #wikipediablackout #SOPA #PIPA. ur1.ca/7jygq", "in_reply_to_user_id_str": null, "geo": null, "retweeted": false, "in_reply_to_user_id": null, "contributors": null, "source": "<a href=\"http://www.tweetdeck.com\" rel=\"nofollow\">TweetDeck</a>", "entities": { "user_mentions": [], "hashtags": [ { "text": "wikipediablackout", "indices": [ 88, 106 ] }, { "text": "SOPA", "indices": [ 107, 112 ] }, { "text": "PIPA", "indices": [ 113, 118 ] } ], "urls": [ { "indices": [ 120, 132 ], "url": "ur1.ca/7jygq", "expanded_url": null } ] }, "place": null, "in_reply_to_status_id": null, "id_str": "159589359589408768", "truncated": false, "user": { "profile_background_image_url": "http://a3.twimg.com/profile_background_images/347782654/year_one_wp.jpg", "show_all_inline_media": true, "follow_request_sent": null, "profile_link_color": "038543", "url": "http://www.youtube.com/xboxuk", "followers_count": 755, "profile_image_url": "http://a2.twimg.com/profile_images/78950744/meforweb_normal.jpg", "default_profile_image": false, "statuses_count": 7004, "time_zone": "London", "profile_background_color": "ACDED6", "description": "Xbox LIVE Assistant Producer, EMEA. Views are mine own and open to lucrative sponsorship. All comic/game geeks should visit my side project: KapowGames.com", "contributors_enabled": false, "profile_background_tile": true, "favourites_count": 21, "location": "Camden, London", "lang": "en", "profile_sidebar_fill_color": "F6F6F6", "screen_name": "Deanways", "verified": false, "notifications": null, "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/347782654/year_one_wp.jpg", "friends_count": 2002, "profile_sidebar_border_color": "000000", "protected": false, "id_str": "15864765", "listed_count": 11, "following": null, "name": "Dean Samways", "is_translator": false, "profile_use_background_image": true, "created_at": "Fri Aug 15 16:49:51 +0000 2008", "id": 15864765, "default_profile": false, "geo_enabled": true, "utc_offset": 0, "profile_text_color": "333333", "profile_image_url_https": "https://si0.twimg.com/profile_images/78950744/meforweb_normal.jpg" }, "retweet_count": 0, "favorited": false, "id": 159589359589408770, "created_at": "Wed Jan 18 10:54:03 +0000 2012", "in_reply_to_status_id_str": null, "coordinates": null}

Un Tweet contiene mucha información

Sólo usamos los campos que nos interesan para nuestro procesado y visualización

Page 29: Seminario Twitter Dynamics

RADIOGRAFÍA DE UN TWEET

"text": "RT @damiano10: RAMSS 2012 : 1st International Workshop on Real-Time Analysis and Mining of Social Streams: http://t.co/AhUGF5Pf""id": 159683309528547330,"created_at": "Wed Jan 18 17:07:22 +0000 2012","user": {

"followers_count": 84,"location": "Madrid and Barcelona","screen_name": "paradigmalabs","name": "Paradigma Labs","id_str": "249695469",}

"retweeted_status": {"user": {

"screen_name": "damiano10","location": "Madrid, España","followers_count": 95,"id_str": "132646210", }}

Algunos campos interesantes

Page 30: Seminario Twitter Dynamics

ADQUISICIÓN

Hemos visto ejemplos “de juguete”

Casos de Uso reales

Cuando se necesita una adquisición a mayor escala, se incrementa la complejidad y se requiere una infraestructura mayor

Actualmente tenemos una arquitectura de adquisición en Twitter con 20 servidores dedicados

Page 31: Seminario Twitter Dynamics

API DE TWITTERPara profundizar...

Mining the Social Web

Matthew A. Russel

21 Recipes for Mining Twitter

Matthew A. Russel

Page 32: Seminario Twitter Dynamics

PERSISTENCIA

Page 33: Seminario Twitter Dynamics

PERSISTENCIA DE DATOSDónde

Paradigma noSQL con MongoDB y Spring Data

http://www.parleys.com/#st=5&id=2737

Leonardo Menezes y Miguel Olivares

from pymongo import Connectionimport requestsimport json

# Database configurationport = 0000conn = Connection(’host’, port)db = conn.twittercoll = db.trends

url = ’https://api.twitter.com/1/trends/1.json’content = requests.get(url).contentdata = json.loads(content)

for tt in data[0][’trends’]: coll.save(tt)

Page 34: Seminario Twitter Dynamics

PROCESADO DE DATOSCómo

from pymongo import Connectionimport datetime

# Database configurationport = 0000conn = Connection(’host’, port)db = conn.twittercoll = db.nolesvotes

# Date rangestart = datetime.datetime(2011, 5, 16, 0, 0, 0)end = datetime.datetime(2011, 5, 16, 23, 59, 59)condition = {’created_at’: {’$gte’: start, ’$lt’:end}}

for item in coll.find(condition).sort([("created_at", True)]): # Do something print item

Page 35: Seminario Twitter Dynamics

PERSISTENCIA DE DATOS

#libya Conflicto en Libia: Febrero 2011, 200.000 tweets#nolesvotes Revolución en España: Abril-Agosto 2011, 800.000 tweets

#ows + #15oct Revolución Global: Octubre 2011, 6 Millones de tweets#20n Generales en España, Noviembre 2011, 4 Millones de tweets

#christmas Estudio emocional sobre la Navidad: Diciembre 2011, 10 Millones de tweets#sopa Ley Sopa y Sinde, Enero 2012, 500.000 tweets hasta la fecha

Algunos números de casos reales

Page 36: Seminario Twitter Dynamics

CONCEPTOS SOBRE GRAFOS

Page 37: Seminario Twitter Dynamics

CONCEPTOSModelar una red

A = {{u1, u2}, {u1, u3}, {u2, u3}, {u4, u2}, {u4, u5}, {u5, u2}, {u5, u4}}

V = {u1, u2, u3, u4, u5}

Page 38: Seminario Twitter Dynamics

CONCEPTOSMedir en una red

Ma =

2

66664

0 1 1 0 00 0 1 0 00 0 0 0 00 1 0 0 10 1 0 1 0

3

77775

In(i) =nX

c=0

Ma[i, c]

Out(i) =nX

f=0

Ma[f, i]

Page 39: Seminario Twitter Dynamics

CONCEPTOS

Page 40: Seminario Twitter Dynamics

CONCEPTOS no solo Indegree y Outdegree ...

http://networkx.lanl.gov/

Algorithms• Bipartite• Centrality• Chordal• Clique• Clustering• Communities• Components• Cores• Cycles• Directed Acyclic Graphs• Distance Measures• Distance-Regular Graphs• Eulerian• Flows• Graphical degree sequence• Isolates• Isomorphism• Link Analysis• Minimum Spanning Tree• Products• Shortest Paths

Page 41: Seminario Twitter Dynamics

VISUALIZACIÓN EN GEPHI

Page 42: Seminario Twitter Dynamics

GEPHI

• Herramienta interactiva de visualización y exploración de redes y grafos hecha en JAVA

• Es Open Source y multiplataforma

• “Photoshop for Data”

Page 43: Seminario Twitter Dynamics

GEPHI

• Facilita el trabajo de Análisis de datos con:

• Layouts predefinidos y configurables

• Cálculo de métricas sobre redes

• Filtrado de nodos en base a atributos

• Clustering

• “Data Laboratory”

• Plug-ins

Page 44: Seminario Twitter Dynamics

GEPHI

• Vamos a visualizar la red de followers que generamos en el ejemplo anterior (REST API)

• Para ello se persistieron los datos en un formato entendible por Gephi (en este caso .DOT)

Ejemplo de Uso

Page 45: Seminario Twitter Dynamics

GEPHI

Page 46: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Page 47: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

¿Qué es Graph Stream?

Es una librería en JAVA para el manejo de grafos dinámicos y estáticos.

Hospedado en la Universidad de Le Havre.

Mantenida por miembros del grupo de investigación RI2C .

Tres librerias: Core, Algo y UI.

Page 48: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAMCaracteristicas importantes

Podemos configurar “el aspecto” de los grafos de la misma manera que un CSS puede modificar el aspecto

de un HTML.

Page 49: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAMCaracteristicas importantes

Podemos configurar “el aspecto” de los grafos de la misma manera que un CSS puede modificar el aspecto

de un HTML.

graph.addAttribute("ui.stylesheet",  "graph  {  fill-­‐color:  red;  }");

node.addAttribute("ui.style",  "fill-­‐color:  rgb(0,100,255);");

graph  {        fill-­‐color:  red;}node  {        size:  10px,  15px;        shape:  box;        fill-­‐color:  green;        stroke-­‐mode:  plain;        stroke-­‐color:  yellow;}

Page 50: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAMCaracteristicas importantes

Podemos crear un video a partir de la generación de imagenes del grafo.

OutputPolicy outputPolicy = OutputPolicy.BY_ELEMENT_EVENT; OutputType type = OutputType.JPG; Resolution resolution = Resolutions.HD720;

// Start output images FileSinkImages fsi = new FileSinkImages( "/tmp/img", type, resolution, outputPolicy); fsi.setRenderer(RendererType.SCALA); fsi.setLayoutPolicy( LayoutPolicy.COMPUTED_IN_LAYOUT_RUNNER );

// Set quality output fsi.setQuality(Quality.HIGH); fsi.setStyleSheet("graph { padding: 50px; fill-color: black; }");

// Link output with graph g.addSink(fsi);

Page 51: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Algunos ejemplos

Visualizar los

followers de un

usuario.

Visualizar los followers de un

usuario y mostrar este numero implícito en el

tamaño del nodo

Visualizar los followers de un

usuario y mostrar este numero implícito en el

tamaño del nodo y añadir las

imagenes de los usuarios.

Page 52: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Algunos ejemplos

Visualizar los

followers de un

usuario.

Page 53: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Algunos ejemplos

Visualizar los followers de un

usuario y mostrar este numero implícito en el

tamaño del nodo

Page 54: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Algunos ejemplos

Visualizar los followers de un

usuario y mostrar este numero implícito en el

tamaño del nodo y añadir las

imagenes de los usuarios.

Page 55: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Código

// Create graphGraph g = new DefaultGraph("g");

// Display in real time consoleg.display(true);

// Set some quality paramsg.addAttribute("ui.antialias");g.addAttribute("ui.quality");g.addAttribute("ui.stylesheet",

"graph { fill-color: black; }");

Page 56: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Código

public static void addNode(Graph g, String nodeLabel, double size, String url){ if (g.getNode(nodeLabel) == null){ if (size < 0.0) size = 1.0; g.addNode(nodeLabel);

Node n = g.getNode(nodeLabel); size = size * 2.0; System.out.println("=> "+size); String shape = "rounded-box"; if (size > 20.0) shape = "cross"; n.addAttribute("ui.style" , String.format("size: %spx, %spx; fill-color: #3d5689;

shape: %s; text-size: %s; stroke-mode: plain; stroke-color: yellow; text-color:white;",20, 20, "circle", size/2));

n.setAttribute("label",nodeLabel); } }

Page 57: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Código

public static void addEdge(Graph g, String from, String to, double weight){ if (g.getNode(from) != null && g.getNode(to) != null &&

g.getEdge(from+to) == null && g.getEdge(to+from) == null){

g.addEdge(from+to, from, to, true);

Edge e = g.getEdge(from+to);

if (weight < 0.0) weight = 1.0;

e.addAttribute("ui.style" , String.format("fill-color: #3d5689; size: %s;", weight)); } }

Page 58: Seminario Twitter Dynamics

VISUALIZACIÓN GRAPHSTREAM

Código

public static void changeNode(Graph g, String nodeLabel, double size){ if (g.getNode(nodeLabel) != null){

if (size < 0.0) size = 2.0;

Node n = g.getNode(nodeLabel);

String shape = "rounded-box"; if (size > 20.0){ shape = "cross"; }

n.addAttribute("ui.stylesheet" , String.format("size: %spx, %spx;shape: %s; text-size: %s; ", size, size, shape, size/2));

} }

Page 59: Seminario Twitter Dynamics

CASOS DE USO

Page 60: Seminario Twitter Dynamics

CASO DE USO 1Identificación de influenciadores en una red

from pymongo import Connection import datetime

# Database configurationconn = Connection(‘host’, 000000)db = conn.twittercoll = db.nolesvotes

# Search conditionsstart = datetime.datetime(2011, 5, 16, 18, 0, 0)end = datetime.datetime(2011, 5, 16, 18, 59, 59)cond = {’retweeted_status’: {’$exists’: True} , ’created_at’: {’$gte’: start, ’$lt’:end}}

# Variable to save the network structurenetwork = ’’# Perform searchfor item in coll.find(cond).sort([("created_at", True)]): network += ’\t%s -> %s\n’ % (item[’user’][’screen_name’] ,

item[’retweeted_status’][’user’][’screen_name’])# Save data into a filefile_out = file(’/tmp/retweet_network.dot’ , ’w’)file_out.write(’digraph G{\n%s}’ % network)file_out.close()

Page 61: Seminario Twitter Dynamics

CASO DE USO IIAgrupando hashtags con MI*

rt @coriano2323: acampadabcn - plaça catalunya, http://bit.ly/ikkkaa #acampadasol #spanishrevolution #15mani #nolesvotes rt @ximicomix: rt @lexdubia rt @ma 20:00 en sol. convocatoria ciudadana. pasalo. #acampadasol #spanishrevolution #nolesvotes rt @megasuavi: comunicación horizontal usar #meneame para difundir todo sobre #acampadasol y #nolesvotes adio a los grandes rt @abelokeponemos: un apoyo a todos los que han llevado la #spanishrevolution con muchisimo ánimo! (: recordad... #nolesvotes

{#acampadasol, #spanishrevolution, #15mani, #nolesvotes, #meneame}

Mi =

2

66664

0 3.66 2.41 6 2.413.66 0 2.41 6 02.41 2.41 0 2 06 6 2 0 2

2.41 0 0 2 0

3

77775

F = {3, 3, 1, 4, 1}

*(Chart K. et all 1998)

I(X;Y ) =

X

x2X

X

y2Y

p(x, y) ⇤ log✓

p(x, y)

p(x)p(y)

Page 62: Seminario Twitter Dynamics

CASO DE USO IIAgrupando hashtags con MI*

Page 63: Seminario Twitter Dynamics

Geolocalización de tweets

http://labs.paradigmatecnologico.com/2011/12/19/15th-october-on-twitter-global-revolution-mapped/

Page 64: Seminario Twitter Dynamics

Mutual Information with time component

Page 65: Seminario Twitter Dynamics

Mutual Information with time component

Page 66: Seminario Twitter Dynamics

estamos investigando/desarrollando ...

Estudio de las distintas topologias de red y su dinámicasen el tiempo

Métricas para la detección de influenciadores por dominio

Detección de emergencia con Fuzzy hashtags

... como visualizar todo esto?

Page 67: Seminario Twitter Dynamics

estamos investigando/desarrollando ...

... como visualizar todo esto?

Smart Offices: Internet de las cosas aplicadas a crear el ambiente óptimo de trabajo utilizando Arduino

TwitterMaps. Mapa interactivo para entender twitter día a día con Processing

API pública de análisis de texto: NER, contexto basado en grafo semántico de Wikipedia y Sentiment Analysis.

Desarrollo de herramientas enfocadas al periodismo de datos

Page 68: Seminario Twitter Dynamics

Harshavardhan Achrekar, Ross Lazarus, and West Cummings Park. Predicting Flu Trends using Twitter Data. Architecture, pages 702–707, 2011.

Ron Bekkerman and Koby Crammer. One-class clustering in the text domain. Proceedings of the Conference on Empirical Methods in Natural Language Processing - EMNLP ’08, page 41, 2008. doi: 10.3115/1613715.1613722. URL http://portal.acm.org/citation.cfm?doid=1613715.1613722.

Johan Bollen, Huina Mao, and Xiao-jun Zeng. Twitter mood predicts the stock market. Journal of Computational Science, pages 1–8, 2011. URL http://www.sciencedirect.com/science/article/ pii/S187775031100007X.

B Bollobás. Modern Graph Theory, volume 184 of Graduate Texts in Mathematics. Springer, 1998. ISBN 0387984887. doi: 10.1234/12345678. URL http://www.springer.com/math/numbers/book/ 978-0-387-98488-9.

Francine Chen, Ayman Farahat, and Thorsten Brants. Multiple similarity measures and source-pair in- formation in story link detection. In Proceedings of the 2nd Human Language Technology Conference of the North American Chapter of the Association for Computational Linguistics, Boston, MA, USA, pages 313–320, 2004. URL http://acl.ldc.upenn.edu/hlt-naacl2004/main/pdf/18_Paper.pdf.

Thomas M J Fruchterman and Edward M Reingold. Graph drawing by force-directed placement. Soft- ware Practice and Experience, 21(11):1129–1164, 1991. ISSN 00380644. doi: 10.1002/spe.4380211102. URL http://doi.wiley.com/10.1002/spe.4380211102.

Bruce Hendrickson and Robert Leland. A multilevel algorithm for partitioning graphs. In Proceedings of the 1995 ACM/IEEE conference on Supercomputing (CDROM), page 28. ACM, 1995. URL http://dl.acm.org/citation.cfm?id=224228.

REFERENCIAS

Page 69: Seminario Twitter Dynamics

Yoshihiro Kawano, Yoshito Kishimoto, and Tatsuhiro Yonekura. A Prototype of Attention Simulator on Twitter. 2011 14th International Conference on Network-Based Information Systems, pages 173– 177, September 2011. doi: 10.1109/NBiS.2011.51. URL http://ieeexplore.ieee.org/lpdocs/ epic03/wrapper.htm?arnumber=6041919.

Stephen G Kobourov. Force-Directed Drawing Algorithms. University of Arizona, 2004. ISBN 0849385970.

Eldar Sadikov and M.M.M. Martinez. Information Propagation on Twitter. CS322 Project Report, 2009. URL http://snap.stanford.edu/class/cs224w-2010/proj2009/TwitterWriteup_Sadikov.pdf.

Maksim Tsvetovat and Alexander Kouznetsov. Social Network Analysis for Startups. Oreilly & Associates Inc, 2011. ISBN 9781449306465. URL http://books.google.com/books?hl=en&amp; lr=&amp;id=Tn-L5WoCeygC&amp;oi=fnd&amp;pg=PR3&amp;dq=Social+Network+Analysis+for+ Startups&amp;ots=SS7Zs6D9wb&amp;sig=A0oZKZ_bBlXNnSjyZmf3vI6HAkM.

Zhiheng Xu, Long Ru, Liang Xiang, and Qing Yang. Discovering User Interest on Twitter with a Mod- ified Author-Topic Model. 2011 IEEE/WIC/ACM International Conferences on Web Intelligence and Intelligent Agent Technology, pages 422–429, August 2011. doi: 10.1109/WI-IAT.2011.47. URL http://ieeexplore.ieee.org/lpdocs/epic03/wrapper.htm?arnumber=6040707.

Yuto Yamaguchi, Toshiyuki Amagasa, and Hiroyuki Kitagawa. Tag-based User Topic Discovery Using Twitter Lists. 2011 International Conference on Advances in Social Networks Analysis and Mining, pages 13–20, July 2011. doi: 10.1109/ASONAM.2011.58. URL http://ieeexplore.ieee.org/ lpdocs/epic03/wrapper.htm?arnumber=5992580.

Hua Zhao. Applying Dynamic Co-occurrence in Story Link Detection. Journal of Computing and Information Technology, pages 157–164, 2009. ISSN 1330-1136. doi: 10.2498/cit.1001104. URL http://cit.zesoi.fer.hr/browsePaper.php?paper=1104.

REFERENCIAS

Page 70: Seminario Twitter Dynamics

Liyong Zhao, Chongchong Zhao, Jingqin Pang, and Jianyi Huang. Sensitive Topic Detection Model Based on Collaboration of Dynamic Case Knowledge Base. 2011 IEEE 20th International Workshops on Enabling Technologies: Infrastructure for Collaborative Enterprises, pages 156–161, June 2011. doi: 10.1109/WETICE.2011.29. URL http://ieeexplore.ieee.org/lpdocs/epic03/wrapper. htm?arnumber=5990044.

REFERENCIAS

Page 71: Seminario Twitter Dynamics

Muchas gracias

Para cualquier duda, sugerencia o colaboración

Roberto [email protected]

@rmaestrem

F. Javier [email protected]

@fjavieralba

@paradigmalabs