Spotify is a major music streaming platform with over 191 million active users, 40 million songs, and 2 billion playlists (link). One key feature of Spotify is the song recommendations that populate your homepage, organized by theme and genre (Browse, Country, Hip Hop, etc.) Recommending songs to users is not just a core aspect of Spotify. In fact, every music streaming service has some kind of music recommendation algorithm, kickstarted by Pandora Radio back in the day that would allow a user to customize their listening experience dynamically by reacting to music on the fly. Each music service provider is competing to give their listeners the joy of discovering new music, and there are a wide array of algorithmic approaches companies are taking.
Our project specifically tackles on the challenge of recommending a set of songs that best fits to a playlist. A playlist is simply a sequence of songs that are selected by a user. They range in size from 0 to hundreds of songs that may be quite similar, or extremely eclectic. The inherent belief in recommending songs based on a playlist is that the playlists are a collection of songs that represent the musical taste of the listener, and a good recommendation algorithm should be able to capitalize on that. By suggesting appropriate songs to add to a playlist, users can explore new songs that are similar to songs they love without having to actively search for them.
In order to recommend songs that best fit a playlist, we are going to have to look at songs that are ‘similar’ to existing songs in the playlist. We have the agency to measure similarity from a few different perspectives, such as co-occurrence, playlist structure, and metadata of the song (e.g., genre, artists and other audio features).
To reiterate, the main purpose of our project was to create a song recommender for a given playlist. The structure of our website is intended to first bring the reader through the data we used to generate a playlist recommendation algorithm. Then, we shall take a deeper dive into the specific models we implemented to achieve this. Finally, we reflect on which approaches worked and which ones didn’t, and try to ruminate about why that might be the case.