Está en la página 1de 21

Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Minería de Datos con Twitter y Python

Gustavo H. Echeverry Franco

Cod: 2141324

gecheverryf@juanambu.edu.co

Estudiante Ing. Informática

RESUMEN:

Twitter es un medio de comunicación que durante los últimos años ha sido un referente para
analizar las tendencias en una amplia variedad de ámbitos. A partir de mensajes cortos
muchas de las grandes compañías dan a conocer importantes decisiones que se toman con
respecto a productos y servicios que ofrecen. La gran cantidad de información recolectada en
Twitter presenta una oportunidad invaluable para analistas de datos que a través de
sencillas herramientas pueden realizar análisis valiosos acerca de mercados y tendencias que
sirven para la toma de decisiones. Este trabajo aborda un paso a paso a través de simples
programas realizados en Python sobre información recolectada a través de APIs que ofrece
Twitter a sus clientes.

Palabras Claves: Twitter, Python, Minería de Datos, Big Data, Análisis.

ABSTRACT

Twitter is a communication way that for the past years has been a benchmark analyzing the
trends in a wide variety of areas. Short message from big companies show important
decisions taken with regard to products and services offered. The large amount of information
collected on Twitter presents an invaluable opportunity for analysts of data that through
simple tools can do a valuable analysis about markets and trends that are used in decision-
making. This paper deals with a step by step through simple programs using Python over
information collected through APIs offered by Twitter.

Keywords: Twitter, Python, Data Mining, Big Data, Analysis.


Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

RECOMENDACIONES:

Para esta práctica se utilizara una máquina virtual preinstalada con Ubuntu 15.10 (Virtual
Box o VMware) tomada del sitio web http://www.osboxes.org/ la cual se recomienda utilizar
para evitar problemas de compatibilidad. La imagen se incluye con el proyecto.
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Capítulo 1. Recolección de datos

REGISTRO DE LA APLICACION

Twitter permite a sus usuarios recolectar información a través del registro de aplicaciones.

