Gerando recomendações de músicas
Jaykumar Patel, Janvi Patel, Aniketh Devarasetty, Malvika Vaidya, Seann Robbins, Tanner Hudnall
Introdução
Neste artigo, mostraremos nossas tentativas iniciais de criar um modelo de recomendação de músicas. Daremos uma descrição do nosso conjunto de dados e como ele foi usado. Em seguida, explicaremos o treinamento de nosso modelo que gera uma pequena lista de recomendações de músicas a partir de uma música de entrada. Por fim, discutiremos as limitações de nosso modelo atual e como esperamos melhorá-lo no futuro.
Meta
Ao fazer a pesquisa, esta tarefa foi tentada anteriormente. No entanto, a maioria dos sistemas de recomendações que pesquisamos não levou em consideração o significado por trás das letras. Por exemplo, este artigo analisa os recursos de música fornecidos pela biblioteca do Spotipy , que não fornece letras, mas apenas recursos musicais como "dançabilidade", "volume", "tom" etc. como agrupamento, t-SNE e PCA. Este tutorial da GeeksforGeeks também usa uma abordagem semelhante.
Além disso, este artigo analisa um híbrido de abordagem baseada em “conteúdo” (que recomenda músicas com base no que o usuário ouviu no passado) e abordagem baseada em “colaboração” (que recomenda músicas com base no que outros usuários semelhantes gostaram). No entanto, a abordagem do artigo também não leva em consideração a letra ou o significado de uma música ao analisar os recursos.
Além disso, notamos um problema em que o modelo de recomendação do Spotify superestima o histórico de audição do usuário ao recomendar músicas. Queríamos resolver isso focando especificamente na música e em seus recursos (em vez do histórico do usuário) ao recomendar músicas.
Queríamos capturar o significado das canções, bem como outras características musicais, algo que outros modelos anteriores falharam em fazer. Isso incluiria letras de músicas, bem como informações fornecidas pela API do Spotify , como “dançabilidade”, “energia”, “chave” etc. A partir de agora, nos referiremos a essas informações fornecidas pela API do Spotify como “recursos musicais”.
Idealmente, nosso modelo seria capaz de analisar as letras e gerar uma breve descrição ou resumo da música de entrada e recomendar até 5 músicas que sejam semelhantes na descrição da música de entrada, bem como nas características musicais.
Projeto do modelo:
- Como nosso objetivo é multimodal, decidimos dividir nosso modelo em dois submodelos.
- Nosso primeiro modelo é um modelo resumido de PNL que usa a letra da música de entrada para gerar uma descrição.
- Nosso segundo modelo é um modelo KNN Clustering que encontra músicas semelhantes à música de entrada em termos de recursos musicais.
- Para desenvolver esses modelos, precisamos ter um pipeline de dados para reunir todos os recursos necessários.
Examinamos vários locais em busca de dados, como Kaggle e Hugging Face. No entanto, encontramos apenas dados que incluíam as letras OU as características musicais. Para criar um modelo de resumo de NLP capaz de gerar uma descrição de uma música de entrada, precisaríamos de um conjunto de dados que tivesse letras de músicas junto com descrições de músicas para treinar o modelo de NLP, que também não conseguimos encontrar. Além disso, o modelo KNN precisaria dos recursos musicais. Portanto, o maior desafio deste projeto foi reunir os dados necessários para treinar nossos modelos.
Aqui está a abordagem final para nosso pipeline de dados:
- Obtivemos nosso conjunto de dados inicial do Kaggle, que incluía as características musicais das canções.https://www.kaggle.com/datasets/maharshipandya/-spotify-tracks-dataset
- Em seguida, filtramos o conjunto de dados inicial de mais de 100.000 músicas para incluir apenas músicas com popularidade superior a 50. Isso reduziu o conjunto de dados para aproximadamente 26.000 músicas. Fizemos isso porque, idealmente, as músicas que recomendamos devem ser agradáveis e, geralmente, a popularidade de uma música está relacionada à simpatia.
- Em seguida, selecionamos aleatoriamente 10.000 músicas. Fizemos isso porque teríamos que coletar letras e descrições dessas músicas e seria inviável (em termos de tempo e dinheiro) se olhássemos todas as músicas do conjunto de dados.
- Em seguida, usamos a biblioteca fastText para filtrar as músicas que não estavam em inglês usando o modelo lid.176.ftz .
- Em seguida, usamos o LyricsGenius, que é um cliente python para a API do Genius.com , para poder coletar letras de nossas músicas.
- Então, para gerar as descrições de cada música, utilizamos a API do ChatGPT com a seguinte consulta.
Formulamos essa consulta para gerar recomendações a partir de características intrínsecas de músicas e sem as características de identificação (como nome do artista ou nome da música) para promover a diversidade e uma gama mais ampla de recomendações.
Depois de alimentar nosso conjunto de dados Kaggle por meio desse pipeline, ficamos com aproximadamente 5.000 músicas que incluíam as informações de identificação da música, recursos musicais, letras e descrições. Esse conjunto de dados pré-processado forma a base para o desenvolvimento de nossos dois modelos de destino. Daqui em diante, nos referiremos a esse conjunto de dados como simplesmente “o conjunto de dados”.
Modelo de sumarização
Uma das principais tarefas era treinar um modelo de resumo que seria usado para gerar uma descrição de música para a música de entrada. Para isso, utilizamos a ideia de modelos de transferência.
Usamos o modelo t5-small para gerar o resumo da letra da música de entrada do usuário. O T5 é um modelo de codificador-decodificador pré-treinado para executar várias tarefas, como traduções e resumos. Tudo o que o modelo precisa em um texto de entrada com um prefixo de sua tarefa, como “resumir: <texto de entrada>”. No entanto, o modelo precisa de algum ajuste fino para produzir a melhor saída para uma aplicação específica. Então, treinamos o modelo t5-small para resumir a letra de uma música, usando um conjunto de dados de aproximadamente 5.000 músicas em inglês, e o ChatGPT gerou resumos de destino. O modelo foi treinado por 40 épocas e teve uma perda de entropia cruzada de aproximadamente 2. Embora essa perda tenha sido relativamente alta, é um número razoável para treinar apenas em 5.000 amostras.
Os parâmetros do modelo foram então salvos em um arquivo de tocha. Depois que os parâmetros foram carregados no sumarizador pré-treinado padrão, o modelo pode gerar um resumo com algumas letras como entrada.
Descrição Comparação
Precisávamos de uma maneira de comparar a descrição da música de entrada com as descrições de aproximadamente 5.000 músicas em nosso conjunto de dados para determinar as 500 principais músicas semelhantes.
Uma maneira de comparar dois textos é convertê-los em um formato vetorizado e, em seguida, calcular a semelhança de cosseno entre eles, o que mostra como eles são semelhantes em conteúdo. Essa técnica mede o ângulo do cosseno entre dois vetores, onde os vetores de textos mais semelhantes ficarão mais próximos no espaço.
Portanto, para comparar os resumos das músicas, todos os resumos precisam ser convertidos em uma representação vetorial. Duas abordagens possíveis podem ser adotadas — CountVectorizer ou TfidVectorizer. CountVectorizer simplesmente conta a ocorrência de cada palavra em um documento, criando uma matriz esparsa onde cada linha representa um documento e cada coluna representa uma palavra. TfidVectorizer (que significa Term Frequency-Inverse Document Frequency Vectorizer), por outro lado, leva em consideração a frequência do termo no documento, bem como a frequência inversa do termo no documento. Essa frequência inversa representa a 'raridade' do termo, então essa técnica leva em consideração tanto a frequência quanto a raridade da palavra, portanto dando maior peso a palavras únicas e mais importantes e menor peso a palavras comuns.
Os resumos no conjunto de dados e o resumo previsto do modelo foram vetorizados usando o TfidVectorizer do python. A similaridade do cosseno foi calculada entre cada entrada no conjunto de dados e o resumo previsto. As 500 principais entradas do conjunto de dados que resultaram nas maiores pontuações de similaridade de cosseno representam essencialmente as 500 músicas do conjunto de dados que estão mais próximas em significado e conteúdo do resumo previsto da música de entrada.
Essa abordagem de vetorização e similaridade de cosseno pareceu funcionar bem. Para um determinado resumo previsto, “Um homem e uma mulher entram em um relacionamento romântico que é desprezado por suas famílias. Eles devem lutar por seu amor”, uma das principais recomendações foi uma música chamada “Again” de Wande Coal. O resumo gerado pelo ChatGPT desta música é “A música é sobre um homem que está apaixonado por uma mulher e quer passar o resto de sua vida com ela. Ele diz a ela para não ouvir o que os outros dizem sobre ele e promete fazê-la feliz.” Esses dois textos são relativamente semelhantes em conteúdo, pois capturam o aspecto romântico e ligeiramente proibido do relacionamento.
Abordagem alternativa:
Outra abordagem para vetorizar as letras das músicas é usar a incorporação de palavras. Um modelo de transformador BERT pode ser treinado nos resumos da música para realizar alguma tarefa irrelevante. Depois que o modelo é treinado, cada resumo pode ser passado para o modelo como um documento. Para cada documento, a incorporação do documento CLS será extraída de uma das camadas de saída do modelo. Uma incorporação de documento CLS é a representação vetorial do token CLS, que é um token que captura o documento inteiro. Isso nos dará as representações vetoriais de cada resumo e, em seguida, as semelhanças de cossenos podem ser calculadas.
Descobrimos que esta técnica não era necessária para o escopo do projeto. Parecia que o TfidVectorizer estava capturando o significado dos resumos de forma bastante decente e resultou em uma saída forte.
Comparação de recursos musicais
Em seguida, precisávamos de uma maneira de determinar as 5 principais músicas semelhantes entre as 500 com base nas características musicais. Como os recursos musicais eram numéricos, pudemos usar K-Nearest-Neighbours por sklearn .
Depois de filtrar as músicas com letras menos parecidas, o próximo passo é escolher as músicas com as características mais parecidas. Uma maneira conveniente de medir essas semelhanças em recursos é analisando as classificações de recursos de faixa do Spotify, que quantificam os recursos específicos de uma música, como “acústica” ou “energia”. Usando a API do Spotify, podemos reunir essas métricas para qualquer música de entrada e, em seguida, executar o seguinte algoritmo para obter as músicas semelhantes.
K Nearest Neighbors é um algoritmo de aprendizado de máquina não supervisionado que pode ser usado para encontrar os k pontos de dados mais próximos de um determinado ponto, com base na semelhança dos recursos do ponto de dados de entrada e dos pontos no conjunto de dados. Podemos empregar essa técnica para comparar os recursos da música de entrada do usuário com todas as músicas filtradas, para encontrar as k principais músicas que têm os recursos musicais mais próximos. Para o nosso projeto, decidimos que encontrar as 5 principais músicas vizinhas renderia uma saída razoável, todas com características musicais semelhantes à música do usuário.
Fluxo do usuário
Aqui está a aparência do processo para um usuário que deseja recomendações. Eles inseririam uma música de que gostassem. Usaríamos a API LyricGenius para obter as letras da música de entrada. Em seguida, usaríamos essas letras para gerar uma descrição usando nosso modelo de resumo NLP e compararíamos essa descrição com as descrições das músicas em nosso conjunto de dados para determinar as 500 principais músicas semelhantes. Em seguida, obteríamos os recursos musicais da música de entrada usando a API do Spotify e os compararíamos com as 500 músicas para obter as 5 principais recomendações.
Resultados
O modelo sumarizador teve uma perda de entropia cruzada de aproximadamente 2 no conjunto de validação. Além disso, usamos métricas de avaliação como Rouge1, Rouge2 e RougeL. Rouge1 e rouge2 representam o número de unigramas e bigramas, respectivamente, que correspondem entre a letra original e a previsão. A pontuação RougeL representa a subsequência comum mais longa. As pontuações para essas métricas foram 0,25, 0,07 e 0,17, respectivamente, onde valores mais altos são mais favoráveis.
Embora a perda seja relativamente alta e as pontuações rouge sejam baixas, usamos avaliação humana para determinar que os resumos gerados eram relativamente comparáveis aos resumos gerados pelo ChatGPT.
Aqui está uma comparação da descrição gerada pelo ChatGPT e pelo nosso modelo de resumo (t5-small) para a música “Riptide - The Chainsmokers”:
Descrição gerada pelo ChatGPT:
A música é sobre querer passar a vida com alguém de quem gosta e aproveitar ao máximo o tempo que passam juntos. A letra também aborda o medo de perder aquela pessoa e se perguntar para onde ela irá quando acabar.
Descrição Gerado pelo nosso modelo de resumo — t5-small:
A música é sobre uma pessoa que está tentando mudar sua vida e vivê-la com ela, mesmo que tenha apenas uma noite. A letra descreve a sensação de estar perdido por conta própria e como eles se sentem como se tivessem perdido um ente querido. Apesar disso, a cantora quer viver a vida com uma pessoa e só passar a noite com a outra.
Para comparar as descrições dos textos e calcular o KNN para determinar as recomendações finais, não tínhamos nenhuma métrica de avaliação. Como essas são técnicas de aprendizado não supervisionadas, também usamos a avaliação humana.
Aqui estão as recomendações geradas para a música “Riptide - The Chainsmokers”:
Conclusão e Trabalhos Futuros
Percebemos que as músicas geradas tinham um motivo bastante comum, mas o estilo das músicas era ocasionalmente diferente. Isso ocorre porque não levamos em conta o gênero ao prever a similaridade da música. Portanto, isso é algo que gostaríamos de adicionar no futuro.
Além disso, gostaríamos de aumentar o número de recursos de uma música, como adicionar fórmula de compasso, instrumentação da música e informações do artista. Isso permitiria que o modelo recomendasse músicas mais semelhantes.
Além disso, também gostaríamos de aumentar o tamanho do nosso conjunto de dados. Isso permitiria que as descrições das músicas do modelo de resumo fossem mais precisas, melhorando o desempenho geral.





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)