В одних жанрах одни тексты песен встречаются чаще, чем другие?

Мне всегда было любопытно, как количественно определить значение или взаимосвязь между словами. В конце концов, я привык обрабатывать числа или кодировать переменные как числа и вводить их в статистические модели и модели машинного обучения. Поэтому я выбрал изучение обработки естественного языка (NLP), среди других тем машинного обучения в моем классе Python, чтобы узнать.

Мне и моим товарищам по команде было интересно изучить взаимосвязь между текстом песни и ее жанром. Мы стремились создать классификаторы, которые узнавали бы, какие тексты преобладают в определенных темах, чтобы предсказать жанр песни исключительно по тексту. Ниже приведены некоторые сжатые очертания нашего отчета, в котором я урезал подробные объяснения задействованных концепций статистического / машинного обучения.

Данные

Мы использовали набор данных с www.kaggle.com под названием 380 000+ текстов песен из MetroLyrics. Пользователь Kaggle Гьянендра Мишра создал этот набор данных, чтобы изучить корреляцию между артистами определенных жанров и веществами, которыми часто злоупотребляют. Набор данных содержит 362 237 песен от 18 231 исполнителя с шестью столбцами для каждой песни: индекс песни, название, год выпуска, исполнитель, жанр и текст. Все песни в базе данных были выпущены между 1968 и 2016 годами, за исключением нескольких песен, в которых неверно указаны годы.

Проблемы с набором данных

1. Тексты песен взяты непосредственно из MetroLyrics

Гьянендра Мишра напрямую скопировал тексты с MetroLyrics. Это проблема, потому что MetroLyrics создает свою базу данных на основе ввода данных пользователем. Хотя они утверждают, что у них есть надежный процесс проверки с использованием внутренних рецензентов, этого было достаточно, чтобы мы упомянули. Пользовательский ввод допускает человеческие ошибки, такие как неправильное написание слов, особенно разговорной речи. Некоторые слова также написаны на сленге вместо словарного, что может привести к ошибкам при подсчете.

2. Не все песни на английском.

Мы нашли некоторые песни на множестве других языков, и, к сожалению, во фрейме данных нет столбца, указывающего язык в текстах. С этим есть несколько проблем:

  • Слова на других языках могут быть написаны идентично определенным английским словам, а затем будут отнесены к одному и тому же слову, что может ввести в заблуждение анализ.
  • Слово с одинаковым значением, но на двух разных языках может быть отнесено к двум разным словам. Это вводит в заблуждение, поскольку их следует рассматривать как одно и то же.
  • Мы удалили только английские стоп-слова из текстов песен; нам не удалось удалить стоп-слова с разных языков

Таким образом, эти неанглоязычные песни бесполезны для интерпретации жанров на основе текстов, потому что мы не можем их точно обработать.

3. Перекошенный набор данных

Набор данных был сильно смещен в сторону рока (131 377 песен; 36,27%). Другие жанры, такие как R&B и инди, составляли около 1-2% от общего количества сэмплов, всего около 6000 песен. Эта разница в числах заставляет нашу модель предсказывать рок более точно, чем другие жанры.

Мы попытались создать сбалансированный набор данных, чтобы можно было обучить нашу модель с одинаковым количеством песен для каждого жанра; однако жанр Инди состоит только из ~ 2000 песен в очищенном наборе данных, что означает, что сбалансированный набор данных будет состоять только из менее чем 20 000 песен. Решив не отбрасывать сотни тысяч подходящих точек данных, мы решили оставить наш набор данных как есть и получить результаты, несмотря на это ограничение.

Очистка данных

Из-за ограничений нашего набора данных нам пришлось немного потрудиться, чтобы подготовить данные для анализа. Нам нужно было понять любое ранее существовавшее форматирование или шаблоны в тексте и выявить аномалии. Нам нужно было тщательно продумать, сколько и какой информации следует пропускать на каждом этапе очистки.

