Génération de recommandations de chansons

Apr 26 2023
Jaykumar Patel, Janvi Patel, Aniketh Devarasetty, Malvika Vaidya, Seann Robbins, Tanner Hudnall Introduction Dans cet article, nous présenterons nos premières tentatives de création d'un modèle de recommandation de chansons. Nous donnerons une description de notre jeu de données et comment il a été utilisé.

Jaykumar Patel, Janvi Patel, Aniketh Devarasetty, Malvika Vaidya, Seann Robbins, Tanner Hudnall

Introduction

Dans cet article, nous présenterons nos premières tentatives de création d'un modèle de recommandation de chansons. Nous donnerons une description de notre jeu de données et comment il a été utilisé. Nous expliquerons ensuite la formation de notre modèle qui génère une courte liste de recommandations de chansons en fonction d'une chanson d'entrée. Enfin, nous discuterons des limites de notre modèle actuel et de la manière dont nous espérons l'améliorer à l'avenir.

But

Après avoir fait des recherches, cette tâche a déjà été tentée. Cependant, la plupart des systèmes de recommandations que nous avons étudiés ne tenaient pas compte de la signification des paroles. Par exemple, cet article examine les fonctionnalités de chanson fournies par la bibliothèque Spotipy qui ne fournit pas de paroles mais uniquement des fonctionnalités musicales telles que "dansance", "intensité", "clé", etc. Il procède ensuite à une analyse de ces fonctionnalités. tels que le clustering, t-SNE et PCA. Ce tutoriel de GeeksforGeeks utilise également une approche similaire.

En outre, cet article examine un hybride d'approche basée sur le "contenu" (qui recommande des chansons en fonction de ce que l'utilisateur a écouté dans le passé) et d'une approche basée sur la "collaboration" (qui recommande des chansons en fonction de ce que d'autres utilisateurs similaires ont aimé). Cependant, l'approche de l'article ne tient pas non plus compte des paroles ou de la signification d'une chanson lors de l'examen des caractéristiques.

De plus, nous avons remarqué un problème où le modèle de recommandation de Spotify met trop l'accent sur l'historique d'écoute de l'utilisateur lors de la recommandation de chansons. Nous voulions résoudre ce problème en nous concentrant spécifiquement sur la chanson et ses caractéristiques (plutôt que sur l'historique de l'utilisateur) lors de la recommandation de chansons.

Nous voulions capturer le sens des chansons ainsi que d'autres caractéristiques musicales, ce que d'autres modèles précédents n'ont pas réussi à faire. Cela inclurait les paroles des chansons ainsi que les informations fournies par l'API Spotify telles que la "danse", "l'énergie", la "clé", etc. Nous ferons désormais référence à ces informations fournies par l'API Spotify en tant que "fonctionnalités musicales".

Idéalement, notre modèle serait capable d'analyser les paroles et de générer une brève description ou un résumé de la chanson d'entrée, et de recommander jusqu'à 5 chansons similaires dans la description de la chanson d'entrée ainsi que les caractéristiques musicales.

Conception du modèle :

  • Puisque notre objectif est multimodal, nous avons décidé de scinder notre modèle en deux sous-modèles.
  • Notre premier modèle est un modèle de résumé NLP qui utilise les paroles de la chanson d'entrée pour générer une description.
  • Notre deuxième modèle est un modèle de clustering KNN qui trouve des chansons similaires à la chanson d'entrée en termes de caractéristiques musicales.
  • Afin de développer ces modèles, nous avons besoin d'un pipeline de données pour rassembler toutes les fonctionnalités dont ils ont besoin.

Nous avons examiné divers endroits pour des données telles que Kaggle et Hugging Face. Cependant, nous n'avons trouvé que des données qui comprenaient soit les paroles OU les caractéristiques musicales. Afin de créer un modèle de synthèse NLP capable de générer une description d'une chanson d'entrée, nous aurions besoin d'un ensemble de données contenant des paroles de chanson ainsi que des descriptions de chanson pour former le modèle NLP, que nous n'avons pas non plus trouvé. De plus, le modèle KNN aurait besoin des fonctionnalités musicales. Par conséquent, le plus grand défi de ce projet était de collecter les données nécessaires pour former nos modèles.

