Cómo usar data science para analizar emociones en una canción

el

La disciplina conocida como ciencia de datos (data science) es una de las ramas de las ciencia de la computación que más importancia tiene actualmente. El análisis, clasificación y visualización de datos se convierten en un trabajo arduo sobre todo cuando hablamos de grandes cantidades de los mismos, pero su implementación genera resultados que son más que interesantes desde el punto de vista técnico.

Así lo ha demostrado Charlie Thompson, que ha realizado un experimento bastante peculiar. Charlie Thompson logró analizar el nivel de un concepto tan abstracto como la depresión en una canción, usando precisamente análisis de datos, categorización, herramientas como R y servicios de streaming de música.

Es acertado el uso de R ya que es un lenguaje de programación pensado para análisis estadístico y minería de datos, es open source y proporciona un amplio abanico de herramientas estadísticas y gráficas además de proveer un entorno de ejecución para el análisis.

Las canciones analizadas en el experimento pertenecen a la banda Radiohead (para quienes no la conozcan es una banda británica bastante popular internacionalmente). Sus fanáticos son conscientes de que sus canciones no son para nada felices, se ha calificado al compositor de sus letras, Thom Yorke de ser increíblemente depresivo.

En este artículo realizaremos una descripción detallada del experimento realizado por Charlie Thompson, quien logra desarrollar un análisis técnico para determinar y cuantificar el nivel de “tristeza” en cada una de las canciones de los 9 álbumes de la mencionada banda, usando R, la API de Spotify y Genius Lyrics y programando un análisis léxico de cada canción.

Obteniendo los datos

Para obtener datos valiosos a la hora de analizar música, la API de Spotify, el popular servicio de streaming, es ideal. Spotify provee entre sus datos de retorno un conjunto de atributos bastante interesantes, entre los cuales destacaremos uno llamado “valence”, que en la documentación de la API se define como:

La medida entre 0.0 y 1.0 que describe la positividad musical de cada track. Los tracks con altos valores en “valence” suenan más positivos (felices, alegres, eufóricos), mientras que los tracks con bajo valores en “valence” suenan más negativos (tristes, deprimidos, furiosos).

Ahora bien, usando este “valence” o valencia, es bastante fácil categorizar los datos, pero, ¿Qué otros factores intervienen en la tristeza de una canción?. Usar sólamente el atributo retornado de la API de Spotify haría del experimento algo excesivamente sencillo, reduciéndose a el simple ordenamiento de los datos. Según el experimento realizado por Charlie Thompson, la letra influye muchísimo en la depresividad de una canción, por lo que incluye también en su stack, la API de Genius Lyrics.

La primera fase del experimento consistió en clasificar los tracks de cada álbum únicamente por su valencia seǵun la API de Spotify, mediante una consulta de datos usando R, arrojando un resultado más o menos así (no explicaremos para efectos de este post el fetch de los datos):

track_df %>% 
    select(valence, track_name) %>%
    arrange(valence) %>% 
    slice(1:10)

    valence                      track_name
1    0.0378             We Suck Young Blood
2    0.0378                 True Love Waits
3    0.0400                     The Tourist
4    0.0425       Motion Picture Soundtrack
5    0.0458                Sail To The Moon
6    0.0468                       Videotape
7    0.0516            Life In a Glasshouse
8    0.0517 Tinker Tailor Soldier Sailor...
9    0.0545                     The Numbers
10   0.0585   Everything In Its Right Place

Así, vemos que es bastante sencillo. Quedó determinando que las canciones “We Suck Young Blood” y “True Love Waits” representan las canciones mas tristes de Radiohead, pero sin involucrar la densidad de las letras de cada una.

La segunda fase del experimento consistió en hacer un mapeo de palabras que representarán tristeza en cada uno de los tracks. Para ello, se usó una base de datos conocida como NCR Word Emotion Association Lexicon, el cual categoriza ciertas palabras con emociones como negatividad, miedo, tristeza, furia, etc.

Para cuantificar la densidad de “palabras tristes” en cada track debe estar cargada la data tanto de cada álbum de Spotify, como de la API de Genius Lyrics y hacer el mapeo con la base de datos de NRC, para ello, el siguiente código en R nos puede ilustrar de como sería el procedimiento:

library(tidytext)

sad_words <- sentiments %>% 
    filter(lexicon == 'nrc', sentiment == 'sadness') %>% 
    select(word) %>% 
    mutate(sad = T)

sent_df <- track_df %>% 
    unnest_tokens(word, lyrics) %>%
    anti_join(stop_words, by = 'word') %>%
    left_join(sad_words, by = 'word') %>%
    group_by(track_name) %>% 
    summarise(pct_sad = round(sum(sad, na.rm = T) / n(), 4),
              word_count = n()) %>% 
    ungroup

sent_df %>% 
    select(pct_sad, track_name) %>%
    arrange(-pct_sad) %>% 
    head(10)

   pct_sad              track_name
     <dbl>                   <chr>
1   0.3571            High And Dry
2   0.2955              Backdrifts
3   0.2742       Give Up The Ghost
4   0.2381         True Love Waits
5   0.2326 Exit Music (For a Film)
6   0.2195            Karma Police
7   0.2000            Planet Telex
8   0.1875                Let Down
9   0.1842 A Punch Up At a Wedding
10  0.1800               Identikit