Para tener acceso a los datos de Twitter mediante programación, necesitamos crear una
aplicación que interactúe con la API de Twitter. El primer paso es el registro de la aplicación.
En particular, usted necesita ir con su navegador a http://apps.twitter.com, ingresar a su
cuenta de a Twitter (si no se ha conectado) y registrar una nueva solicitud. Ahora puede
elegir un nombre y una descripción para su aplicación (por ejemplo "Demostración Minería
de Datos" o similar). Usted recibirá una clave de consumidor (Consumer Key) y una clave
secreta (Consumer Secret): estas son configuraciones de la aplicación que siempre se deben
mantener privadas. Desde la página de configuración de su aplicación, usted también debe
solicitar un token de acceso y un token secreto de acceso. De manera similar a las claves del
consumidor, estas cadenas deben mantenerse privadas ya que proporcionan el acceso a las
aplicaciones para Twitter en nombre de su cuenta. Los permisos por defecto son de sólo
lectura, que es todo lo que se necesitara en este tutorial, pero si se decide cambiar el permiso
para proporcionar funciones de escritura en su aplicación, se debe solicitar un nuevo token
de acceso.

Nota importante: hay a límites de velocidad en el uso de la API de Twitter, así como
limitaciones en caso de que desea proporcionar a ver de conjunto de datos, para descargar:

https://dev.twitter.com/overview/terms/agreement-and-policy
https://dev.twitter.com/rest/public/rate-limiting
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

ACCESO A LOS DATOS (REST)

Twitter brinda un API llamado REST se puede utilizar para interactuar con su servicio. El
REST API proporciona acceso programático para leer y escribir datos de Twitter; crear un
nuevo Tweet, leer el perfil del dueño de la cuenta, datos de seguidores y mucho más. La API
REST identifica las aplicaciones de Twitter y los usuarios que están utilizando OAuth y envía
las respuestas disponibles en formato JSON. Hay un montón de Python-basado clientes que
se pueden utilizar sin volver a inventar la rueda. En particular, Tweepy es uno de los más
interesantes y fácil de usar, así que procederemos a instalarlo.

Para instalar tweepy se requiere del administrador de paquetes de Python llamado pip el
cual, si no se encuentra instalado o no trabaja bien, se puede descargar de nuevo usando apt-
get o curl mediante cualquiera de los siguientes comandos:

sudo apt-get install python-pip (versión no actualizada)

curl https://bootstrap.pypa.io/get-pip.py (<--- versión recomendada)

Paso seguido importamos la librería tweepy usando pip:

pip install tweepy==3.5.0

Para autorizar la aplicación para acceder a Twitter en nuestro nombre, se debe que utilizar
la interfaz de OAuth. Cree un archivo nuevo en el directorio $home el cual se va a llamar
REST.py.

import tweepy
from tweepy import OAuthHandler

consumer_key = 'SU CONSUMER-KEY'


consumer_secret = 'SU CONSUMER SECRET'
access_token = 'SU ACCESS TOKEN'
access_secret = 'SU SECRET ACCESS CODE'

auth = OAuthHandler(consumer_key, consumer_secret)


auth.set_access_token(access_token, access_secret)

api = tweepy.API(auth)

La variable api es el punto de acceso a la mayoría de las operaciones que se pueden hacer con
Twitter. Tambien Tweepy proporciona la interfaz Cursor para iterar a través de distintos
tipos de objetos de Twitter. Por ejemplo, se pueden leer los primeros tweets de su propia
página de inicio de twitter (home_timeline), agregando al script anterior las siguientes líneas
de código:
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

for status in tweepy.Cursor(api.home_timeline).items(10):


# Procesa un solo estado a la vez
print(status.text)

Imagen 1. Ejemplo de datos obtenidos con el script REST.py

En el ejemplo anterior se está utilizando el número 10 para limitar la cantidad de tweets que
se están leyendo, pero por supuesto se puede acceder a muchos más. La variable status es
una instancia de la clase de Status( ), la cual es un empaquetamiento para el acceso a los
datos. La respuesta en formato JSON de la API de Twitter está disponible en el atributo _json
(con un underscore al principio), que no es la propia cadena sin procesar JSON, sino un
diccionario de Python.

Por lo tanto para imprimir el resultado en formato JSON solo se debe llamar al atributo _json
en lugar del atributo text. Se debe modificar de la siguiente manera el ciclo for del script
REST.py y guardarlo como REST2.py :

For status in tweepy.Cursor(api.home_timeline).items(10):


# Procesa un solo estado a la vez
print(status._json)
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Imagen 2. Ejemplo de 1 solo tweet obtenido con el script REST2.py modificado con formato JSON

Si se desea obtener una lista de todos sus seguidores, se puede utilizar el siguiente ciclo
usando el método friends de la API de Tweeter:
For friends in tweepy.Cursor(api.friends).items(10):
# Procesa un solo estado a la vez
print(friends._json)

O si se desea obtener los 20 últimos tweets realizados por el propio usuario se puede cambiar
el anterior ciclo por el método user_timeline:
For tweets in tweepy.Cursor(api.user_timeline).items(20):
# Procesa un solo estado a la vez
print(tweets._json)

STREAMING

Si su intención es monitorear o procesar Tweets en tiempo real, se debe considere el uso de


la API de Streaming en lugar de la REST. Se debe utilizar el método StreamListener( ) de
Tweepy para personalizar la forma en que se procesan los datos entrantes. Un ejemplo que
reúne a todos los nuevos tweets con el hashtag #bigdata se presenta a continuación (puede
guardar el script como EjemploStream.py):
from tweepy import Stream
from tweepy.streaming import StreamListener
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

class MyListener(StreamListener):

def on_data(self, data):


