Tweet análisis usando la PNL

Prajwal Shreyas
Prajwal Shreyas

Seguir

Jul 23, 2019 · 9 min read

Introducción

En los últimos días con la explosión del Big Data hay una gran demanda para las organizaciones y los científicos de datos para realizar la extracción de información mediante fuentes no tradicionales de datos. La investigación ha demostrado que casi el 80% de los datos existen como datos de texto no estructurados, por lo que el análisis de texto es fundamental para analizar la gran cantidad de información disponible en transcripciones de chat, publicaciones en redes sociales, reseñas, fuentes de noticias, etc.

¿Qué es el análisis de texto?

El análisis de texto es el proceso de síntesis de datos no estructurados para ayudar a descubrir patrones y permitir la toma de decisiones. Hasta los últimos años, el análisis de texto tenía que realizarse a la antigua usanza, es decir, la categorización manual y de ojos del texto, que es ineficiente y requiere mucho tiempo. Además, esta no es una solución práctica cuando se trata de millones de documentos, como los datos de Twitter.

Los datos de Twitter (también conocidos como tweets) son una rica fuente de información sobre un gran conjunto de temas. Estos datos se pueden utilizar para encontrar tendencias relacionadas con una palabra clave específica, medir el sentimiento de marca o recopilar comentarios sobre nuevos productos y servicios. Esta publicación proporcionará una guía paso a paso para el análisis de texto en los datos de Twitter.

¿Cómo realizar análisis de texto en datos de Twitter?

Los pasos involucrados en el análisis de texto son:

Paso 1: Recopilar tweets

Paso 2: Preprocese tweets

Paso 3: Aplique el análisis de sentimientos

Paso 4: Aplique el reconocimiento de entidades con nombre

Paso 5: Agrupe tweets

Paso 6: Visualice el análisis

He adjuntado un cuaderno de jupyter que realiza los pasos anteriores en una muestra de datos de twitter aquí.

Paso 1: Recopilar tweets

Se puede acceder a los datos del tweet mediante programación de dos maneras, por ejemplo, API Rest de Twitter o API de streaming.

La API Rest le permite recopilar la lista de todos los tweets o seguidores de un usuario en particular. También puede consultar la cuenta de un usuario e incluso modificarla siempre que tenga los permisos necesarios. La API de streaming te permite recopilar tweets en tiempo real en función de los términos de búsqueda, los ID de usuario o las ubicaciones.

Para acceder a la API, necesitará 4 piezas de información de Twitter, es decir, clave de API, secreto de API, token de acceso y secreto de token de acceso. Los pasos detallados para configurar una cuenta y conectarse a los servicios de la API de Twitter mediante paquetes de python se explican en el blog aquí.

Para nuestro análisis, he utilizado el servicio API de streaming de Twitter y recopilado tweets de veinte empresas del FTSE 100 en una semana a partir del 1 de octubre de 2016. Esto ha dado lugar a un total de 37.313 tweets. La salida de la API de streaming debe analizarse en un formato adecuado antes de cualquier análisis. En la siguiente sección cubrimos los pasos involucrados en el procesamiento previo de tweets.

Paso 2: Preprocesar tweets

Aquí analizamos la respuesta de la API de Twitter en una tabla estructurada. La respuesta de las API de streaming de Twitter está en el siguiente formato:

El código detallado para analizar la salida de la API de Twitter se encuentra a continuación. La salida está estructurada en campos clave como «doc_id», «nombre de usuario», «texto», etc. La respuesta analizada se puede almacenar en una base de datos o en un archivo JSON.

import simplejson as json
def get_tweet(doc):
tweetItem = {}
#Available tweet data
tweetItem = doc
#hashtags are identified and provided as a field in the tweet
tweetItem = map(lambda x: x,doc)
# user_mentiones are identified and provided as a field
tweetItem = map(lambda x: x,doc
) # symbols e.g. $APPL are identified and provided as a field
tweetItem = map(lambda x: x,doc)
tweetItem = doc
tweetItem = doc
tweetItem = doc try: tweetItem = doc
except KeyError as e:
tweetItem = 0
pass
return tweetItem

Paso 3: Análisis de sentimientos

Las personas expresan sus opiniones a través de tweets y, por lo general, tienen un sentimiento asociado, es decir, positivo, negativo o neutral. El análisis de este sentimiento puede llevar a una idea útil sobre el tema o la empresa que se está discutiendo. Por lo tanto, sugerimos el uso de algoritmos de análisis de sentimientos para realizar este análisis. He creado un blog separado con detalles sobre la realización de análisis de sentimientos utilizando el algoritmo de aprendizaje profundo aquí.

El sentimiento es un indicador útil, sin embargo, los tweets contienen información adicional, como nombres de personas, lugares y organizaciones. Los datos cuando se extraen pueden generar información muy útil sobre su producto o empresa. Así que en el siguiente paso cubrimos el uso de algoritmos de reconocimiento de entidades con nombre, que está diseñado para extraer esta información.

Paso 4: Reconocimiento de Entidad con nombre

