Blog
Tutorial de análisis de sentimientos de Twitter en Python p.1
- Publicado por: Rafael Fernandez
- Categoría: Curso de SQLite Dash
-Aprender a instalar Tweepy.
-Paso a paso iremos explicando códigos para comenzar el análisis de sentimientos de Twitter.
Hola y bienvenidos a otro tutorial de análisis de sentimientos, esta vez vamos a guardar nuestros tweets, sentimientos y algunas otras características en una base de datos. Mi plan es combinar esto en una aplicación Dash para el análisis de datos y la visualización de los sentimientos de Twitter sobre diversos temas.
En este tutorial, básicamente vamos a enlazar conceptos del curso de sqlite.
En nuestra aplicación, queremos estar transmitiendo Tweets en vivo, y que Dash puede leerlos. La API de transmisión por secuencias de Twitter no funciona bien al desconectarse y reconectarse, por lo que necesitamos simplemente transmitir todo por secuencias y filtrarlo más tarde, en lugar de transmitirlo en tiempo real, cambiando la palabra clave de la transmisión por la secuencias en directo.
Para usar Tweepy (es un módulo de Python para transmitir tweets de Twitter) haga una instalación de tweepy. Ejecute en modo administrador el cmd y escriba:
pip install tweepy
En primer lugar vamos a cubrir la transmisión de tweets desde Twitter. Vas a necesitar una cuenta de Twitter APPS. Por lo que ve a este enlace y logueate con una cuenta de twitter
A continuación, haga una nueva aplicación, rellenando su nombre, descripción, sitio web, acepte sus términos, haga el captcha, y cree la aplicación.
Una vez enviado con éxito, se le presentará una página donde podrá ver su consumer Key y su consumer Key secreta. Ahora necesita un token de acceso, así que desplácese hacia abajo o a la pestaña de la derecha y haga clic en “crear mi token de acceso”.
Después de unos momentos, actualice y podrá ver la clave de acceso y el token de acceso. Una vez que lo tengas ya podemos usar Tweepy.
Aquí hay un simple script para Twitter que transmite tweets que contienen “python”.
from tweepy import Stream from tweepy import OAuthHandler from tweepy.streaming import StreamListener #consumer key, consumer secret, access token, access secret. ckey="F2pIrutjymGr9vZuqTeViAymw" csecret="QFLTXwFJZNuR6i00IswAZIgaKsKl5AtmPufoSaRnR57ER2yVxS" atoken="879408865997201408-QJDeVNKYBsTdp97caK0qFV454YYwRLp" asecret="gLNfeVRjT7LrDaWWSgCX0ZRu6TeTPBquTxlYKQ4hUzAka" class listener(StreamListener): def on_data(self, data): print(data) return(True) def on_error(self, status): print (status) auth = OAuthHandler(ckey, csecret) auth.set_access_token(atoken, asecret) twitterStream = Stream(auth, listener()) twitterStream.filter(track=["python"])
Tendrás que configurar tu API de Twitter y cambiar estos datos por tus datos.
Desde aquí, queremos transmitir estos tweets a una base de datos. Para ello usaremos SQLite. SQLite viene con Python, así que ya deberías tenerlo. Comencemos por crear nuestra base de datos y tabla. Con SQLite, el acto de conectar una base de datos es suficiente para crearla si no existe. Sin embargo, necesitamos crear y especificar la estructura de cualquier tabla. Por ejemplo:
import sqlite3 conn = sqlite3.connect('twitter.db') c = conn.cursor() def create_table(): c.execute("CREATE TABLE IF NOT EXISTS sentimiento(unix REAL, tweet TEXT, sentimiento REAL)") conn.commit() create_table()
Lo que vamos hacer es un seguimiento del tiempo, el tweet y el sentimiento. Podemos calcular más cosas sobre la marcha. Dicho esto, por ahora, mantengamos las inserciones de la base de datos tan simples y razonablemente rápidas como podamos.
Ahora, simplemente combinamos todo: el sentimiento, el twitter streaming y el sqlite:
from tweepy import Stream from tweepy import OAuthHandler from tweepy.streaming import StreamListener import json import sqlite3 from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer from unidecode import unidecode analyzer = SentimentIntensityAnalyzer() conn = sqlite3.connect('twitterF.db') c = conn.cursor() def create_table(): c.execute("CREATE TABLE IF NOT EXISTS sentimiento(unix REAL, tweet TEXT, sentimiento REAL)") conn.commit() create_table() #consumer key, consumer secret, access token, access secret. ckey="F2pIrutjymGr9vZuqTeViAymw" csecret="QFLTXwFJZNuR6i00IswAZIgaKsKl5AtmPufoSaRnR57ER2yVxS" atoken="879408865997201408-QJDeVNKYBsTdp97caK0qFV454YYwRLp" asecret="gLNfeVRjT7LrDaWWSgCX0ZRu6TeTPBquTxlYKQ4hUzAka" class listener(StreamListener): def on_data(self, data): try: data = json.loads(data) tweet = unidecode(data['text']) time_ms = data['timestamp_ms'] vs = analyzer.polarity_scores(tweet) sentimiento = vs['compound'] print(time_ms, tweet, sentimiento) c.execute("INSERT INTO sentimiento (unix, tweet, sentimiento) VALUES (?, ?, ?)", (time_ms, tweet, sentimiento)) conn.commit() except KeyError as e: print(str(e)) return(True) def on_error(self, status): print(status) auth = OAuthHandler(ckey, csecret) auth.set_access_token(atoken, asecret) twitterStream = Stream(auth, listener()) twitterStream.filter(track=["a","e","i","o","u"])
No conozco una mejor manera de “rastrear todo” además de rastrear todas las vocales. He intentado rastrear espacios, lo que ha sido problemático en el pasado. Por lo que yo sé, también debes enviar aquello por lo que quieres “filtrar”.
Dado que Dash se ejecuta en hilos, vamos a ejecutar este script por separado de nuestra aplicación Dash, y esto es todo lo que hay que hacer. Queremos hacer un seguimiento de todo lo que podamos aquí, y filtrarlo más tarde. Podrías estar pensando que podríamos usar la aplicación Dash para filtrar lo que estamos rastreando dinámicamente. Desafortunadamente, no creo que eso sea posible, porque no queremos interrumpir la conexión a Twitter con frecuencia, de lo contrario nuestra conexión no será permitida por un corto tiempo. Puede haber alguna forma de actualizar la variable de seguimiento en vivo en la conexión del stream, pero no lo sé.
También he añadido algo más de manejo de errores, todavía tenía esta desconexión de vez en cuando. Si eso sucede, esperaremos unos segundos e intentaremos de nuevo:
from tweepy import Stream from tweepy import OAuthHandler from tweepy.streaming import StreamListener import json import sqlite3 from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer from unidecode import unidecode import time analyzer = SentimentIntensityAnalyzer() #consumer key, consumer secret, access token, access secret. ckey="F2pIrutjymGr9vZuqTeViAymw" csecret="QFLTXwFJZNuR6i00IswAZIgaKsKl5AtmPufoSaRnR57ER2yVxS" atoken="879408865997201408-QJDeVNKYBsTdp97caK0qFV454YYwRLp" asecret="gLNfeVRjT7LrDaWWSgCX0ZRu6TeTPBquTxlYKQ4hUzAka" conn = sqlite3.connect('twitterF1.db') c = conn.cursor() def create_table(): try: c.execute("CREATE TABLE IF NOT EXISTS sentimiento(unix REAL, tweet TEXT, sentimiento REAL)") c.execute("CREATE INDEX fast_unix ON sentimiento(unix)") c.execute("CREATE INDEX fast_tweet ON sentimiento(tweet)") c.execute("CREATE INDEX fast_sentimiento ON sentimiento(sentimiento)") conn.commit() except Exception as e: print(str(e)) create_table() class listener(StreamListener): def on_data(self, data): try: data = json.loads(data) tweet = unidecode(data['text']) time_ms = data['timestamp_ms'] vs = analyzer.polarity_scores(tweet) sentimiento = vs['compound'] print(time_ms, tweet, sentimiento) c.execute("INSERT INTO sentimiento (unix, tweet, sentimiento) VALUES (?, ?, ?)", (time_ms, tweet, sentimiento)) conn.commit() except KeyError as e: print(str(e)) return(True) def on_error(self, status): print(status) while True: try: auth = OAuthHandler(ckey, csecret) auth.set_access_token(atoken, asecret) twitterStream = Stream(auth, listener()) twitterStream.filter(track=["a","e","i","o","u"]) except Exception as e: print(str(e)) time.sleep(5)
En el próximo tutorial leeremos y trabajaremos con la base de datos!
Proyecto Dash con Análisis de Sentimientos en Python, 3º tutorial