Así, vemos un resultado diferente, el porcentaje de palabras tristes (el atributo pct_sad) difiere con el del valence de Spotify, siendo según esta concepción “High And Dry” la canción más depresiva considerando solamente la lírica de la misma. El algoritmo recogió palabras en inglés como “broke,” “fall,” “hate,” “kill,” and “leave”, y la repetición de las mismas en toda la canción.

 

Sin embargo, vemos que “True Love Waits”, está entre las diez primeras, cosa que ocurría también en el paso del experimento anterior. El paso siguiente más lógico sería entonces hacer un mapping y enlazar tanto la valencia del sonido de cada track con su densidad lírica.

Entendiendo la densidad lírica

Para combinar ambos conceptos, se usó el análisis de Myles Harrison, que en un artículo  publicado en un blog de R, explora el concepto de la densidad lírica. En el artículo, Myles realiza un análisis gráfico basándose en la siguiente fórmula:

Wikipedia define que la densidad lírica (Ld) de un texto constituye un valor estimado de contenido por cada unidad léxica computable (un lexema). ¿Y qué quiere decir esto?, la densidad lírica es la cantidad de significado de un texto según su longitud.

Cada elemento de la fórmula se define como sigue:

  • Nlex = El número de unidades léxicas con significado en el texto (sustantivos, adjetivos, verbos, adverbios, etc).
  • N = El número de palabras total en el texto analizado

Tenemos que la densidad léxica no es más que la razón entre las unidades de texto con significado sobre el número total de palabras, es decir, la distribución de significado en todo el texto, considerando como “unidades de significado” palabras que no sean conectores entre ellas.

Por lo general, un texto hablado suele tener menos densidad léxica que los textos escritos, por lo que el texto escrito, puede expresar significado en menos cantidad de palabras.

Usando la duración de cada track y el número de palabras de la letra, se realizó el cálculo de la densidad lírica de cada canción. Para crear un índice de oscuridad (o gloomIndex, como se define en el experimento) se definió una fórmula para computar la valencia de Spotify, el porcentaje de palabras tristes de cada canción y la densidad lírica de las mismas, siendo la fórmula la siguiente:

Una vez definida la fórmula en el entorno de ejecución en R, una consulta para obtener un resumen calculado de cada elemento mencionado anteriormente sería de la siguiente forma:

track_df %>%
    select(gloom_index, track_name) %>%
 arrange(gloom_index) %>%
 head(10)

    gloom_index                track_name
          <dbl>                     <chr>
1          1.00           True Love Waits
2          6.46         Give Up The Ghost
3          9.35 Motion Picture Soundtrack
4         13.70                  Let Down
5         14.15              Pyramid Song
6         14.57   Exit Music (For a Film)
7         15.29           Dollars & Cents
8         15.69              High And Dry
9         15.80 Tinker Tailor Soldier ...
10        16.03                 Videotape

Así, vemos que existe un ganador. La canción más depresiva, considerando su sonido, porcentaje de palabras tristes y cantidad de significado de la letra es True Love Waits. Esta canción no sólo tenía la valencia más baja en Spotify, sino que también la relación entre el significado de sus palabras respecto al porcentaje de palabras tristes es bastante considerable, lo que aumenta el gloomIndex de la misma. Si no lo crees así, puedes escucharla aquí

Charlie Thompson no se detuvo allí, sino que además categorizó cada álbum según su tristeza, siendo simplemente un porcentaje del índice individual de cada track.

Aquí puedes ver el gráfico completo

La conclusión es que el álbum más depresivo de Radiohead es, según este análisis “A Moon Shaded Pool”, su más reciente producción. No es de extrañar que True Love Waits se encuentre en este mismo álbum.

Un punto interesante a destacar es que este método es bastante plano, por lo que no puede analizar “ironías” en la letra de las canciones, por lo que canciones como “Fillter Happier” están en el top de las menos tristes, cuando realmente no es así.

Así, vemos que la ciencia de datos se convierte en una herramienta considerablemente útil para analizar de forma minuciosa grandes cantidades de información. La posibilidad de categorizar, ordenar, y poder generar índices según los atributos de los datos es fundamental cuando queremos generar información para análisis estadístico, toma de decisiones y filtrado en bases de datos enormes.

Este experimento es bastante sencillo, pero homologar su método en otros ámbitos, empresariales, técnicos o inclusive en proyectos personales nos pueden generar ideas e información interesante. El análisis léxico realizado por Charlie Thompson es bastante completo y nos permite cuantificar significado de forma programática, pudiendo así desarrollar herramientas de análisis de textos, con cierta inteligencia para mejorar los mismos.

Si quieres hacer pruebas con canciones de un artista en específico, puedes usar el código base que fue publicado en github . Verás allí la función para conectarse a la api de Spotify y buscar el artista, donde “Radiohead” está hardcodeado. Si no quieres meterte aún con el código puedes usar esta app también escrita por Charlie Thompson, donde puedes introducir el nombre de cualquier artista, seleccionar un álbum y ver una gráfica con los valores dispersos por emoción.

¿Conoces algun experimento similar? ¿En qué otro campo piensas que es posible aplicar esta metodología? ¿Hiciste pruebas y conseguiste algún resultado interesante? Contéstanos con un comentario en este post.

Este un artículo está basado en su totalidad en el siguiente: http://rcharlie.com/2017-02-16-fitteR-happieR/

Referencias:

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s