personal

WhatsApp Chat Analyzer

Herramienta en Python que convierte una exportación de WhatsApp en un informe interactivo con análisis de sentimiento, emociones, tópicos y redes de interacción.

GitHub

Un grupo de WhatsApp con años de historial es un dataset conversacional bastante rico que nadie mira nunca. Este proyecto nació de la curiosidad de responder preguntas concretas: quién arranca las conversaciones, cómo cambia el tono del grupo a lo largo del año, quién responde a quién.

Le pasas el .txt que exporta WhatsApp y devuelve un informe HTML interactivo.

bash
python analyze.py chat.txt --output informe.html

Del texto plano a un DataFrame#

La exportación de WhatsApp es texto plano con un formato que cambia según el idioma y la versión del móvil. El primer paso, y el más ingrato, es normalizarlo: separar marca temporal, autor y mensaje, y distinguir los mensajes reales de los eventos del sistema («Fulano se unió al grupo»).

A partir de ahí todo es Pandas: un DataFrame indexado por fecha sobre el que se apoyan el resto de análisis.

Qué analiza#

Actividad y ritmo#

Lo primero son los patrones temporales: volumen por usuario a lo largo del tiempo, longitud media de los mensajes y quién tiende a escribir párrafos frente a quién despacha en tres palabras.

Sentimiento y emociones#

Aquí es donde entra BERT. Un modelo de análisis de sentimiento en español asigna polaridad a cada mensaje, y un segundo modelo de clasificación de emociones etiqueta el tono concreto: alegría, enfado, sorpresa, tristeza.

Lo interesante no es la etiqueta de un mensaje suelto, sino la serie temporal: ver cómo se mueve el ánimo del grupo alrededor de fechas señaladas.

Quién habla con quién#

Contando qué mensaje responde a cuál se puede construir un grafo de interacción con NetworkX. El resultado suele ser el gráfico que más sorprende a la gente: los subgrupos dentro del grupo se ven a simple vista.

Matriz de respuestas entre usuarios
Heatmap de interacciones: quién responde a quién y con qué frecuencia

Tópicos#

Por último, LDA sobre el corpus completo para extraer los temas recurrentes sin definirlos de antemano.

Decisiones que cambiaron el resultado#

  • Modelos en español, no traducciones. Las primeras pruebas con modelos en inglés sobre texto traducido daban resultados planos. Cambiar a modelos entrenados en español fue la mejora más grande del proyecto.
  • Procesar por lotes. Pasar los mensajes a BERT de uno en uno hacía inviable un histórico largo. Agruparlos redujo el tiempo de un chat de tres años de horas a minutos.
  • Salida en HTML, no en imágenes. Con Plotly el informe es explorable: se puede hacer zoom en un mes concreto y ver qué pasó.

Privacidad#

Todo se ejecuta en local. El chat nunca sale de la máquina y el informe generado es un único archivo HTML que se puede borrar sin dejar rastro.