Análisis de sentimiento en Python con TextBlob

En este artículo, veremos cómo podemos usar la biblioteca TextBlob para el análisis de sentimientos. También veremos un ejemplo de cómo analizar los sentimientos de los tweets.

Introducción

Las tecnologías de punta en PNL nos permiten analizar lenguajes naturales en diferentes capas: desde la simple segmentación de información textual hasta métodos más sofisticados de categorizaciones de sentimientos.

Sin embargo, no significa inevitablemente que deba ser muy avanzado en programación para implementar tareas de alto nivel como el análisis de sentimientos en Python.

Análisis de sentimiento

Los algoritmos de análisis de sentimientos se centran principalmente en definir opiniones, actitudes e incluso emoticonos en un corpus de textos. La gama de sentimientos establecidos varía significativamente de un método a otro. Mientras que un analizador estándar define hasta tres emociones polares básicas (positiva, negativa, neutra), el límite de los modelos más avanzados es más amplio.

En consecuencia, pueden mirar más allá de la polaridad y determinar seis emociones "universales" (por ejemplo, ira, disgusto, miedo, felicidad, tristeza y sorpresa):

Scale of Emotions
[Fuente: Espectro de salud mental]{.small}

Además, según la tarea en la que esté trabajando, también es posible recopilar información adicional del contexto, como el autor o un tema que, en un análisis posterior, puede evitar un problema más complejo que una clasificación de polaridad común, a saber , identificación subjetividad/objetividad.

Por ejemplo, esta oración de Business Insider: "En marzo, Elon Musk describió la preocupación por el brote de coronavirus como "pánico" y "tonto", y desde entonces tuiteó información incorrecta, como su La teoría de que los niños son "esencialmente inmunes" al virus." expresa la subjetividad a través de una opinión personal de E. Musk, así como del autor del texto.

Análisis de sentimiento en Python con TextBlob

El enfoque que aplica el paquete TextBlob al análisis de opiniones difiere en que se basa en reglas y, por lo tanto, requiere un conjunto predefinido de palabras categorizadas. Estas palabras pueden, por ejemplo, cargarse desde la base de datos NLTK. Además, los sentimientos se definen en función de las relaciones semánticas y la frecuencia de cada palabra en una oración de entrada que permite obtener como resultado una salida más precisa.

Una vez que se completa el primer paso y se alimenta un modelo de Python con los datos de entrada necesarios, un usuario puede obtener los puntajes de sentimiento en forma de polaridad y subjetividad que se discutieron en la sección anterior. Podemos ver cómo funciona este proceso en este artículo de Foro Kapadia:

TextBlob stream

La salida de TextBlob para una tarea de polaridad es un flotante dentro del rango [-1.0, 1.0] donde -1.0 es una polaridad negativa y 1.0 es positiva. Esta puntuación también puede ser igual a 0, que representa una evaluación neutral de una declaración, ya que no contiene ninguna palabra del conjunto de entrenamiento.

Mientras que una tarea de identificación de subjetividad/objetividad informa un valor flotante dentro del rango [0.0, 1.0] donde 0.0 es una oración muy objetiva y 1.0 es muy subjetiva.

Hay varios ejemplos de interacción de Python con el analizador de opiniones de TextBlob: a partir de un modelo basado en diferentes conjuntos de datos Kaggle (por ejemplo, reseñas de películas) para calcular las opiniones de los tweets a través de la API de Twitter.

Pero, veamos un analizador simple que podríamos aplicar a una oración en particular o un texto corto. Primero comenzamos con la importación de la biblioteca TextBlob:

1
2
# Importing TextBlob
from textblob import TextBlob

Una vez importado, cargaremos una oración para el análisis e instanciaremos un objeto TextBlob, así como también asignaremos la propiedad sentimiento a nuestro propio análisis:

1
2
3
4
5
6
# Preparing an input sentence
sentence = '''The platform provides universal access to the world's best education, partnering with top universities and organizations to offer courses online.'''

