Hoy he aprovechado el día para practicar R, lenguaje que estudio esporádicamente desde hace dos años. Después de conseguir que Twitter me diera acceso a la API tras semanas rechazando mi solicitud (fatigita).
El objetivo de acceso a la API de twitter era probar la librería “sentiment” de R para analizar el sentimiento de tweets sobre algún tema. He elegido personajes de actualidad: Biden y Trump, así como #CapitolRiots. He utilizado un naive bayes, que parte del supuesto de que las variables son independientes unas de otras, es decir, que contribuyen de forma independiente en la probabilidad y no están relacionadas. Dicha simplificación exige que se entrene en un entorno supervisado.
Para dicho análisis de sentimiento, he efectuado un análisis de emoción y otro de polaridad. Pero antes de ello, he realizado varias operaciones para poner a punto los datos, que es siempre la parte más tediosa y poco agradecida, pero sin la cual nada tiene sentido.
- Eliminación de RTs y menciones
- Eliminación de links y determinadas tabulaciones
- Eliminación de signos y dígitos
- Gestión de NA
- Eliminación de duplicados
Tras la limpia de tweets, obtengo el siguiente volumen de tweets en cada término sometido a análisis. Véase que en el hashtag #CapitolRiots hay una gran cantidad de duplicados, por lo que escogí una muestra de tweets mayor.
Trump | Biden | #CapitolRiots | |
Nº de tweets bruto | 1000 | 1000 | 3000 |
Nº de tweets depurados | 756 | 614 | 760 |
Resultados de Polaridad
Creo un par de gráficos por término con la librería ggplot2, uno con los resultados de polaridad, y otro con los resultados de emociones.
Tweets Trump | % | Polo |
223 | 29% | negative |
365 | 48% | positive |
168 | 22% | neutral |
Tweets Biden | % | Polo |
214 | 35% | negative |
292 | 48% | positive |
108 | 18% | neutral |
Tweets #CapitolRiots | % | Polo |
247 | 33% | negative |
372 | 49% | positive |
141 | 19% | neutral |
Resultados de emoción
Comentarios acerca de los resultados
Como se puede observar, no hay grandes diferencias en los resultados. Muchos tweets comparten las mismas keywords en el texto (tanto Trump, como Biden, o incluso #CapitolRiots, aunque menos) Sería conveniente realizar otro análisis incluyendo términos excluyentes.
El tesauro usado para clasificar las emociones es bastante más reducido que el de polaridad. Utiliza solo 1541 observaciones, que explica la gran cantidad de «unknown» que obtenemos. Además el modelo resulta poco preciso en este aspecto y favorece la emoción «joy», incluyendo términos como «like» que a menudo se usa para comparar (ej: «so we gon jus act like they ain’t find any bombs huh blacktwitter capitolriots«)
No obstante, es interesante ver las emociones que aparecen en 3º y 4º lugar, que son «sadness» y «anger», cuyos tweets encajan algo mejor. Veamos algunos ejemplos:
- Sadness:
and another one gone
and another one gone
another one bites the dust
o from here are six ways we can alleviate students’ distress in the days and weeks ahead even as we struggle to r…
- Anger
there is no way you can say you support lgbtq 🌈 and still say you hate gays coz to me aint supporting shit you a…
im still pissed off that trump supporters invaded the capitol building only us brits are allowed to do that…
Hay que tener en cuenta que la clasificación en un polo u otro, o en una emoción u otra, que hace este algoritmo se basa en un listado de palabras, aunque haya ajustes para la ambigüedad. La clasificación de un tweet como “negativo”, no quiere decir que ese usuario tenga una imagen u opinión negativa del político en cuestión, sino más bien, que se está expresando en esa clave. El algoritmo no es tan adecuado para determinar ese aspecto. Veamos un ejemplo de frase clasificada como “negative” y “joy” (júbilo, alegría)…dónde encontramos términos como “stupid” y “happy» que determinan la clasificación en uno u otro respectivamente.
Si los demócratas son lo suficientemente estúpidos como para renunciar a los estados de los Grandes Lagos, están perdidos. Biden necesita emitir un «Plan Marshall» para nuestra región con muchos beneficios para mantener felices a los «héroes de la clase trabajadora»
Otro ejemplo, clasificada como “negative”, debido al término “Serious” y “joy”, debido al término “loyalty”. La clasificación del tweet como negativo me parece correcta, ya que no está diciendo nada bonito, pero falla en identificar la emoción.
Grave bofetada a los trabajadores. La lealtad no significa nada para esta gente.
Conclusiones
Es conveniente repetir el análisis. Una muestra mayor de tweets aportará más información. Junto a ello, se hace necesario incluir stop words para evitar las apariciones simultáneas de unos u otros términos. Probaré también otras librerías de sentimiento. Esta solo permite análisis en inglés y no me parece muy precisa, puede que otras usen tesauros de mayor tamaño o traten mejor la ambigüedad. Actualizaré este artículo con las pruebas.