Voici l'approche finale de notre pipeline de données :

  1. Nous avons obtenu notre ensemble de données initial de Kaggle, qui comprenait les caractéristiques musicales des chansons.https://www.kaggle.com/datasets/maharshipandya/-spotify-tracks-dataset
  2. Ensuite, nous avons filtré l'ensemble de données initial de plus de 100 000 chansons pour n'inclure que les chansons dont la popularité était supérieure à 50. Cela a réduit l'ensemble de données à environ 26 000 chansons. Nous l'avons fait parce qu'idéalement, les chansons que nous recommandons devraient être sympathiques, et généralement, la popularité d'une chanson est corrélée à la sympathie.
  3. Ensuite, nous avons sélectionné au hasard 10 000 chansons. Nous l'avons fait parce que nous devions rassembler les paroles et les descriptions de ces chansons et cela deviendrait irréalisable (en termes de temps et d'argent) si nous examinions chaque chanson de l'ensemble de données.
  4. Ensuite, nous avons utilisé la bibliothèque fastText pour filtrer les chansons qui n'étaient pas en anglais en utilisant le modèle lid.176.ftz .
  5. Ensuite, nous avons utilisé LyricsGenius qui est un client python pour l' API Genius.com afin de pouvoir rassembler les paroles de nos chansons.
  6. Ensuite, pour générer des descriptions de chaque chanson, nous avons utilisé l'API de ChatGPT avec la requête suivante.

Nous avons formulé cette requête pour générer des recommandations à partir des caractéristiques intrinsèques des chansons et sans les caractéristiques d'identification (telles que le nom de l'artiste ou le nom de la chanson) afin de promouvoir la diversité et un plus large éventail de recommandations.

Après avoir alimenté notre ensemble de données Kaggle via ce pipeline, il nous restait environ 5000 chansons qui comprenaient les informations d'identification de la chanson, les caractéristiques musicales, les paroles et les descriptions. Cet ensemble de données prétraitées constitue la base du développement de nos deux modèles cibles. Nous appellerons ci-après cet ensemble de données simplement « l'ensemble de données ».

Modèle de synthèse

L'une des tâches principales consistait à former un modèle de synthèse qui serait utilisé pour générer une description de chanson pour la chanson d'entrée. Pour cela, nous avons utilisé la notion de modèles de transfert.

Nous avons utilisé le modèle t5-small pour générer le résumé des paroles de la chanson d'entrée de l'utilisateur. T5 est un modèle d'encodeur-décodeur qui est pré-entraîné pour effectuer diverses tâches telles que les traductions et les résumés. Tout ce dont le modèle a besoin dans un texte d'entrée avec un préfixe de sa tâche, tel que "résumer : <texte d'entrée>". Cependant, le modèle nécessite quelques ajustements pour produire le meilleur résultat pour une application spécifique. Nous avons donc formé le modèle t5-small pour résumer les paroles d'une chanson, en utilisant un ensemble de données d'environ 5 000 chansons en anglais, et ChatGPT a généré des résumés cibles. Le modèle a été entraîné pendant 40 époques et présentait une perte d'entropie croisée d'environ 2. Bien que cette perte soit relativement élevée, il s'agit d'un nombre raisonnable pour un entraînement uniquement sur 5 000 échantillons.

Les paramètres du modèle ont ensuite été enregistrés dans un fichier torche. Une fois les paramètres chargés dans le récapitulatif pré-entraîné par défaut, le modèle peut alors générer un résumé avec des paroles en entrée.

Description Comparaison

Nous avions besoin d'un moyen de comparer la description de la chanson d'entrée aux descriptions des ~ 5000 chansons de notre ensemble de données afin de déterminer les 500 meilleures chansons similaires.