# Creating a textblob object and assigning the sentiment property
analysis = TextBlob(sentence).sentiment
print(analysis)

La propiedad sentimiento es una tupla con nombre de la forma Sentimiento (polaridad, subjetividad).

Donde el resultado esperado del análisis es:

1
Sentiment(polarity=0.5, subjectivity=0.26666666666666666)

Además, también es posible buscar resultados de polaridad o subjetividad por separado simplemente ejecutando lo siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from textblob import TextBlob

# Preparing an input sentence
sentence = '''The platform provides universal access to the world's best education, partnering with top universities and organizations to offer courses online.'''

analysisPol = TextBlob(sentence).polarity
analysisSub = TextBlob(sentence).subjectivity

print(analysisPol)
print(analysisSub)

Lo que nos daría la salida:

1
2
0.5
0.26666666666666666

Una de las mejores cosas de TextBlob es que permite al usuario elegir un algoritmo para la implementación de las tareas de PNL de alto nivel:

  • PatternAnalyzer: un clasificador predeterminado que se basa en la biblioteca de patrones
  • NaiveBayesAnalyzer - un modelo NLTK entrenado en un corpus de reseñas de películas

Para cambiar la configuración predeterminada, simplemente especificaremos un analizador NaiveBayes en el código. Ejecutemos un análisis de sentimiento en los tweets directamente desde Gorjeo:

1
2
3
4
5
6
from textblob import TextBlob
# For parsing tweets
import tweepy 

# Importing the NaiveBayesAnalyzer classifier from NLTK
from textblob.sentiments import NaiveBayesAnalyzer

Después de eso, necesitamos establecer una conexión con la API de Twitter a través de claves de API (que puede obtener a través de una cuenta de desarrollador):

1
2
3
4
5
6
7
8
9
# Uploading api keys and tokens
api_key = 'XXXXXXXXXXXXXXX'
api_secret = 'XXXXXXXXXXXXXXX'
access_token = 'XXXXXXXXXXXXXXX'
access_secret = 'XXXXXXXXXXXXXXX'

# Establishing the connection
twitter = tweepy.OAuthHandler(api_key, api_secret)
api = tweepy.API(twitter)

Ahora, podemos realizar el análisis de tweets sobre cualquier tema. Una palabra buscada (por ejemplo, * bloqueo *) puede ser una o más palabras. Además, esta tarea puede llevar mucho tiempo debido a la gran cantidad de tweets. Se recomienda limitar la salida:

1
2
3
4
# This command will call back 5 tweets within a lockdown topic
corpus_tweets = api.search("lockdown", count=5) 
for tweet in corpus_tweets:
    print(tweet.text)

La salida de este último fragmento de código traerá cinco tweets que mencionan la palabra buscada de la siguiente forma:

1
[correo electrónico protegido]: How Asia's densest slum contained the virus and the economic catastrophe that stares at the hardworking slum population...

El último paso en este ejemplo es cambiar el modelo predeterminado al analizador NLTK que devuelve sus resultados como una ’tupla con nombre’ de la forma: ‘Sentimiento (clasificación, p_pos, p_neg)’:

1
2
3
4
5
# Applying the NaiveBayesAnalyzer
blob_object = TextBlob(tweet.text, analyzer=NaiveBayesAnalyzer())
# Running sentiment analysis
analysis = blob_object.sentiment
print(analysis)

Finalmente, nuestro modelo de Python nos dará la siguiente evaluación de sentimiento:

1
Sentiment(classification='pos', p_pos=0.5057908299783777, p_neg=0.49420917002162196)

Aquí, se clasifica como un sentimiento positivo, con los valores p_pos y p_neg siendo ~0.5 cada uno.

Conclusión

En este artículo, cubrimos qué es el Análisis de sentimiento, después de lo cual usamos la biblioteca TextBlob para realizar un Análisis de sentimiento en oraciones importadas y tweets. .