Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
Pythonchevron-right

Um mecanismo de recomendação de músicas e playlists do Spotify

Rachelle Palmer6 min read • Published Jun 23, 2022 • Updated Nov 13, 2023
SparkIAMongoDBVisualização de dadosPython
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse exemplo de código
star-empty
star-empty
star-empty
star-empty
star-empty
social-githubVer código
Experimente

Criadores

Lucas De Oliveira, Chandrish Ambati e Anish Mukherjee, da Universidade de São Francisco, contribuíram com este projeto incrível.

Background do projeto

Em 2018, o Spotify organizou um RecSys Challenge da Association for Computing Machinery (ACM) no qual publicou um conjunto de dados de um milhão de playlists, desafiando os participantes a recomendar uma lista de 500 músicas com base em uma playlist criada pelo usuário.
Como fãs de música e cientistas de dados, topamos esse desafio na hora. Então logo concordamos que combinar embeddings de músicas com algum método de vizinhos mais próximos provavelmente geraria resultados muito bons. O principal era descobrir como resolver essa tarefa de recomendação em grande escala com mais de 4 bilhões de playlists selecionadas por usuários no Spotify, sendo que esse número continuava a crescer. Essa constatação gerou grandes dúvidas sobre como treinar um modelo decente, já que todos esses dados provavelmente não caberiam em uma memória física ou em um único servidor.

O que construímos

Este projeto resultou em um pipeline ETL escalável utilizando
  • Apache Spark
  • MongoDB
  • Amazon S3
  • Databricks (PySpark)
Eles foram usados para treinar um modelo Word2Vec de aprendizado profundo para criar incorporações de músicas e playlists para recomendação. Buscamos visualizações de dados que criamos no Projetor de Incorporação do Tensorflow.

O processo

Coleta de letras

A tarefa mais tediosa desse projeto foi coletar o maior número possível de letras das músicas nas playlists. Começamos isolando as músicas exclusivas nos arquivos da playlist pelo URI da faixa; no total, tínhamos mais de 2 milhões de músicas únicas. Em seguida, usamos o nome da faixa e o nome do artista para procurar as letras na web. Inicialmente, usamos solicitações simples do Python para extrair as informações da letra, mas isso ficou muito lento para nossos propósitos. Em seguida, usamos asyncio, que nos permite fazer solicitações simultaneamente. Isso acelerou significativamente o processo, reduzindo o tempo de download de letras de 10.000 músicas de 15 minutos para menos de um minuto. No final, só foi possível coletar letras de 138.000 músicas.

Pré-processamento

O conjunto de dados original contém 1 milhão de playlists distribuídas em 1 mil arquivos JSON, totalizando cerca de 33 GB de dados. Usamos o PySpark no Databricks para pré-processar esses arquivos JSON separados em um único DataFrame SparkSQL e, em seguida, juntamos esse DataFrame com as letras que salvamos.
Embora as etapas de coleta e pré-processamento de dados mencionadas acima sejam demoradas, o modelo também precisa ser retreinado e reavaliado com frequência, por isso é fundamental armazenar dados em um banco de dados dimensionável. Além disso, gostaríamos de usar um banco de dados sem esquema para expansão futura em conjuntos de dados fosse compatível com vários tipos de dados. Considerando nossas necessidades, concluímos que o MongoDB seria a solução ideal como armazenamento de dados e recursos.
Confira o notebook Preprocessing.ipynb para ver como pré-processamos os dados.

Treinamento de incorporações de músicas

Para nossas análises, lemos nossos dados pré-processados do MongoDB em um Spark DataFrame e agrupamos os registros por ID da playlist (PID), agregando todas as músicas de uma playlist em uma lista na coluna song_list. Usando o modelo Word2Vec no Spark MLlib, treinamos a incorporação de músicas inserindo listas de IDs de faixas de uma playlist no modelo, da mesma forma que você enviaria uma lista de palavras de uma frase para treinar a incorporação de palavras. Conforme mostrado abaixo, treinamos a incorporação de músicas em apenas 3 linhas do código PySpark:
1from pyspark.ml.feature import Word2Vec
2word2Vec = Word2Vec(vectorSize=32, seed=42, inputCol="song_list").setMinCount(1)
3word2Vec.sexMaxIter(10)
4model = word2Vec.fit(df_play)
Em seguida, salvamos os embeddings de músicas no MongoDB para uso posterior. Abaixo está um snapshot do DataFrame de incorporações de músicas que salvamos:
Confira o notebook Song_Embeddings.ipynb para ver como treinamos a incorporação de músicas.

Treinamento de incorporações de playlists

Por fim, estendemos nossa tarefa de recomendação além das simples recomendações de músicas para recomendar playlists inteiras. Dada uma playlist de entrada, retornaríamos as mil playlists mais próximas ou semelhantes. Adotamos uma abordagem “continuous bag of songs” para esse problema calculando as incorporações de playlists como a média de todas as incorporações de músicas nessa playlist.
Este fluxo de trabalho começou com a leitura das incorporações de músicas do MongoDB em um DataFrame SparkSQL. Em seguida, calculamos a incorporação de uma playlist pegando a média de todas as incorporações de músicas nessa playlist e as salvamos no MongoDB.
Confira o notebook Playlist_Embeddings.ipynb para ver como fizemos isso.

Treinamento de incorporações de letras

Você ainda está lendo? Ufa!
Treinamos a incorporação de letras carregando as letras de uma música, separando as palavras em listas e alimentando essas palavras em um modelo Word2Vec para produzir 32 vetores dimensionais para cada palavra. Em seguida, tomamos a incorporação média em todas as palavras como a incorporação lírica da música. Por fim, nosso objetivo analítico aqui era determinar se os usuários criam playlists com base em temas comuns de letras, verificando se a distância de incorporação de músicas em pares e a distância de incorporação de letras em pares entre duas músicas estavam correlacionadas. Como era de se esperar, parece que não são.
Confira o notebook Lyrical_Embeddings.ipynb para ver nossa análise.