Une façon de comparer deux textes consiste à les convertir dans un format vectorisé, puis à calculer la similitude cosinusoïdale entre eux, ce qui montre à quel point ils sont similaires en termes de contenu. Cette technique mesure l'angle cosinus entre deux vecteurs, où les vecteurs de textes plus similaires seront plus proches dans l'espace.

Par conséquent, afin de comparer les résumés de chansons, tous les résumés doivent être convertis en une représentation vectorielle. Deux approches possibles peuvent être adoptées : CountVectorizer ou TfidVectorizer. CountVectorizer compte simplement l'occurrence de chaque mot dans un document, créant une matrice creuse où chaque ligne représente un document et chaque colonne représente un mot. TfidVectorizer (qui signifie Term Frequency-Inverse Document Frequency Vectorizer), quant à lui, prend en compte la fréquence du terme dans le document ainsi que la fréquence inverse du terme dans le document. Cette fréquence inverse représente la "rareté" du terme, donc cette technique tient compte à la fois de la fréquence et de la rareté du mot, donnant ainsi un poids plus élevé aux mots plus importants et uniques et un poids plus faible aux mots communs.

Les résumés de l'ensemble de données et le résumé prédit du modèle ont été vectorisés à l'aide de TfidVectorizer de Python. La similarité cosinus a été calculée entre chaque entrée dans l'ensemble de données et le résumé prédit. Les 500 premières entrées de l'ensemble de données qui ont donné les scores de similarité cosinus les plus élevés représentent essentiellement les 500 chansons de l'ensemble de données dont la signification et le contenu sont les plus proches du résumé prévu de la chanson d'entrée.

Cette approche de vectorisation et de similarité cosinus semble bien fonctionner. Pour un résumé prédit donné, "Un homme et une femme entrent dans une relation amoureuse qui est méprisée par leurs familles. Ils doivent se battre pour leur amour », l'une des principales recommandations était une chanson intitulée « Again » de Wande Coal. Le résumé généré par ChatGPT de cette chanson est "La chanson parle d'un homme qui est amoureux d'une femme et veut passer le reste de sa vie avec elle. Il lui dit de ne pas écouter ce que les autres disent de lui et promet de la rendre heureuse. Ces deux textes ont un contenu relativement similaire dans la mesure où ils captent l'aspect romantique et un peu interdit de la relation.

Approche alternative:

Une autre approche pour vectoriser les paroles des chansons consiste à utiliser des incorporations de mots. Un modèle de transformateur BERT peut être formé sur les résumés de la chanson pour accomplir une tâche non pertinente. Une fois le modèle formé, chaque résumé peut être transmis au modèle sous forme de document. Pour chaque document, l'incorporation de document CLS sera extraite d'une des couches de sortie du modèle. Une incorporation de document CLS est la représentation vectorielle du jeton CLS, qui est un jeton qui capture l'intégralité du document. Cela nous donnera les représentations vectorielles de chaque résumé, puis les similitudes cosinus peuvent être calculées.

Nous avons constaté que cette technique n'était pas nécessaire pour la portée du projet. Il semblait que TfidVectorizer capturait assez correctement le sens des résumés et produisait une sortie solide.

Comparaison des fonctionnalités musicales

Ensuite, nous avions besoin d'un moyen de déterminer les 5 meilleures chansons similaires parmi les 500 en fonction des caractéristiques musicales. Les caractéristiques musicales étant numériques, nous avons pu utiliser K-Nearest-Neighbors de sklearn .

Après avoir filtré les chansons avec les paroles les moins similaires, l'étape suivante consiste à choisir les chansons avec les caractéristiques de chanson les plus similaires. Un moyen pratique de mesurer ces similitudes dans les caractéristiques consiste à analyser les classifications des caractéristiques des pistes de Spotify, qui quantifient les caractéristiques spécifiques d'une chanson telles que «l'acoustique» ou «l'énergie». À l'aide de l'API Spotify, nous pouvons rassembler ces métriques pour n'importe quelle chanson d'entrée, puis exécuter l'algorithme suivant pour obtenir les chansons similaires.