El algoritmo de Reconocimiento de Entidad con Nombre identificará etiquetas clave, como personas, ubicaciones u organizaciones, contenidas en los tweets. Por ejemplo, si hay una mención de «Londres» en tu tweet, el algoritmo lo etiquetaría como «Ubicación». Sin embargo, como los tweets generalmente no siguen la sintaxis estándar en inglés, la precisión de las etiquetas es de alrededor del 60% al 70%.

Puede usar el etiquetador NER de Stanford para obtener el reconocimiento de entidad para los tweets. En el siguiente ejemplo he usado un tweet de Donald Trump.

# -*- coding: utf-8 -*-
from nltk.tag import StanfordNERTagger
from nltk.tokenize import word_tokenize
st = StanfordNERTagger('/stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz',
'/usr/share/stanford-ner/stanford-ner.jar',
encoding='utf-8')#a tweet by Donald Trump
text = 'Just had a very good call with @SwedishPM Stefan Löfven who assured me that American citizen A$AP Rocky will be treated fairly. Likewise, I assured him that A$AP was not a flight risk and offered to personally vouch for his bail, or an alternative....'
tokenized_text = word_tokenize(text)
classified_text = st.tag(tokenized_text)
print(classified_text)

Paso 5: Agrupación de tweets similares

Varios tweets son muy similares entre sí, esto puede deberse a que las personas twittean sobre el mismo tema, lo que causa mucho ruido en los datos. Por lo tanto, para reducir el ruido, sería útil agrupar los tweets en grupos según su similitud. Esto se puede hacer utilizando el algoritmo de agrupación en clústeres.

El funcionamiento interno de los algoritmos se basa en un concepto de aprendizaje automático conocido como matriz tf-idf (frecuencia de término — frecuencia de documento inversa). Aquí, cada tweet se trata como un documento (d) y las palabras dentro del tweet como término (t).

Frecuencia de término – La Frecuencia inversa de documentos es una estadística numérica que demuestra la importancia de una palabra para un corpus.

La frecuencia de los términos es solo el número de relación de la palabra actual con el número de todas las palabras en el documento / cadena / etc.

Fórmula de frecuencia de término

Frecuencia del término t_i, donde n_t – el número de t_i en el documento/cadena actual, la suma de n_k es el número de todos los términos en el documento/cadena actual.

La frecuencia inversa de documentos es un registro de la relación entre el número de todos los documentos / cadena en el corpus y el número de documentos con el término t_i.

Inverse Document Frequency Fórmula

tf-idf(t, d, D) es el producto de la tf(t, d) idf(t, D). Detalles adicionales sobre tf-idf están disponibles en el blog aquí.

Fórmula TF-IDF

En el siguiente código para obtener el agrupamiento, aparte de la entrada de texto, el único parámetro adicional que debe especificarse en la entrada es el umbral de similitud. Puede establecer el umbral en la función » get_clusters (processedTweets, similarity_threshold)». Por lo tanto, todos los tweets, que son 80% similares, se agruparán en base a la medida de similitud conocida como similitud de coseno.

def cluster_text(dist_text,processedTweets,dist_threshold_txt):
cluster_id = 1
for i in range(dist_text.shape):
try:
doc_dist_array_txt = dist_text
# identify document ids where the tweets are similar
similarDocs = np.where(doc_dist_array_txt <= dist_threshold_txt)
processedTweets.ix.isin(), 'cluster_ref'] = cluster_id
cluster_id = cluster_id + 1
except ValueError:
continue
return processedTweets
# %%%%%%%%% Calculate Cosine distance of documents %%%%%%%%%%%%%%
def tokenize_only(text):
# first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
tokens =
filtered_tokens =
# filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
for token in tokens:
if re.search('', token):
filtered_tokens.append(token)
return filtered_tokens
def get_clusters(processedTweets, similarity_threshold):
tweets = processedTweets.tolist()
#Define count vectorizer parameters
vectorizer = CountVectorizer(max_df=1.0, min_df=1, stop_words=stopwords, tokenizer=tokenize_only)
# Get document term frequency matix
dtf_matrix = vectorizer.fit_transform(tweets) #fit the vectorizer to tweets which does not contain'htttp' and 'RT'
dist_text = np.around(abs(1 - cosine_similarity(dtf_matrix)),2)
# --------1D clustering based on distance measure
# Pre clustering setup
processedTweets = None # Tweets that are 1-similarithy% similar, as defined by dist_threshold
# Clustering of tweets based on text
processedTweets = cluster_text(dist_text,processedTweets,dist_threshold_txt = (1-similarity_threshold))
return processedTweets

Los resultados contendrán una columna adicional «cluster_ref». El cluster_ref agrupará todos los documentos similares en un solo grupo, por ejemplo, si el documento 1 y el documento 2 son similares, por lo que ambos tienen cluster_ref de 1.

Paso 6: Visualización de resultados

La visualización de los resultados anteriores ayudaría a obtener información sobre la opinión de los consumidores sobre el producto o la empresa. En la sección siguiente, utilizaré Tableau para fines de visualización. Consulte el enlace al panel de control aquí.

El primer gráfico que se muestra a continuación es el sentimiento positivo, negativo y promedio (línea azul) de cada empresa. Las barras representan el sentimiento promedio de la empresa y no se ponderan para el número de tweets. Este sentimiento no ponderado no proporciona una comparación precisa entre las empresas, ya que no tiene en cuenta el número de tweets.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.