Notas sobre nossa abordagem

Você pode estar se perguntando por que usamos um modelo de linguagem (Word2Vec) para treinar essas incorporações. Por que não usar um Pin2Vec ou um modelo de rede neural personalizado para prever classificações implícitas? Por motivos práticos, queríamos trabalhar exclusivamente no ecossistema Spark e lidar com os dados de forma distribuída. Essa foi uma restrição definida no projeto com antecedência e nos desafiou a pensar de forma criativa.
No entanto, achamos o Word2Vec um modelo de candidato tentador também por motivos teóricos. O modelo Word2Vec usa o contexto de uma palavra para treinar incorporações estáticas treinando as incorporações da palavra de entrada para prever as palavras circundantes. Essencialmente, a incorporação de qualquer palavra é determinada pela sua coocorrência com outras palavras. Isso tinha um mapeamento claro de nosso próprio problema: ao usar um modelo Word2Vec, a distância entre as incorporações de músicas refletiria a coocorrência das músicas em 1 milhão de playlists, tornando-a uma medida útil para uma recomendação baseada na distância (vizinhos mais próximos). Ele modelaria efetivamente como as pessoas agrupam as músicas, usando o comportamento do usuário como fator determinante da similaridade.
Além disso, o modelo Word2Vec aceita entrada em forma de lista de palavras. Para cada playlist, tínhamos uma lista de IDs de faixas, o que tornava atraente o trabalho com o modelo Word2Vec.

Visualizações de dados com Tensorflow e MongoDB

Depois de tudo isso, finalmente estávamos prontos para visualizar nossos resultados e fazer algumas recomendações interativas. Decidimos representar visualmente nossos resultados de incorporação usando o Projetor de incorporação do Tensorflow, que mapeia as incorporações de músicas e listas de reprodução de 32 dimensões em uma visualização interativa de um espaço de incorporação de 3D. Você tem a opção de usar PCA ou tSNE para redução de dimensionalidade e similaridade de cosseno ou distância euclidiana para medir distâncias entre vetores.
Clique aqui para o projetor de incorporações de músicas para o total de 2 milhões de músicas, ou aqui para uma versão menos cheia com uma amostra aleatória de 100mil músicas (mostrada abaixo):
A vantagem de usar o projetor do Tensorflow é que ele nos oferece uma bela ferramenta de visualização e uma calculadora de distância, tudo em um. Tente pesquisar uma música no painel direito e, se a música fizer parte do conjunto de dados original, você verá as músicas “most similar” aparecerem abaixo dela.

Uso do MongoDB para ML/AI

Ficamos impressionados com a facilidade de usar o MongoDB para armazenar e carregar nossos dados de forma confiável. Como estávamos usando computação distribuída, teria sido inviável executar nosso pipeline do início ao fim sempre que quiséssemos atualizar nosso código ou ajustar o modelo. O MongoDB permitiu que salvássemos nossos resultados incrementais para processamento e modelagem posteriores, o que nos poupou horas de espera para que o código fosse executado novamente.
Funcionou bem com todas as ferramentas que usamos todos os dias e as ferramentas que escolhemos – não tivemos áreas de atrito.
Ficamos impactados com a forma como esse método de treinamento de incorporações realmente funcionava. Embora o projetor de incorporação de músicas de 2 milhões esteja visualmente aglomerado, vemos que as recomendações que ele produz são realmente muito boas para agrupar músicas.
Considere a recomendação de incorporação para "A Day In The Life", dos Beatles:
Ou a recomendação para “Heart of the City (Ain’t No Love)” de Jay Z:
Fã de Taylor Swift? Aqui estão as recomendações para "New Romantics":
Ficamos muito satisfeitos ao encontrar clusters que ocorrem naturalmente nas incorporações da playlist. Mais notavelmente, vemos um grupo contendo principalmente rock cristão, um com música natalina, um para reggaeton e um grande grupo onde os gêneros abrangem sua extensão de forma contínua e intuitiva.
Observe também que, quando selecionamos uma playlist, temos muitas playlists recomendadas com os mesmos nomes. Isso, em essência, valida nossas incorporações de músicas. Lembre-se de que as incorporações de playlists foram criadas considerando a incorporação média de todas as suas músicas; o nome das playlists não foi levado em conta. Os nomes semelhantes apenas reforçam conceitualmente esse fato.

Próximos passos?

Ficamos satisfeitos com a conclusão desse projeto, mas há mais coisas que poderiam ser feitas aqui.
  1. Poderíamos usar essas incorporações de músicas treinadas em outras tarefas downstream e ver como elas são eficazes. Além disso, você pode baixar as incorporações de músicas aqui: Incorporações | Metainformações
  2. Poderíamos examinar outros métodos de treinar essas incorporações usando algumas redes neurais recorrentes e uma implementação aprimorada desse modelo Word2Vec.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse exemplo de código
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Impulsionando a IA: construa um chatbot sobre seus dados com o MongoDB Atlas Vector Search e os modelos LangChain usando o padrão RAG


Sep 18, 2024 | 7 min read
Tutorial

Como usar os módulos de incorporações e reclassificação do Cohere com o MongoDB Atlas


Aug 14, 2024 | 10 min read
exemplo de código

Introdução ao MongoDB e Tornado


Jul 12, 2024 | 6 min read
Tutorial

Planejador de partes favoritas do operador Joe com Playwright, LlamaIndex e MongoDB Atlas Vector Search


Nov 12, 2024 | 11 min read
Tecnologias Utilizadas
Linguagens
Tecnologias
Sumário