K Nearest Neighbors est un algorithme d'apprentissage automatique non supervisé qui peut être utilisé pour trouver les k points de données les plus proches d'un point donné, en fonction de la similitude des caractéristiques du point de données d'entrée et des points de l'ensemble de données. Nous pouvons utiliser cette technique pour comparer les caractéristiques de la chanson d'entrée de l'utilisateur à toutes les chansons filtrées, afin de trouver les k meilleures chansons qui ont les caractéristiques musicales les plus proches. Pour notre projet, nous avons décidé que trouver les 5 meilleures chansons voisines donnerait une sortie raisonnable, qui devraient toutes avoir des caractéristiques musicales similaires à la chanson de l'utilisateur.

Flux d'utilisateurs

Voici à quoi ressemble le processus pour un utilisateur souhaitant des recommandations. Ils entreraient une chanson qu'ils aiment. Nous utiliserions l'API LyricGenius pour obtenir les paroles de la chanson d'entrée. Nous utiliserions ensuite ces paroles pour générer une description à l'aide de notre modèle de synthèse NLP, et comparerions cette description avec les descriptions des chansons de notre ensemble de données pour déterminer les 500 meilleures chansons similaires. Ensuite, nous obtiendrions les caractéristiques musicales de la chanson d'entrée à l'aide de l'API de Spotify et les comparerions aux 500 chansons pour obtenir les 5 meilleures recommandations.

Résultats

Le modèle de résumé avait une perte d'entropie croisée d'environ 2 sur l'ensemble de validation. Nous avons également utilisé des métriques d'évaluation telles que Rouge1, Rouge2 et RougeL. Rouge1 et rouge2 représentent respectivement le nombre d'unigrammes et de bigrammes qui correspondent entre les paroles originales et la prédiction. Le score de RougeL représente la plus longue sous-séquence commune. Les scores de ces paramètres étaient respectivement de 0,25, 0,07 et 0,17, les valeurs les plus élevées étant plus favorables.

Bien que la perte soit relativement élevée et que les scores de rouge soient faibles, nous avons utilisé une évaluation humaine pour déterminer que les résumés générés étaient relativement comparables aux résumés générés par ChatGPT.

Voici une comparaison de la description générée par ChatGPT et par notre modèle de résumé (t5-small) pour la chanson "Riptide - The Chainsmokers":

Description générée par ChatGPT :

La chanson parle de vouloir passer sa vie avec quelqu'un à qui on tient et de tirer le meilleur parti du temps qu'ils passent ensemble. Les paroles évoquent également la peur de perdre cette personne et de se demander où elle ira quand ce sera fini.

Description Générée par notre modèle de synthèse — t5-small :

La chanson parle d'une personne qui essaie de changer sa vie et de la vivre avec elle si elle n'a qu'une nuit. Les paroles décrivent le sentiment d'être perdu tout seul et comment ils ont l'impression d'avoir perdu leur être cher. Malgré cela, le chanteur veut vivre sa vie avec une seule personne et ne passer la nuit qu'avec l'autre personne.

Pour comparer les descriptions des textes et calculer le KNN afin de déterminer les recommandations finales, nous n'avions aucune métrique d'évaluation. Comme il s'agit de techniques d'apprentissage non supervisées, nous avons également utilisé l'évaluation humaine.

Voici les recommandations générées pour la chanson "Riptide - The Chainsmokers":

Conclusion et travaux futurs

Nous avons remarqué que les chansons générées avaient un motif assez commun, mais le style des chansons était parfois différent. C'est parce que nous n'avons pas tenu compte du genre lors de la prédiction de la similarité des chansons. C'est donc quelque chose que nous aimerions ajouter à l'avenir.

De plus, nous aimerions augmenter le nombre de fonctionnalités d'une chanson, telles que l'ajout de la signature rythmique d'une chanson, l'instrumentation de la chanson et les informations sur l'artiste. Cela permettrait au modèle de recommander des chansons qui sont plus similaires.

De plus, nous voudrions également augmenter la taille de notre ensemble de données. Cela permettrait aux descriptions des chansons du modèle de synthèse d'être plus précises, améliorant ainsi les performances globales.