Blog
Análisis de Sentimientos con TextBlob y VADER en Python
- Publicado por: Rafael Fernandez
- Categoría: Procesamiento de texto
-Introducirnos a TextBlob.
-Aprender a instalar TextBlob.
-Aprender a instalar Vader.
-Veremos algunas sintaxis y códigos de ejemplo.
Bienvenidos a un tutorial rápido sobre cómo hacer análisis de sentimientos con Python. Hoy os voy a enseñar dos de las soluciones para análisis de sentimientos más populares para Python, TextBlob y VADER. Este tutorial se centrará en la consulta de estas 2 bibliotecas y su uso, y los siguientes tutoriales de esta serie se centrarán en la realización de una aplicación de análisis de sentimientos con Twitter.
TextBlob una librería de procesamiento de lenguaje natural
TextBlob es una librería Python (2 y 3) para procesar datos de texto. Proporciona una API consistente para sumergirse en tareas comunes de procesamiento de lenguaje natural (PNL) tales como etiquetado de parte del habla, extracción de frases sustantivas, análisis de sentimientos, y más.
Métricas de polaridad y subjetividad
Para comenzar nuestro viaje, veamos la oferta de TextBlob. Con TextBlob, obtenemos una métrica de polaridad y subjetividad. La polaridad es el sentimiento mismo, que va de -1 a +1. La subjetividad es una medida del sentimiento siendo objetivo a subjetivo, y va de 0 a 1. Preferimos ver el sentimiento que es objetivo que subjetivo, así que una puntuación más baja probablemente denote una lectura más precisa. Ya veremos.
Instalamos TextBlob
Para ello nos vamos al cmd.exe y lo ejecutamos en modo administrador y ejecutamos primero:
pip install textblob
Despues ejecutamos esta línea:
python -m textblob.download_corpora
Ahora ya estamos listo para usarlo y hacer nuestros primeros analisis:
from textblob import TextBlob analysis = TextBlob("This table is black") print(analysis.sentiment) print(analysis.tags) print(analysis.translate(to='es')) print(dir(analysis))
Analizamos este sencillo código
En este código hemos hecho 4 printf, por lo que vamos por partes:
- 1º printf (analysis.sentiment), el resultado es:
Sentiment(polarity=-0.16666666666666666, subjectivity=0.43333333333333335)
Aquí tenemos los valores de polariy y subjectivity de la frase “This table is black”
- 2º print(analysis.tags) el resultado es:
Aqui tenemos el analisis de cada palabra segun esta lista:
Lista de tags:
CC Conjunción de coordinación
CD dígito cardinal
DT Determinador
EX existencial allí (como: “hay”… piensa en ello como “existe”)
FW palabra extranjera
IN preposición/junta subordinación
JJ Adjetivo ‘grande’
JJR Adjetivo comparativo ‘más grande
JJS, Adjetivo superlativo ‘más grande’.
LS Marcador de lista 1)
MD modal podría, podrá
NN sustantivo, singular “desk” (escritorio)
NNS sustantivo plural ‘escritorios
NNP sustantivo propio, singular “Harrison”
NNPS sustantivo propio, plural ‘Americanos
PDT Predeterminador ‘todos los niños’.
POS posesivo final ‘de los padres’
PRP pronombre personal ‘él, ella’
PRP$ pronombre posesivo ‘mi, suyo, de ella’
RB adverbio muy, silenciosamente,
RBR, Adverbio comparativamente mejor
RBS adverbio, superlativo mejor
RP partículas
TO particula de infinitivo
UH interjección jajaa
VB verbo, ‘beber’
VBD verbo, tiempo pasado ‘tomó’
VBG verbo, gerundio/presente participio tomando
VBN verbo, participio pasado tomado
VBP verbo, cantar presente
VBZ verbo, tercera persona
WDT wh-determiner (which…)
WP pronombre de pregunta (quién, qué)
WP$ posesivo con pronombre (cuyo)
WRB wh-abverb (donde, cuando)
- 3º print(analysis.translate(to=’es’)) el resultado es:
Esta mesa es negra
Como puedes comprobar podemos traducir y cambiar de idioma. Una característica bastante interesante poque podemos analizar sin depender del idioma.
- 4º print(dir(analysis)) el resultado es:
Aquí podemos ver todos los métodos que contiene esta librería. Entre ellos ya hemos visto translate, tags y sentiment. Te animo a investigar y jugar con ellos.
Probamos TextBlob con nuestros ejemplos
Ahora vamos a probar TextBlob con una lista de frases positivas y otra negativas. Las dos listas son las siguientes:
Código para testear la librería TextBlob:
from textblob import TextBlob pos_count = 0 pos_correct = 0 with open("positivas.txt","r") as f: for line in f.read().split('\n'): analysis = TextBlob(line) #print(line) try: eng=analysis.translate(to='en') if eng.sentiment.polarity > 0: pos_correct += 1 pos_count +=1 except: #Mostramos este mensaje en caso de que se presente algún problema print ("El elemento no está presente") neg_count = 0 neg_correct = 0 with open("negativas.txt","r") as f: for line in f.read().split('\n'): analysis = TextBlob(line) #print(line) try: eng=analysis.translate(to='en') if eng.sentiment.polarity <= 0: neg_correct += 1 neg_count +=1 except: print('el elemento no esta presente') print("Precisión positiva = {}% via {} ejemplos".format(pos_correct/pos_count*100.0, pos_count)) print("Precisión negativa = {}% via {} ejemplos".format(neg_correct/neg_count*100.0, neg_count))
Resultado por consola:
Precisión positiva = 84.61538461538461% via 26 samples
Precisión negativa = 95.0% via 20 samples
Este resultado es muy interesante a priori ya que la librería es capaz de apreciar comentarios positivos y negativos a pesar de la traducción del castellano al inglés.
¿VADER podrá hacer algo similar?
Instalamos VADER
Como siempre ejecutamos en modo administrador el cmd y escribimos:
pip install vadersentiment
Hacemos los 1º test con VADER
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer analyzer = SentimentIntensityAnalyzer() vs = analyzer.polarity_scores("This table is black") print(vs)
Por la consola sale:
{‘neu’: 1.0, ‘compound’: 0.0, ‘pos’: 0.0, ‘neg’: 0.0}
¿Que significa estos resultados de VADER?
- neu=neutral
- compound= es una regla que normaliza, digamos que puede ser parecido a una media de los otros valores
- pos=positivo
- neg=negativo
En general podemos decir:
- positivo sentimiento: compound >= 0.5
- neutral sentimiento: (compound > -0.5) and (compound < 0.5)
- negativo sentimiento: compound <= -0.5
Para hacer una buena comparación debemos usar las mismas frases que con textblob y como nuestras frases están en castellano las tenemos que traducir al inglés. La frases en inglés son:
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer analyzer = SentimentIntensityAnalyzer() pos_count = 0 pos_correct = 0 with open("positive.txt","r") as f: for line in f.read().split('\n'): vs = analyzer.polarity_scores(line) if vs['compound'] > 0: pos_correct += 1 pos_count +=1 neg_count = 0 neg_correct = 0 with open("negative.txt","r") as f: for line in f.read().split('\n'): vs = analyzer.polarity_scores(line) if vs['compound'] <= 0: neg_correct += 1 neg_count +=1 print("Precisión Positiva = {}% via {} samples".format(pos_correct/pos_count*100.0, pos_count)) print("Precisión Negativa = {}% via {} samples".format(neg_correct/neg_count*100.0, neg_count))
La salida por consola es:
Precisión Positiva = 84.6% via 26 samples
Precisión Negativa = 80.0% via 20 samples
Ambas opciones son bastante buenas aunque para mí, sin embargo, estoy bastante interesado en TextBlob por la parte del etiquetado y la traducción. Si tengo que elegir entre TextBlob o VADER esto dependerá de las necesidades específicas que busque en cada caso.
Hemos llegado al final de este primer tutorial. Para ver el siguiente has click abajo:
Proyecto Dash con Análisis de Sentimientos en Python, 2º tutorial
muy bueno!
Hay algún dataset bueno con los labels de ejemplos en castellano.?
Asi tengo el modelo aprendido con datos reales..
Lo encontraste? Necesito esa base de datos con las etiquetas por favor jejej Si alguien la tiene que me escriba por favor. GRACIAS
Ahora yo soy el que se encuentra en las mismas. ¿Ustedes tuvieron suerte encontrando el dataset?
¡Hola!
Por si os interesa, os podéis descargar varios dataset del TASS desde http://tass.sepln.org/tass_data/download.php están etiquetados con los sentimientos y son todos en castellano 🙂
[…] Curso de Procesamiento de Textos en Python, 2º clase […]