try:
with open(python.json', 'a') as f:
f.write(data)
return True
except BaseException as e:
print("Error en_el dato: %s" % str(e))
return True

def on_error(self, status):


print(status)
return True

twitter_stream = Stream(auth, MyListener())


twitter_stream.filter(track=['#bigdata'])

Si desea encontrar las tendencias más populares en twitter pueden ir a http://trendsmap.com/

Según el término de búsqueda, podemos recoger toneladas de tweets en pocos minutos. En el


ejemplo anterior con el keyword “bigdata” se obtuvieron 100Kb de información en un poco
más de un minuto, mientras que en otro ensayo con la palabra “Trump” se obtuvieron casi
600Kb en el mismo tiempo. Esto se puede evidenciar más fácilmente durante eventos en vivo
con una cobertura de todo el mundo (Copas del Mundo, Super Bowl, premios de la Academia,
lo que sea), así que hay que mantener un ojo en el tamaño del archivo JSON para entender
qué tan rápido crece y considerar cuántos tweets puede ser que se necesite para la aplicación.
El script anterior guardará cada tweet en una nueva línea, por lo que se puede utilizar el
comando wc -l python.json desde un shell de Unix para saber cuántos tweets has reunido.

En este capítulo se ha hecho una introducción a tweepy como una herramienta para acceder
a Twitter datos de una forma bastante simple con Python. Hay diferentes tipos de datos que
podemos recoger, con el claro enfoque en el objeto de "tweet". Una vez que hemos recogido
algunos datos, las posibilidades en cuanto a aplicaciones analíticas son infinitas.
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Capítulo 2. Pre-Procesamiento de Textos

LA ANATOMÍA DE UN TWEET

Suponiendo que han recogido un número considerable de tweets y se han almacenado en el


archivo JSON, vamos a echar un vistazo a la estructura de un tweet utilizando el siguiente
programa en Python al que se nombrara Anatomia.py
import json
with open('mytweets.json', 'r') as f:
line = f.readline() # Lee solamente el primer tweet/linea
tweet = json.loads(line) # Lo carga como un diccionario-Python
print(json.dumps(tweet, indent=4)) # impresion

El tamaño de un tweet es bastante extenso. En el ejemplo realizado con el keyword #bigdata


se obtuvo el primer tweet con un largo de 200 líneas de atributos de la información.

Para un tweet, los atributos clave son los siguientes:

 Text: el texto del tweet


 created_at: la fecha de creacion
 favorite_count, retweet_count: El numero de favoritos y retweets
 favorited, retweeted: Valor booleano que dice si el usuario autenticado (usted) ha
hecho favorito o ha hecho retweet a este tweet.
 lang: Acronimo de lenguaje (“en” para ingles)
 id: el identificador del tweet
 place, coordinates, geo: Información de geolocalización si está disponible
 user: el perfil completo del autor
 entities: Lista de entidades como URLs, @-menciones, #hashtags y simbolos.
in_reply_to_user_id: Identificador del usuario si el tweet es una respuesta a otro
usuario.
 in_reply_to_status_id: Identificador del estado si el tweet es una respuesta a un estado
específico.

Como se puede ver que hay un montón de información con la que podemos jugar. Todos los *
acaban en _id campos también tienen un * _id_str homólogo, donde la misma información se
almacena como una cadena en lugar de un int grande (para evitar problemas de
desbordamiento). Podemos imaginar cómo estos datos ya permiten algunos análisis
interesantes: podemos comprobar cuál es más favorito/reenviado, cuales son los hashtags más
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

populares y así sucesivamente. El contenido de un tweet está integrado en el texto, y es donde


empezaremos nuestro análisis.

Comenzamos nuestro análisis por romper el texto en palabras. Tokenisación es uno de los
pasos más básicos, pero lo más importante en el análisis del texto. El propósito de
tokenisación es dividir una corriente del texto en unidades más pequeñas llamados tokens,
generalmente palabras o frases. Mientras que esto es un problema bien conocido con varias
soluciones en librerías de programas populares, los datos de Twitter plantean algunos
desafíos debido a la naturaleza de su lenguaje.

COMO TOKENIZAR UN TEXTO DE UN TWEET

Para la siguiente práctica debemos instalar una librería de Python llamada NLTK, la cual
maneja diferentes tipos de tokens.

Al terminar la descarga se debe incluir el módulo Punkt por lo que se debe llamar a la consola
de Python y escribir los dos siguientes comandos:

Realicemos un ejemplo, utilizando la librería NLTK para tokenizar un tweet ficticio. Guarde
el archivo como ejemplo_nltk.py:
from nltk.tokenize import word_tokenize

tweet = 'RT @AnaliticaDeDatos: Esto es solo un ejemplo! :D


http://www.uao.edu.co #DATOS'
print(word_tokenize(tweet))
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Como resultado se tiene la siguiente salida:

Se dará cuenta de algunas particularidades que no son capturadas por un tokeniser general
en inglés como el NLTK: menciones con @, emoticonos, URLs y #hash-tags no son reconocidos
como tokens individuales. El siguiente programa propondrá unas cadenas preprocesadas las
que tendrá en cuenta estos aspectos del lenguaje. Copie el código, péguelo en su procesador
de texto en Ubuntu y guárdelo como tokenizer_pre.py en la carpeta de Python:
import re
import json

emoticons_str = r"""
(?:
[:=;] # Ojos
[oO\-]? # Nariz (optional)
[D\)\]\(\]/\\OpP] # Bocas
)"""

regex_str = [
emoticons_str,
r'<[^>]+>', # Etiquetas HTML
r'(?:@[\w_]+)', # @-Menciones
r"(?:\#+[\w_]+[\w\'_\-]*[\w_]+)", # hash-tags
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', #
URLs

r'(?:(?:\d+,?)+(?:\.?\d+)?)', # Numeros
r"(?:[a-z][a-z'\-_]+[a-z])", # Palabras con – y '
r'(?:[\w_]+)', # Otras palabras
r'(?:\S)' # Cualquier otra cosa
]

tokens_re = re.compile(r'('+'|'.join(regex_str)+')', re.VERBOSE | re.IGNORECASE)


emoticon_re = re.compile(r'^'+emoticons_str+'$', re.VERBOSE | re.IGNORECASE)

def tokenize(s):
return tokens_re.findall(s)

def preprocess(s, lowercase=False):


tokens = tokenize(s)
if lowercase:
tokens = [token if emoticon_re.search(token) else token.lower() for
token in tokens]
return tokens
tweet = 'RT @AnaliticaDeDatos: Esto es solo un ejemplo! :D http://www.uao.edu.co
#DATOS'
print(preprocess(tweet))
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

A diferencia del primer ejemplo con NLTK, usando este método, se pueden visualizar a
continuación que @-menciones, emoticonos, URLs y #hash tags ahora sí se conservan como
tokens individuales.

Si queremos que todos nuestros tweets, previamente guardados en el archivo JSON de


proceso, cambie las dos últimas líneas de código (tweet= y print) por las siguientes líneas:
with open('python.json, 'r') as f:
for line in f:
tweet = json.loads(line)
print(preprocess(tweet['text']))

El tokeniszer está probablemente lejos de ser perfecto, pero da la idea general. El tokenisador
se basa en expresiones regulares, que es una opción común para este tipo de problema.
Algunos tipos particulares de símbolos (por ejemplo, números de teléfono o nombres químicos)
no serán capturados y probablemente se dividirán en varios tokens. Para solucionar este
problema, así como para mejorar la riqueza de su tubería de proceso, puede mejorar las
expresiones regulares, o incluso emplear técnicas más sofisticadas como reconocimiento el
nombre de la entidad.

El componente principal del tokenisador es la variable regex_str, que es una lista de posibles
patrones. En particular, se trata de capturar algunos emoticonos, etiquetas HTML, Twitter
@usernames (a-menciones), Twitter #hashtags, URLs, números, palabras con y sin guiones y
apóstrofes y finalmente "cualquier otra cosa". Por favor tómese un momento para observar la
expresión para la captura de números: ¿por qué no simplemente utilizamos \d+? El problema
aquí es que los números pueden aparecer de varias formas diferentes, por ejemplo 1000
también se puede escribir como 1,000 o 1,000.00 — y nosotros podemos entrar en más
complicaciones en un ambiente multilingüe donde se invierten los puntos y comas: ‘mil’ se
puede escribir como 1.000 o 1.000,00 en muchos países no anglófonos. La tarea de identificar
símbolos numéricos correctamente solo le da un vistazo a lo difícil puede ser la tokenisación.

Las expresiones regulares están compiladas con los flags re.VERBOSE, para permitir que los
espacios en la expresión sean ignorados (ver la expresión de múltiples líneas emoticonos) y
re.IGNORECASE para ignorar mayúsculas y minúsculas. La función de tokenize()
simplemente atrapa todos los símbolos en una cadena y devuelve una lista. Esta función se
utiliza en el preprocess( ), la cual se utiliza como una cadena de preprocesamiento: en este
caso simplemente agregamos una función que convierta todo a minúsculas para todas los
tokens que no son emoticonos (por ejemplo :D no se convierten en :d).

En este capitulo se ha analizado la estructura general de un tweet, y se han discutido cómo


procesar previamente el texto antes de que podemos conseguir en algunos análisis más
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

interesante. En particular, hemos visto cómo la tokenisación, a pesar de ser un problema bien
conocido, puede ser un poco complicado con los datos de Twitter. La solución propuesta está
lejos de ser perfecta pero es un buen punto de partida y bastante fácil de extender.
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Capítulo 3. Frecuencia de términos


En este capítulo, se realizara un conteo de términos para extraer términos significativos
según su frecuencia en nuestros tweets.

CONTEO DE TERMINOS

Suponiendo que hemos recopilado una lista considerable de tweets en formato JSON, el
primer análisis exploratorio que podemos realizar es un recuento de palabra simples. De esta
manera, podemos observar cuáles son los términos más comúnmente utilizados en el conjunto
de datos. En este ejemplo, se usara un conjunto de tweets tomado que incluyen el hashtag
“#bigdata”, por lo que las palabras más frecuentes se espera que correspondan a temas
similares.

Podemos utilizar un tokenizer personalizado para dividir los mensajes en una lista de
términos. El código siguiente utiliza la función preprocess( ) descrita en el capítulo 2, para
capturar aspectos específicos de Twitter en el texto, como #hashtags, @-menciones,
emoticonos y URLs. Con el fin de mantener un registro de las frecuencias mientras estamos
procesando los tweets, podemos utilizar collections.Counter( ) el cual es internamente un
diccionario (término: conteo) con algunos métodos útiles como most_common( ):
import operator
import json
from collections import Counter

fname = 'mytweets.json'
with open(fname, 'r') as f:
count_all = Counter()
i=0
for line in f:
tweet = json.loads(line)
i++
# Crea una lista con todos los términos
terms_all = [term for term in preprocess(tweet['text'])]
# Actualiza el contador
count_all.update(terms_all)
# Imprimer las 5 palabras mas frecuentes
print(“Palabras mas frecuentes con la cantidad de
apariciones:”)
print(count_all.most_common(5))
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos
# Imprime el total de tweets:
print(“Numero total de tweets: “+str(i))

Grabamos el anterior archivo como conteo1.py y lo ejecutamos. En nuestro ejemplo de


#bigdata obtuvimos el siguiente resultado de 10 términos más frecuentes:

Como se puede ver, las palabras más frecuentes (o debería decir, tokens), son no los más
significativos.

REMOVIENDO STOP-WORDS

En cada idioma, existen palabras que son particularmente comunes. Si bien su uso en la
lengua es crucial, no generalmente transmiten un significado particular, especialmente si se
toma fuera de contexto. Este es el caso de artículos, conjunciones, algunos adverbios, etc., que
son comúnmente llamadas palabras vacías o stop-words.

La eliminación de estas palabras es un paso importante que se debe considerar durante las
etapas de preprocesamiento. Uno puede crear una lista personalizada de palabras ‘vacías’, o
utilizar una de las listas disponibles (por ejemplo la librería NLTK proporciona una lista
simple de stop-words en inglés).

Dada la naturaleza de nuestros datos y nuestra tokenisación, debemos también ser


cuidadosos con todas los signos de puntuación y con términos como RT (utilizado para re-
tweets) y via (utilizado para mencionar al autor original de un artículo o un re-tweet), que no
están en la lista de palabras por defecto.

from nltk.corpus import stopwords


import string

punctuation = list(string.punctuation)
stop = stopwords.words('english') + punctuation + ['rt', 'via']

Ahora podemos sustituir la variable terms_all en el primer ejemplo con algo como:
terms_stop = [term for term in preprocess(tweet['text']) if term not in stop]
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Grabamos el programa de nuevo como conteo2.py. Después de ejecutarlo obtenemos la


siguiente salida:

Aparentemente el termino #BigData está muy relacionado con el Internet de las Cosas (IoT)
y el año 2026 (seguramente debido al reciente estudio de predicción de Big Data al 2026:
http://siliconangle.com/blog/2016/03/30/wikibon-forecasts-big-data-market-to-hit-92-2bn-by-
2026/ )

MÁS FILTROS DE TÉRMINO

Además de eliminación de stop-words, podemos personalizar la lista de términos o tokens que


nos interesan. Aquí hay algunos ejemplos que se pueden incrustar en el primer fragmento de
código:
# Crea una lista con todos los #hash-tags
terms_hash = [term for term in preprocess(tweet['text'])
if term.startswith('#')]

# Cuenta las palabras unicamente, sin #hashtags ni @-menciones


terms_only = [term for term in preprocess(tweet['text'])
if term not in stop
and not term.startswith(('#', '@'))]
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

# Cuenta los terminos solo una vez en cada tweet.


terms_single = set(terms_all)

# Crea una lista con todos los terminos que estan juntos
# en un solo tweet (bigramas). Hay que importar la librería
# al principio del script(from nltk import bigrams)
terms_bigram = bigrams(terms_stop)

A continuacion se muestran algunos de los resultados obtenidos con las nuevas opciones
agregadas al script. Los hashtags mas frecuentes:

Los terminos mas comunes sin incluir #hashtags ni @menciones:

Los bigramas mas comunes encontrados en un tweet:

Este capítulo está basado en los dos anteriores para discutir algunas bases para la extracción
de términos interesantes de un conjunto de datos de tweets, usando las frecuencias de
términos simples, eliminación de stop-words y bigramas. Mientras que estos enfoques son
muy fáciles de aplicar, son muy útiles para tener una vista panorámica de los datos. Hemos
utilizado algunos de los componentes del NLTK (introducido en un artículo anterior), así que
no tenemos que reinventar la rueda.
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Capitulo 4. Coocurrencia de términos

BASKETBALL

El dia de hoy (5/24/16) se jugaba uno de las dos finales de basketball de la NBA en estados
unidos, un deporte que tiene muchos seguidores y que es seguido por millones de personas.
Me di a la tarea de utilizar este evento para buscar tweets relacionados a este evento por lo
que usando el hashtag #NBA, se extrajeron los tweets que incluían este hashtag, usando el
método de streaming del capitulo 1 por un tiempo alrededor de 30 minutos. El archivo JSON
obtenido pesa 4MB y 1226 tweets, una cantidad pequeña pero suficiente para realizar
algunas pruebas.

Estos son algunos de los resultados obtenidos:

Los hashtags más comunes son los que tienen que ver con el partido que se encontraba en
juego ese momento #OKCvsGSW (Oklahoma City Thunder contra Golden State Warriors).
Warriors es el equipo campeón de la temporada pasada y actualmente el que más llama la
atención de los medios por lo que no es extraño que aun ir perdiendo la serie y el partido que
se encontraba en juego, tenga más menciones que el equipo Thunder.

En los bigramas aparecen unos obvios como “Golden State” con 58 ocurrencias, “Oklahoma
City” con 46 y “Los Angeles” con 43. Me parecio curioso los bigramas “Sager receive” y “Jimmy
V” por lo que realice una búsqueda en google y el primer resultado obtenido resolvió mi duda:

“Craig Sager to Receive Jimmy V Perseverance Award at ESPYS”


Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

CONCURRENCIA DE TERMINOS

A veces estamos interesados en los términos que se presentan juntos. Esto es principalmente
porque el contexto nos da una mejor comprensión sobre el significado de un término, soporte
de aplicaciones como desambiguación palabra o similitud semántica. Discutimos la opción de
usar bigramas en el artículo anterior, pero queremos ampliar el contexto de un término al
tweet completo.

We can refactor the code from the previous article in order to capture the co-occurrences. We
build a co-occurrence matrix com such that com[x][y] contains the number of times the term
x has been seen in the same tweet as the term y:

Podemos rehacer el código del capítulo anterior con el fin de capturar las co-ocurrencias.
Construimos una matriz de co-ocurrencia com tales que com [x] [y] contiene el número de
veces que el término x se ha visto en el mismo tweet como el término y:
from collections import defaultdict
# hay que incluir los import de los programas anteriores

com = defaultdict(lambda : defaultdict(int))

# f es el apuntador al archive JSON


for line in f:
tweet = json.loads(line)
terms_only = [term for term in preprocess(tweet['text'])
if term not in stop
and not term.startswith(('#', '@'))]

# Construir la matriz de coocurrencias.


for i in range(len(terms_only)-1):
for j in range(i+1, len(terms_only)):
w1, w2 = sorted([terms_only[i], terms_only[j]])
if w1 != w2:
com[w1][w2] += 1

Al construir la matriz de co-ocurrencia, no queremos contar el mismo término par dos veces,
por ejemplo com [A] [B] == com [B] [A], por lo que el ciclo interior comienza desde + 1 para
construir una matriz triangular, mientras que sorted preserva el orden alfabético de los
términos.

Para cada término, luego extraemos los 5 términos con coocurrencias más frecuentes,
creando una lista de tuplas de la forma ((term1, term2), cuenta):
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos
com_max = []
# Para cada término, buscar los más comunes términos coocurrencias
for t1 in com:
t1_max_terms = sorted(com[t1].items(), key=operator.itemgetter(1), reverse=True)[:5]
for t2, t2_count in t1_max_terms:
com_max.append(((t1, t2), t2_count))
# Obtiene las mas frequentes coocurrencias
terms_max = sorted(com_max, key=operator.itemgetter(1), reverse=True)
print(terms_max[:5])

Esta aplicación es bastante sencillo, pero según el conjunto de datos y el uso de la matriz,
uno puede mirar en herramientas como scipy.sparse para la construcción de una matriz
sparse.
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Conclusiones
Este trabajo ha discutido a través de ejemplos de Minería de datos en Twitter, utilizando
algunos datos realistas tomadas durante un evento deportivo. Con lo que hemos aprendido
en los anteriores capítulos, que hemos descargado algunos datos usando la API de streaming,
procesados previamente los datos en formato JSON y extraído algunos términos interesantes
y los hashtags de los tweets. El trabajo también introdujo el concepto de co-ocurrencia de
término, se muestra cómo crear una matriz de co-ocurrencia y discuten cómo hacer para
encontrar una idea interesante. No hace falta ser un experto programador o analista de datos
para realizar su propia investigación utilizando lenguajes sencillos como Java o Python y
extraer información valiosa para la toma de decisiones.
Universidad Autónoma de Occidente – Cali, Colombia

Analítica de Datos

Bibliografia
Este trabajo es una adaptación del tutorial realizado por Marco Bonzanini:

https://marcobonzanini.com/2015/03/02/mining-twitter-data-with-python-part-1/

También podría gustarte