Análisis de sentimiento de Twitter usando Python

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:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *