노래 추천 생성

Apr 26 2023
Jaykumar Patel, Janvi Patel, Aniketh Devarasetty, Malvika Vaidya, Seann Robbins, Tanner Hudnall 소개 이 기사에서는 노래 추천 모델을 만들기 위한 초기 시도를 보여줍니다. 데이터 세트에 대한 설명과 사용 방법을 제공합니다.

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

소개

이 기사에서는 노래 추천 모델을 만드는 초기 시도를 보여줍니다. 데이터 세트에 대한 설명과 사용 방법을 제공합니다. 그런 다음 입력된 노래가 주어지면 노래 추천의 짧은 목록을 생성하는 모델의 교육에 대해 설명합니다. 마지막으로 현재 모델의 한계와 향후 이를 개선할 방법에 대해 논의합니다.

목표

연구를 수행할 때 이 작업은 이전에 시도된 적이 있습니다. 그러나 우리가 조사한 대부분의 추천 시스템은 가사의 의미를 고려하지 못했습니다. 예를 들어, 이 기사에서는 가사를 제공하지 않고 "danceability", "loudness", "key" 등과 같은 음악적 기능만 제공하는 Spotipy 라이브러리 에서 제공하는 노래 기능을 살펴보고 이러한 기능에 대한 분석을 수행합니다. 클러스터링, t-SNE 및 PCA와 같은 GeeksforGeeks의 이 튜토리얼 도 비슷한 접근 방식을 사용합니다.

또한 이 글에서는 사용자가 과거에 들은 것을 기반으로 노래를 추천하는 "콘텐츠" 기반 접근 방식과 유사한 다른 사용자가 좋아한 것을 기반으로 노래를 추천하는 "협업" 기반 접근 방식의 하이브리드를 살펴봅니다. 그러나 이 기사의 접근 방식은 특징을 볼 때 노래의 가사나 의미를 설명하지 못합니다.

또한 Spotify의 추천 모델이 노래를 추천할 때 사용자의 청취 기록을 지나치게 강조하는 문제를 발견했습니다. 우리는 노래를 추천할 때 (사용자의 이력이 아닌) 노래와 그 기능에 특별히 초점을 맞춤으로써 이 문제를 해결하고 싶었습니다.

노래의 의미와 다른 음악적 특징을 포착하고 싶었는데, 이는 다른 이전 모델이 하지 못한 것입니다. 여기에는 노래 가사뿐만 아니라 "댄스성", "에너지", "키" 등과 같이 Spotify API 가 제공하는 정보가 포함됩니다. 이제부터 Spotify API가 제공하는 이 정보를 "음악적 특징"이라고 합니다.

이상적으로, 우리 모델은 가사를 분석하고 입력된 노래에 대한 짧은 설명 또는 요약을 생성하고 입력된 노래의 설명과 음악적 특징이 유사한 상위 5개 노래를 추천할 수 있습니다.

모델 디자인:

  • 우리의 목표는 다중 모드이므로 모델을 두 개의 하위 모델로 나누기로 결정했습니다.
  • 첫 번째 모델은 입력된 노래의 가사를 사용하여 설명을 생성하는 NLP 요약 모델입니다.
  • 두 번째 모델은 음악적 특징 측면에서 입력된 노래와 유사한 노래를 찾는 KNN 클러스터링 모델입니다.
  • 이러한 모델을 개발하려면 필요한 모든 기능을 수집하는 데이터 파이프라인이 필요합니다.

Kaggle, Hugging Face 등 다양한 곳에서 데이터를 살펴보았습니다. 그러나 가사 또는 음악적 특징이 포함된 데이터만 찾았습니다. 입력된 노래에 대한 설명을 생성할 수 있는 NLP 요약 모델을 생성하려면 NLP 모델 교육을 위한 노래 가사와 함께 노래 설명이 있는 데이터 세트가 필요하지만 이 역시 찾을 수 없었습니다. 또한 KNN 모델에는 음악적 특성이 필요합니다. 따라서 이 프로젝트의 가장 큰 과제는 모델 훈련에 필요한 데이터를 수집하는 것이었습니다.

다음은 데이터 파이프라인에 대한 최종 접근 방식입니다.

  1. 노래의 음악적 특징이 포함된 Kaggle의 초기 데이터 세트를 얻었습니다.https://www.kaggle.com/datasets/maharshipandya/-spotify-tracks-dataset
  2. 그런 다음 100,000개가 넘는 노래의 초기 데이터 세트를 필터링하여 인기가 50개 이상인 노래만 포함했습니다. 이렇게 하면 데이터 세트가 ~26,000개로 줄었습니다. 우리가 추천하는 노래는 이상적으로 호감이 있어야 하고 일반적으로 노래의 인기는 호감도와 관련이 있기 때문에 이렇게 했습니다.
  3. 그런 다음 무작위로 10,000곡을 선택했습니다. 우리는 이러한 노래의 가사와 설명을 수집해야 하고 데이터 세트의 모든 노래를 보면 (시간과 비용 측면에서) 실행 불가능해지기 때문에 이렇게 했습니다.
  4. 그런 다음 fastText 라이브러리를 사용하여 lid.176.ftz 모델을 사용하여 영어가 아닌 노래를 필터링했습니다 .
  5. 그런 다음 Genius.com API 용 Python 클라이언트인 LyricsGenius를 사용하여 노래 가사를 수집할 수 있었습니다.
  6. 그런 다음 각 노래에 대한 설명을 생성하기 위해 다음 쿼리와 함께 ChatGPT의 API를 활용했습니다 .

우리는 다양성과 더 넓은 범위의 추천을 촉진하기 위해 식별 기능(예: 아티스트 이름 또는 노래 이름) 없이 노래의 고유한 기능에서 추천을 생성하도록 이 쿼리를 공식화했습니다.

이 파이프라인을 통해 Kaggle 데이터 세트를 공급한 후 노래의 식별 정보, 음악적 특징, 가사 및 설명이 포함된 약 5000개의 노래가 남았습니다. 이 사전 처리된 데이터 세트는 두 가지 대상 모델을 개발하기 위한 기초를 형성합니다. 이후에는 이 데이터 세트를 간단히 "데이터 세트"라고 합니다.

요약 모델

주요 작업 중 하나는 입력된 노래에 대한 노래 설명을 생성하는 데 사용되는 요약 모델을 교육하는 것이었습니다. 이를 위해 전송 모델이라는 아이디어를 사용했습니다.

우리는 t5-small 모델을 사용하여 사용자가 입력한 노래의 가사에 대한 요약을 생성했습니다. T5는 번역 및 요약과 같은 다양한 작업을 수행하도록 사전 훈련된 인코더-디코더 모델입니다. 모든 모델은 “summarize: <입력 텍스트>”와 같은 작업의 접두사가 있는 입력 텍스트에 필요합니다. 그러나 모델은 특정 응용 프로그램에 대한 최상의 출력을 생성하기 위해 약간의 미세 조정이 필요합니다. 그래서 우리는 ~5,000개의 영어 노래 데이터 세트를 사용하여 노래 가사를 요약하도록 t5-small 모델을 훈련시켰고 ChatGPT는 대상 요약을 생성했습니다. 이 모델은 40 에포크 동안 훈련되었고 약 2의 교차 엔트로피 손실을 가졌습니다. 이 손실은 상대적으로 높지만 5,000개 샘플에 대한 훈련에만 적합한 수치입니다.

그런 다음 모델의 매개변수가 토치 파일에 저장되었습니다. 매개변수가 사전 학습된 기본 요약기에 로드된 후 모델은 일부 가사를 입력으로 제공하여 요약을 생성할 수 있습니다.

설명 비교

상위 500개의 유사한 노래를 결정하기 위해 입력된 노래의 설명을 데이터 세트의 ~5000개 노래의 설명과 비교하는 방법이 필요했습니다.

두 텍스트를 비교하는 한 가지 방법은 두 텍스트를 벡터화된 형식으로 변환한 다음 두 텍스트 간의 코사인 유사성을 계산하여 내용이 얼마나 유사한지 보여 주는 것입니다. 이 기술은 두 벡터 사이의 코사인 각도를 측정하며, 더 유사한 텍스트의 벡터가 공간에 더 가깝게 놓입니다.

따라서 노래 요약을 비교하려면 모든 요약을 벡터 표현으로 변환해야 합니다. CountVectorizer 또는 TfidVectorizer의 두 가지 접근 방식을 사용할 수 있습니다. CountVectorizer는 단순히 문서에서 각 단어의 발생을 계산하여 각 행이 문서를 나타내고 각 열이 단어를 나타내는 희소 행렬을 만듭니다. 반면에 TfidVectorizer(Term Frequency-Inverse Document Frequency Vectorizer의 약자)는 문서에서 용어의 빈도와 문서에서 용어의 역 빈도를 고려합니다. 이 역 빈도는 용어의 '희소성'을 나타내므로 이 기술은 단어의 빈도와 희소성을 모두 고려하므로 더 중요하고 고유한 단어에 더 높은 가중치를 부여하고 일반적인 단어에 더 낮은 가중치를 부여합니다.

데이터 세트의 요약과 모델의 예측 요약은 Python의 TfidVectorizer를 사용하여 벡터화되었습니다. 코사인 유사성은 데이터 세트의 각 항목과 예측된 요약 사이에서 계산되었습니다. 가장 높은 코사인 유사성 점수를 얻은 데이터 세트의 상위 500개 항목은 기본적으로 입력 노래의 예측된 요약과 의미 및 내용이 가장 가까운 데이터 세트의 500개 노래를 나타냅니다.

이 벡터화 및 코사인 유사성 접근 방식은 잘 수행되는 것 같습니다. 주어진 예측 요약에 따르면 “남녀가 가족들에게 무시당하는 연애를 하게 된다. 그들은 사랑을 위해 싸워야 합니다.” 최고의 추천곡 중 하나는 Wande Coal의 “Again”이라는 노래였습니다. 이 노래에 대한 ChatGPT 생성 요약은 “이 노래는 한 여자를 사랑하고 평생을 그녀와 함께 보내고 싶어하는 남자에 대한 노래입니다. 그는 그녀에게 다른 사람들이 자신에 대해 말하는 것을 듣지 말라고 말하고 그녀를 행복하게 해주겠다고 약속합니다.” 이 두 텍스트는 관계의 낭만적이고 약간 금지된 측면을 포착한다는 점에서 내용이 비교적 유사합니다.

대체 접근 방식:

노래 가사를 벡터화하는 또 다른 접근 방식은 단어 임베딩을 사용하는 것입니다. BERT 변환기 모델은 관련 없는 작업을 수행하기 위해 노래 요약에서 훈련될 수 있습니다. 모델이 학습된 후 각 요약을 모델에 문서로 전달할 수 있습니다. 각 문서에 대해 CLS 문서 임베딩은 모델의 출력 레이어 중 하나에서 추출됩니다. CLS 문서 포함은 전체 문서를 캡처하는 토큰인 CLS 토큰의 벡터 표현입니다. 이것은 각 요약의 벡터 표현을 제공하고 코사인 유사성을 계산할 수 있습니다.

우리는 이 기술이 프로젝트 범위에 필요하지 않다는 것을 발견했습니다. TfidVectorizer가 요약의 의미를 상당히 적절하게 포착하여 강력한 출력을 생성한 것으로 보입니다.

음악적 특징 비교

그런 다음 음악적 특징을 기반으로 500개의 유사한 노래 중 상위 5개를 결정하는 방법이 필요했습니다. 음악적 특성이 숫자이기 때문에 sklearn의 K-Nearest-Neighbors를 사용할 수 있었습니다 .

가장 유사한 가사가 있는 노래를 필터링한 후 다음 단계는 가장 유사한 노래 기능을 가진 노래를 선택하는 것입니다. 기능의 유사성을 측정하는 편리한 방법은 "음향" 또는 "에너지"와 같은 노래의 특정 기능을 정량화하는 Spotify의 트랙 기능 분류를 분석하는 것입니다. Spotify API를 사용하여 모든 입력 노래에 대해 이러한 메트릭을 수집한 다음 다음 알고리즘을 실행하여 유사한 노래를 얻을 수 있습니다.

K Nearest Neighbors는 입력 데이터 포인트의 특징과 데이터 세트의 포인트의 유사성을 기반으로 지정된 포인트에 가장 가까운 k개의 데이터 포인트를 찾는 데 사용할 수 있는 감독되지 않은 기계 학습 알고리즘입니다. 이 기술을 사용하여 사용자가 입력한 노래의 특징을 필터링된 모든 노래와 비교하여 음악적 특징이 가장 가까운 상위 k곡을 찾을 수 있습니다. 우리 프로젝트를 위해 우리는 상위 5개의 이웃 노래를 찾는 것이 합리적인 출력을 산출할 것이라고 결정했으며, 모두 사용자의 노래와 유사한 음악적 특징을 가져야 합니다.

사용자 흐름

권장 사항을 원하는 사용자를 위한 프로세스는 다음과 같습니다. 그들은 그들이 좋아하는 노래를 입력합니다. LyricGenius API를 사용하여 입력된 노래의 가사를 가져옵니다. 그런 다음 해당 가사를 사용하여 NLP 요약 모델을 사용하여 설명을 생성하고 해당 설명을 데이터 세트의 노래 설명과 비교하여 상위 500개의 유사한 노래를 결정합니다. 그런 다음 Spotify의 API를 사용하여 입력된 노래의 음악적 특징을 가져오고 이를 500개의 노래와 비교하여 상위 5개의 추천을 얻습니다.

결과

요약기 모델은 유효성 검사 세트에서 약 2의 교차 엔트로피 손실을 가졌습니다. Rouge1, Rouge2 및 RougeL과 같은 평가 지표를 추가로 사용했습니다. Rouge1 및 rouge2는 각각 원래 가사와 예측 간에 일치하는 유니그램 및 바이그램의 수를 나타냅니다. RougeL 점수는 가장 긴 공통 하위 시퀀스를 나타냅니다. 이러한 지표의 점수는 각각 0.25, 0.07 및 0.17이며 값이 높을수록 더 유리합니다.

손실이 상대적으로 높고 rouge 점수가 낮지만 사람의 평가를 통해 생성된 요약이 ChatGPT에서 생성된 요약과 상대적으로 비슷하다는 것을 확인했습니다.

다음은 노래 "Riptide - The Chainsmokers"에 대한 요약 모델(t5-small)과 ChatGPT에서 생성된 설명을 비교한 것입니다.

ChatGPT에서 생성한 설명:

이 노래는 소중한 사람과 평생을 함께하고 싶고 함께하는 시간을 최대한 활용하고 싶다는 내용입니다. 가사에는 그 사람을 잃을까 봐 두렵고 이별이 끝나면 어디로 갈지 고민하는 내용도 담겼다.

요약 모델인 t5-small에 의해 생성된 설명:

이 노래는 하룻밤만 있으면 인생을 바꾸고 함께 살려고 하는 사람에 대한 노래입니다. 가사에는 사랑하는 사람을 잃은 듯한 자신의 상실감과 감정을 표현했다. 그럼에도 불구하고 가수는 한 사람과 인생을 살고 다른 사람과 만 밤을 보내고 싶어합니다.

텍스트의 설명을 비교하고 KNN을 계산하여 최종 권장 사항을 결정하기 위한 평가 메트릭이 없었습니다. 비지도 학습 기법이기 때문에 사람의 평가도 사용했습니다.

다음은 노래 "Riptide - The Chainsmokers"에 대해 생성된 권장 사항입니다.

결론 및 향후 과제

우리는 생성된 노래가 상당히 공통된 주제를 가지고 있음을 알아차렸지만, 때때로 노래의 스타일이 달랐습니다. 노래 유사성을 예측할 때 장르를 고려하지 않았기 때문입니다. 따라서 이것은 우리가 미래에 추가하고 싶은 것입니다.

또한 곡의 박자표, 곡의 악기 편성, 아티스트 정보 추가 등 곡의 기능을 늘리고자 합니다. 이렇게 하면 모델이 더 유사한 노래를 추천할 수 있습니다.

또한 데이터 세트의 크기도 늘리고 싶습니다. 이렇게 하면 노래에 대한 요약 모델의 설명이 더 정확해지고 전반적인 성능이 향상됩니다.