1. Удалите ненужную информацию

Первоначально в нашем наборе данных для каждой песни была следующая информация: указатель песни, название, год выпуска, исполнитель, жанр, слова. Чтобы классифицировать песни по текстам, мы хотим сосредоточиться на жанрах и текстах. Мы подумали, что название и год выпуска не должны указывать на жанр, если предположить, что производство каждого жанра остается неизменным с течением времени. Художник также может писать песни в нескольких жанрах, поэтому мы опускаем функцию исполнителя для этого анализа.

2. Исключить песни без информации

В некоторых песнях отсутствовали жанры, поэтому мы исключили их из набора данных. Мы удалили песни с классификацией жанров «Недоступно» (29 814 песен) и «Другое» (23 683 песни), потому что нас интересовали только данные, содержащие и текст, и жанр. Кроме того, некоторые жанры были либо нечетко определены, либо не слишком насыщены текстами , поэтому мы исключили эти песни из нашего набора данных. Исключенными жанрами были «Другой», «Электронный» и «Джаз».

3. Изменить жанровую категорию

Некоторые жанры были очень похожи по стилю, поэтому мы сгруппировали их вместе в надежде упростить наш анализ. Комбинированные жанры:

  • «Фолк» и «Кантри» → «Кантри»
  • «Рок» и «Металл» → «Рок»

4. Tokenize тексты песен

Мы токенизировали каждое слово в тексте, чтобы подготовить наш набор данных к предстоящим этапам очистки данных, таким как удаление стоп-слов и изменение форматирования текста. Используя пакет NLTK , разбить большую часть текстов на отдельные слова в списке было несложно.

5. Стандартизируйте форматирование текста

Не все тексты были отформатированы одинаково; там были прописные и строчные буквы, а некоторые включали специальные символы. Мы изменили все тексты на строчные и удалили все специальные символы.

6. Удалить стоп-слова

Текст содержал стоп-слова, которые мы не сочли целесообразным включать. Стоп-слова не были полезны для обучения нашей модели, поскольку они чрезвычайно распространены и не дают ценных индикаторов смысла или настроений. Мы удалили все 179 стоп-слов из текстов песен, в том числе следующие:

Мы импортировали этот предустановленный список стоп-слов из nltk.corpus.

7. Lemmatize тексты песен

Некоторые слова в текстах были разными формами одного и того же основного слова. Например, ходьба, ходьба и прогулки - все это формы ходьбы.

Мы заменили все варианты этих слов на одно и то же базовое слово (в данном случае walk), чтобы лучше откалибровать наши данные, чтобы разные времена или формы множественного числа интерпретировались как одно и то же слово. Это основано на предположении, что слова в этих формах несут одно и то же значение в контексте всего текста.

Некоторые визуализации

После очистки данных мы создали несколько гистограмм, чтобы понять, что находится в нашей горе лирического корпуса:

На приведенном выше рисунке показано количество песен, выпускаемых за год, и пропорция, посвященная каждому жанру. Мы можем наблюдать резкий всплеск в 2006 и 2007 годах, когда подавляющее большинство песен было классифицировано как рок. Жанр хип-хопа, кажется, состоит в основном из песен, которые были выпущены в течение десятилетия между 1987 и 1997 годами. Страна показывает небольшой всплеск между 1998 и 2001 годами. Между 2005 и 2016 годами, похоже, что большинство выпущенных песен были либо Рок или поп.

Неудивительно, что рок содержит больше всего слов и наиболее уникальных слов, вероятно, из-за большого объема рок-песен в нашем наборе данных. Хип-хоп - это жанр, занимающий второе место по количеству слов и уникальных слов, хотя он занимает третье место по количеству песен. Мы думали, что это может быть связано с тем, что песни хип-хопа, как правило, включают рэп, который обычно требует большого объема слов за короткое время.

Выше мы видим самые распространенные слова в наборе данных. Слова, которые мы обычно используем каждый день, также часто встречаются в текстах песен. Мы также видим некоторые слова в первой десятке, которые могли использоваться для слуховых целей, а не для передачи смысла, например oh и na.

Создав одну и ту же гистограмму для каждого жанра, мы видим большее разнообразие в первой десятке. Мы видим некоторое сходство в самых универсальных словах, таких как знать и получить, но мы видим некоторые более конкретные слова, такие как diddley и F-слово только в одном жанре.

Wordclouds

Я подумал, что отображение шести гистограмм на слайде наносит вред человеческим глазам, поэтому я хотел представить наши многочисленные гистограммы в более увлекательной форме. Я поигрался с пакетом wordcloud, чтобы проиллюстрировать наиболее распространенные слова в каждом жанре, настраивая форму каждого облака:

Это был простой шаг, который оказал большое влияние на нашу презентацию.

Извлечение признаков с использованием tf - idf

Разработка / извлечение функций было самым сложным и особенно важным для объединения нашего понимания машинного обучения и текстовых данных. Извлечение признаков направлено на преобразование необработанного текста в числа, которые хорошо представляют информацию, то есть количественно определяют слова подписи в тексте.

Частота запросов (TF)

Это подсчитывает вхождения слова в данную песню, что показывает важность слова в тексте. Предполагается, что если слово встречается много раз, оно должно быть важным.

Обратная частота документов (IDF)

Это измеряет количество информации в данном слове по тексту. Чтобы данное слово было подписью, оно должно отчетливо появляться в одном виде текста и реже - в других типах. Таким образом, частота текстового документа слова подписи должна быть низкой, а его IDF должен быть высоким.

Частота термина - обратная частота документа (tf – idf)

Значение tf – idf является продуктом показателей TF и ​​IDF. Оно увеличивается пропорционально тому, сколько раз слово появляется в документе, и компенсируется количеством документов (в данном случае текстов песен), содержащих это слово, что помогает учесть тот факт, что некоторые слова в целом встречаются чаще. Чем выше числовое значение веса, тем реже термин. Чем меньше вес, тем чаще встречается термин. Другими словами, TF-IDF нормализует матрицу текстовых терминов. Слово с высоким TF-IDF в тексте является ключевым словом, потому что оно чаще встречается в этом жанре по сравнению с другими.

Модели

Для краткости в этом посте обсуждаются только три модели, которые мы опробовали.

Основываясь на нашем исследовании, мы решили сравнить несколько наивных байесовских классификаторов, поскольку известно, что они хорошо работают при классификации документов и текстовой аналитике. Наивные классификаторы Байеса используют теорему Байеса для вычисления вероятности принадлежности текста к жанру с учетом его характеристик, предполагая, что каждая пара характеристик условно независима (это наивная часть). Классификатор также предполагает, что положение слова не имеет значения (предположение Мешок слов). Затем классификатор делает прогноз, максимизируя логарифмическую вероятность вероятности по отношению к параметрам, используя Maximum A Posteriori (MAP), выбирая жанр с наибольшей вероятностью, к которой может принадлежать текст.

Подводя итог, наивные байесовские классификаторы - это вероятностные классификаторы, которые вычисляют вероятность каждой категории, используя теорему Байеса, и выводят категорию с наибольшей вероятностью.

Вот основные шаги:

По теореме Байеса для данной переменной класса y и зависимого вектора признаков X 1,…, Xn

Мы можем использовать наивное предположение об условной независимости.

Затем связь упрощается до этого уравнения.

После того, как все априорные и условные вероятности вычислены, вы вычисляете априорные значения и правдоподобия для каждого класса и выбираете тот, который имеет наибольшую вероятность.

Полиномиальный наивный байесовский

Полиномиальный наивный байесовский метод широко применяется в НЛП. Модель обрабатывает данные как дискретные, и каждая условная вероятность P (Xi | y) является полиномиальным распределением. Это хорошо работает для данных, которые можно легко превратить в подсчет, что подходит для нашего случая, когда мы используем частоту определенных слов для прогнозирования жанра.

2. Наивный Байес Бернулли

При этом данные обрабатываются как двоичные или могут принимать только два значения. В этом случае он классифицирует песню как по жанру, так и по жанру, генерируя индикатор для каждого слова: либо 1, указывающий на присутствие слова в тексте, либо 0, указывающий на отсутствие.

Модель Бернулли имеет ту же временную сложность, что и полиномиальная модель, но ее другая модель генерации подразумевает разные стратегии оценки и правила классификации. При классификации текстового документа модель Бернулли использует двоичную информацию о вхождениях, игнорируя количество вхождений, тогда как полиномиальная модель отслеживает множественные вхождения. Таким образом, модель Бернулли более подвержена ошибкам при классификации длинных документов.

3. Логистическая регрессия

В дополнение к наивным байесовским классификаторам мы попытались применить логистическую регрессию.

Логистическая регрессия моделирует вероятность того, что песня принадлежит определенному жанру. Это линейный метод, который делает прогнозы с использованием функции softmax и назначает принадлежность к классу, максимизируя вероятность жанра с учетом особенностей текста с помощью оценки максимального правдоподобия.

Это сделано для интерпретации вероятностей точек, а не просто для просмотра самих точек, как в случае с линейными моделями. В модели используется схема «один против остальных» с использованием multi_class = ‘ovr’; каждый class(genre) имеет свой собственный набор значений параметров, рассчитанных с помощью MLE.

По сравнению с наивным байесовским классификатором логистическая регрессия гораздо более надежна для коррелированных признаков. Если две характеристики X1 и X2 полностью коррелированы, регрессия присваивает часть веса W1, а часть W2. Когда существует много коррелированных признаков, или в данном случае слов, логистическая регрессия назначит более точную вероятность, чем наивные байесовские классификаторы. Обычно утверждается, что логистическая регрессия лучше работает с большими документами.

Полученные результаты

Для всех моделей мы использовали размер теста 30% и размер обучения 70% выборки. Мы оценили точность каждой модели, используя accuracy_score из sklearn.metrics. Это функция, которая вычисляет точность подмножества, что означает, что предсказанные метки должны точно совпадать с фактическими предоставленными метками. Точность - это доля правильно спрогнозированных ярлыков, определяемая как (истинно положительные + истинно отрицательные) / (истинные положительные + истинно отрицательные + ложные положительные + ложно отрицательные).

Мы также использовали classification_report из sklearn.metrics, который генерирует отчет с ключевыми показателями классификации, такими как точность, отзыв и F1-оценка. В исходном проекте мы проанализировали отчеты о классификации для каждой модели в сравнении друг с другом.

Ниже я приведу только результаты логистической регрессии, нашей наиболее точной модели, в качестве примера.

  • Точность - это доля предсказанных положительных событий, которые на самом деле положительны, определяемые как истинные положительные результаты / (истинные положительные результаты + ложные положительные результаты).
  • Напоминание (также известное как чувствительность) - это доля правильно предсказанных положительных событий, определяемая как истинно положительные / (истинно положительные + ложно отрицательные).
  • F1-оценка - это гармоническое среднее значение отзыва и точности, определяемое как (2 * точность * отзыв) / (точность + отзыв). Поддержка - это количество образцов истинного лейбла, принадлежащих этому классу. Последняя строка, avg / total, обеспечивает средневзвешенное значение точности, отзыва и F1-балла, при этом вспомогательными являются веса.

Кроме того, мы создали матрицу путаницы для каждой модели, чтобы понять, как они классифицируют данные на микроуровне.

Мы также создали график, чтобы увидеть, как на точность нашей модели повлияла часть общей выборки, которую мы использовали. На этих графиках рассчитана точность моделей с шагом 10%, от 10% до 100% выборки.

Анализируя наши результаты

Как видно из таблицы точности, наиболее точным методом определения жанра песни по ее текстам была логистическая регрессия. Это означает, что, когда тексты песен представлены в нескольких жанрах, логистическая регрессия рассматривает вероятность принадлежности текста к каждому жанру, а не просто жадно выбирает один жанр; каждый жанр может быть взаимозависимым.

Хотя некоторые методы лучше и лучше подходят для этой программы, чем другие, точность программы никогда не отклоняется от 60–70%. Когда мы столкнулись с несколькими другими проектами машинного обучения для классификации текстов песен, мы обнаружили, что большинство проектов имеют такой же диапазон точности. У нас есть догадки, почему:

  • Текст песни и ее жанр не очень взаимосвязаны. Это, вероятно, связано с тем, что многие из наиболее употребительных слов в каждом жанре также являются наиболее распространенными словами в других жанрах. Например, make является одним из самых распространенных слов во всех жанрах, используемых программой. Это означает, что, хотя некоторые песни относятся к разным жанрам, они могут петь об одном и том же. Это также будет означать, что жанр песни в большей степени зависит от ее слуховых компонентов, таких как инструменты и музыкальные измерения (например, высота звука, ритм и т. Д.), А не от литературных, таких как тексты песен.
  • Жанры в наборе данных для обучения не так четко определены, как первоначально предполагалось. Поскольку жанры были заранее определены в наборе данных MetroLyrics, возможно, что жанры, указанные пользователем, неточны.

Тем не менее, диапазон точности 60–70% предполагает, что, хотя тексты не могут с уверенностью определять жанр песни, есть некоторые различия в текстах песен между жанрами. Это означает, что песни определенного жанра, скорее всего, посвящены определенной теме, чем песни другого жанра.

Работа в процессе

В нашем проекте есть много возможностей для дальнейшего изучения и улучшения. Сказать, что мы новички в НЛП, будет преуменьшением - нам еще предстоит многому научиться в быстрорастущей области. На момент написания мы записали некоторые вещи, которые нам было интересно попробовать:

  • Попробуйте биграммы, н-граммы: вместо того, чтобы рассматривать отдельные слова, мы могли бы подсчитывать последовательности слов; т.е. рассматривать как характеристики не только отдельные слова, но и фразы.
  • Уточните этап предварительной обработки: исследуйте способы выявления и исключения выбросов, обнаружения и исключения неанглоязычных текстов, а также «бессмысленных» текстов, таких как oh, нет, да и так далее…
  • Изучите больше моделей, которые могут обеспечить более высокую точность: Word2Vec Feature Extraction, Neural Networks, Decision Trees… Мы еще не опробовали менее распространенные методы в нашем проекте, которые могли бы создавать модели с большей точностью.
  • Изучите взаимосвязь между годом выпуска, названием песни, исполнителями и жанром: создавая больше визуализаций данных и используя нашу текущую методологию с использованием большего количества функций, мы надеемся объединить результаты, чтобы рассказать связную и проницательную историю.

Будущие приложения

  • Использование функций аудиофайлов в дополнение к текстам для классификации песен по соответствующим жанрам. Наш текущий анализ полностью игнорирует богатые слуховые особенности песни, которые были бы полезны для классификации жанров.
  • Попробуйте классифицировать тексты песен по году выпуска. Некоторые жанры могут быть более популярными в одни годы, чем другие, поэтому добавление года выпуска в качестве функции может быть информативным.
  • Анализ настроений в отношении текстов песен; Классификация лирики на отрицательную, положительную или нейтральную может быть интересной для исследования общих настроений в отношении жанра.

P.S. Этот проект был выполнен для моего класса Python (PIC16) с двумя другими замечательными товарищами по команде Эммой и Кияшей! Большое спасибо за все долгие часы тяжелой работы и, в первую очередь, за то, что я работал с моими сумасшедшими идеями.

использованная литература