Este artículo cubre el análisis de sentimientos de cualquier tema mediante el análisis de los tweets obtenidos de Twitter usando Python.
¿Qué es el análisis de sentimientos?
El análisis de sentimiento es el proceso de determinar ‘computacionalmente’ si un escrito es positivo, negativo o neutral. También se conoce como minería de opiniones , derivando la opinión o actitud de un orador.
¿Por qué análisis de sentimiento?
- Negocios: en el campo del marketing, las empresas lo utilizan para desarrollar sus estrategias, para comprender los sentimientos de los clientes hacia los productos o la marca, cómo responde la gente a sus campañas o lanzamientos de productos y por qué los consumidores no compran algunos
productos. - Política: En el campo político, se utiliza para realizar un seguimiento de la opinión política, para detectar la coherencia e inconsistencia entre las declaraciones y acciones a nivel de gobierno. ¡También se puede usar para predecir los resultados de las elecciones!
- Acciones públicas: el análisis de sentimiento también se utiliza para monitorear y analizar fenómenos sociales, detectar situaciones potencialmente peligrosas y determinar el estado de ánimo general de la blogósfera.
Instalación:
- Tweepy: tweepy es el cliente de Python para la API oficial de Twitter .
Instálalo usando el siguiente comando pip:pip install tweepy
- TextBlob: textblob es la biblioteca de Python para procesar datos textuales.
Instálalo usando el siguiente comando pip:pip install textblob
Además, necesitamos instalar algunos corpus NLTK usando el siguiente comando:
python -m textblob.download_corpora
(Corpora no es más que
Autenticación:
para obtener tweets a través de la API de Twitter, es necesario registrar una aplicación a través de su cuenta de Twitter. Siga estos pasos para el mismo:
- Abra este enlace y haga clic en el botón: ‘Crear nueva aplicación’
- Complete los detalles de la aplicación. Puede dejar el campo URL de devolución de llamada vacío.
- Una vez que se crea la aplicación, será redirigido a la página de la aplicación.
- Abra la pestaña ‘Claves y tokens de acceso’.
- Copie ‘Clave de consumidor’, ‘Secreto de consumidor’, ‘Token de acceso’ y ‘Secreto de token de acceso’.
Implementación:
import re import tweepy from tweepy import OAuthHandler from textblob import TextBlob class TwitterClient(object): ''' Generic Twitter Class for sentiment analysis. ''' def __init__(self): ''' Class constructor or initialization method. ''' # keys and tokens from the Twitter Dev Console consumer_key = 'XXXXXXXXXXXXXXXXXXXXXXXX' consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX' access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX' access_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXX' # attempt authentication try: # create OAuthHandler object self.auth = OAuthHandler(consumer_key, consumer_secret) # set access token and secret self.auth.set_access_token(access_token, access_token_secret) # create tweepy API object to fetch tweets self.api = tweepy.API(self.auth) except: print("Error: Authentication Failed") def clean_tweet(self, tweet): ''' Utility function to clean tweet text by removing links, special characters using simple regex statements. ''' return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t]) |(\w+:\/\/\S+)", " ", tweet).split()) def get_tweet_sentiment(self, tweet): ''' Utility function to classify sentiment of passed tweet using textblob's sentiment method ''' # create TextBlob object of passed tweet text analysis = TextBlob(self.clean_tweet(tweet)) # set sentiment if analysis.sentiment.polarity > 0: return 'positive' elif analysis.sentiment.polarity == 0: return 'neutral' else: return 'negative' def get_tweets(self, query, count = 10): ''' Main function to fetch tweets and parse them. ''' # empty list to store parsed tweets tweets = [] try: # call twitter api to fetch tweets fetched_tweets = self.api.search(q = query, count = count) # parsing tweets one by one for tweet in fetched_tweets: # empty dictionary to store required params of a tweet parsed_tweet = {} # saving text of tweet parsed_tweet['text'] = tweet.text # saving sentiment of tweet parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text) # appending parsed tweet to tweets list if tweet.retweet_count > 0: # if tweet has retweets, ensure that it is appended only once if parsed_tweet not in tweets: tweets.append(parsed_tweet) else: tweets.append(parsed_tweet) # return parsed tweets return tweets except tweepy.TweepError as e: # print error (if any) print("Error : " + str(e)) def main(): # creating object of TwitterClient Class api = TwitterClient() # calling function to get tweets tweets = api.get_tweets(query = 'Donald Trump', count = 200) # picking positive tweets from tweets ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive'] # percentage of positive tweets print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets))) # picking negative tweets from tweets ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative'] # percentage of negative tweets print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets))) # percentage of neutral tweets print("Neutral tweets percentage: {} % \ ".format(100*(len(tweets) -(len( ntweets )+len( ptweets)))/len(tweets))) # printing first 5 positive tweets print("\n\nPositive tweets:") for tweet in ptweets[:10]: print(tweet['text']) # printing first 5 negative tweets print("\n\nNegative tweets:") for tweet in ntweets[:10]: print(tweet['text']) if __name__ == "__main__": # calling main function main()
Así es como se ve una salida de muestra cuando se ejecuta el programa anterior:
Positive tweets percentage: 22 % Negative tweets percentage: 15 % Positive tweets: RT @JohnGGalt: Amazing—after years of attacking Donald Trump the media managed to turn #InaugurationDay into all about themselves. #MakeAme… RT @vooda1: CNN Declines to Air White House Press Conference Live YES! THANK YOU @CNN FOR NOT LEGITIMI… RT @Muheeb_Shawwa: Donald J. Trump's speech sounded eerily familiar... POTUS plans new deal for UK as Theresa May to be first foreign leader to meet new president since inauguration .@realdonaldtrump #Syria #Mexico #Russia & now #Afghanistan. Another #DearDonaldTrump Letter worth a read @AJEnglish Negative tweets: RT @Slate: Donald Trump’s administration: “Government by the worst men.” RT @RVAwonk: Trump, Sean Spicer, et al. lie for a reason. Their lies are not just lies. Their lies are authoritarian propaganda. RT @KomptonMusic: Me: I hate corn Donald Trump: I hate corn too Me: https://t.co/GPgy8R8HB5 It's ridiculous that people are more annoyed at this than Donald Trump's sexism. RT @tony_broach: Chris Wallace on Fox news right now talking crap about Donald Trump news conference it seems he can't face the truth either… RT @fravel: With False Claims, Donald Trump Attacks Media on Crowd Turnout Aziz Ansari Just Hit Donald Trump Hard In An Epic Saturday Night Live Monologue
Seguimos estos 3 pasos principales en nuestro programa:
- Autorice el cliente API de Twitter.
- Realice una solicitud GET a la API de Twitter para obtener tweets para una consulta en particular.
- Analiza los tuits. Clasifica cada tuit como positivo, negativo o neutral.
Ahora, intentemos entender el código anterior:
- En primer lugar, creamos una clase TwitterClient . Esta clase contiene todos los métodos para interactuar con la API de Twitter y analizar tweets. Usamos la función __init__ para manejar la autenticación del cliente API.
- En la función get_tweets , usamos:
fetched_tweets = self.api.search(q = query, count = count)
para llamar a la API de Twitter para buscar tweets.
- En get_tweet_sentiment usamos el módulo textblob.
analysis = TextBlob(self.clean_tweet(tweet))
TextBlob es en realidad una biblioteca de alto nivel construida sobre la biblioteca NLTK . Primero llamamos al método clean_tweet para eliminar enlaces, caracteres especiales, etc. del tweet usando alguna expresión regular simple.
Luego, cuando pasamos tweet para crear un objeto TextBlob , el siguiente procesamiento se realiza sobre el texto mediante la biblioteca textblob:- Tokenice el tweet, es decir, divida las palabras del cuerpo del texto.
- Elimina las palabras vacías de los tokens (las palabras vacías son las palabras de uso común que son irrelevantes en el análisis de texto como yo, soy, tú, eres, etc.)
- Realice el etiquetado POS (parte del discurso) de los tokens y seleccione solo características / tokens significativos como adjetivos, adverbios, etc.
- Pase los tokens a un clasificador de sentimientos que clasifique el sentimiento del tweet como positivo, negativo o neutral asignándole una polaridad entre -1.0 y 1.0.
Así es como se crea el clasificador de opiniones:
- TextBlob utiliza un conjunto de datos de reseñas de películas en el que las reseñas ya se etiquetaron como positivas o negativas.
- Las características positivas y negativas se extraen de cada revisión positiva y negativa respectivamente.
- Los datos de entrenamiento ahora consisten en características positivas y negativas etiquetadas. Estos datos se entrenan en un clasificador Naive Bayes .
Luego, usamos el método sentiment.polarity de la clase TextBlob para obtener la polaridad del tweet entre -1 y 1.
Luego, clasificamos la polaridad como:if analysis.sentiment.polarity > 0: return 'positive' elif analysis.sentiment.polarity == 0: return 'neutral' else: return 'negative'
- Finalmente, se devuelven los tweets analizados. Luego, podemos hacer varios tipos de análisis estadísticos en los tweets. Por ejemplo, en el programa anterior, tratamos de encontrar el porcentaje de tweets positivos, negativos y neutrales sobre una consulta.
Referencias:
- http://www.ijcaonline.org/research/volume125/number3/dandrea-2015-ijca-905866.pdf
- https://textblob.readthedocs.io/en/dev/quickstart.html#análisis-de-sentimientos
- textblob.readthedocs.io/en/dev/_modules/textblob/en/sentiments.html
Este artículo es una contribución de Nikhil Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA