Homenaje a David Bowie (y III)
En este artículo voy a concluir el breve análisis sobre las canciones de David Bowie disponiendo un modelo sobre el que se puedan buscar las canciones más cercanas a otra.
En el artículo anterior hice una exploración de las canciones a través de la generación de clusteres y la visualización del árbol asociado. Ahora, se tratar de disponer de un modelo práctico que permita consultar dinámicamente por las canciones más próximas a una determinada.
Los datos
Son las mismas 254 canciones de los 25 albumes que he utilizado en el primer análisis.
En este caso, para calcular la distancia entre canciones, voy a utilizar la frecuencia de término – frecuencia inversa de documento (tf-idf) de cada palabra, en lugar de la frecuencia absoluta de aparición de cada palabra.
La ventaja de este algoritmo es que da más peso a las palabras que son muy frecuentes en algunos documentos, pero en un número pequeño relativo de documentos del corpus. Es decir, hace que unas palabras sean más significativas que otras. Con este sistema, la nube de palabras cambia algo:
Canciones cercanas a una determinada
Utilizando la matriz de términos y frecuencias basada en tf-idf se puede determinar de forma sencilla qué canciones son las más cercanas a una dada, basándonos, como en el artículo anterior, en la distancia euclídea entre canciones, utilizando los valores del vector de palabras de cada canción.
Este método, al utilizar tf-idf, da mejores resultados que la clasificación en árbol del artículo anterior, que se basaba en las frecuencias absolutas. Basta utilizar td-idf en el artículo anterior para conseguir resultados similares.
Veamos, por ejemplo, las canciones más próximas a Lazarus:
song | distance |
---|---|
Lazarus | 0.0000000 |
Cygnet Committee | 0.6709544 |
Candidate | 0.7180088 |
You Feel So Lonely You Could Die | 0.7256923 |
We Are The Dead | 0.7280794 |
Shining Star (Makin' My Love) | 0.7353172 |
Somebody Up There Likes Me | 0.7379833 |
Something In The Air | 0.7549199 |
Ashes To Ashes | 0.7621797 |
Five Years | 0.7644335 |
Veamos qué canciones son encuentra nuestro método que son las más parecidas a Space Oddity:
song | distance |
---|---|
Space Oddity | 0.0000000 |
Ashes To Ashes | 0.8647541 |
Cygnet Committee | 0.9391786 |
Candidate | 0.9655204 |
You Feel So Lonely You Could Die | 0.9688882 |
We Are The Dead | 0.9700174 |
Shining Star (Makin' My Love) | 0.9855299 |
If You Can See Me | 0.9894812 |
Somebody Up There Likes Me | 0.9911007 |
Five Years | 1.0024585 |
El algoritmo encuentra que la canción más parecida es Ashes to Ashes. Es decir, la canción en la que aparece también el Major Tom. Esto es una mejora significativa con respecto al sistema basado en las frecuencias absolutas del artículo anterior (Se puede buscar allí y se observará la diferencia).
Probemos una más, la canción “Heroes”
song | distance |
---|---|
“Heroes” | 0.0000000 |
Cygnet Committee | 0.7270792 |
You Feel So Lonely You Could Die | 0.7499512 |
Candidate | 0.7565930 |
We Are The Dead | 0.7641921 |
Shining Star (Makin' My Love) | 0.7683600 |
Somebody Up There Likes Me | 0.7725134 |
If You Can See Me | 0.7843719 |
When I Live My Dream | 0.7858126 |
Something In The Air | 0.8051492 |
Red de canciones
Al tener las distancias entre las canciones, podemos visualizar estas relaciones entre ellas mediante una red.
Si visualizásemos las distancias entre todas, la red sería inmanejable, basta con incluir las relaciones más significativas, Para tener una idea de lo que supone (en cualquier caso 254 canciones, crean una red muy compleja de visualizar).
Para poder hacer zoom infinito en esta red, lo mejor es abrila directamente en su propia solapa del navegador siguiendo este enlace: red de canciones. También cabe descargar la imagen y mostrarla con un visor de documentos svg.
En el centro de la red se encuentran las canciones que tienen más relaciones. Las restantes, se disponen alrededor.
Referencias
El documento R (rmarkdown) para reproducir este análisis puede encontrarse en este enlace