python

«Рок это жёстко» или я.музыка как граф

  • среда, 8 ноября 2017 г. в 03:12:30
https://habrahabr.ru/company/semrush/blog/337216/
  • Визуализация данных
  • Python
  • Блог компании SEMrush


КДПВ

Я очень давно пользуюсь яндекс музыкой для поиска «что послушать». Чаще всего, я просто хожу по похожим исполнителям приятных мне групп, однако, этот метод уже давно не даёт результатов. Какое-то время мои потребности закрывало я.радио с фильтром по жанру, но и его репертуар на удивление скуп. Настало время решать проблему глобально, и вот что из этого получилось =)

Что хотелось


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

А хотелось, в первую очередь, найти тех рок и метал исполнителей, о которых все знают, а я, ввиду своей неопытности, нет.

Проблема ерундовая, скажете вы, возьми ТОП100 по версии какого-либо издания и радуйся, но оно так не работает: все топы, что я видел, либо слишком “новомодные” и мне не по нраву, либо очень классические и я всё это уже слышал.

Вообще, мои путешествия по музыке — это отдельная история: смешно было лицезреть друзей-металлистов, когда я рассказывал им про новых для себя Black Sabbath в контексте "вы только послушайте как звучат!" =)

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

Как собирал


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

Сам парсинг написан на питоне и селениуме плюс Postgree для данных, поскольку под рукой был готовый проект на этом стеке. Селениум для продакшена решение конечно спорное, но у нас и не продакшен.

Для начала я собрал данные по рок исполнителям, их оказалось около шести тысяч.
Когда стал собирать ссылки на похожих, оказалось, что рокеров на самом деле сильно больше и только небольшая их часть представлена в индексе по жанру. Отдельно собирал поджанры (русский рок и другие) — они с основным индексом совсем слабо пересекаются. С металом сюрпризов уже не было, разве что на середине парсинга у него появились поджанры и пришлось собирать всё заново.

В общем, трижды всё пересобрав я понял, что всё, что мог сделал и нужно рисовать.
Хотелось бы отдельно попросить не ругаться ребят из яндекса на мои паразитные запросы, пусть их было не так много — парни, всё ради науки =)

Как рисовал


Хотел я наконец отказаться от ручного рисования в пользу Gephi, чтоб только ползуночки двигать между красиво и понятно, но не срослось — небольшие графы на тысячу вершин он отлично рисует, а в десять раз больше молча отказывается. Ни ошибок, ни приветов, у коллег на винде работает, а у меня белый лист =( Сделал себе зарубку к нему вернуться (и вам рекомендую), и пошёл рисовать привычными средствами.

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

Что получилось


Немного вводных, которые могут показаться неочевидными:

  • вершина — исполнитель;
  • рёбра — ссылки на похожих;
  • граф направленный, но стрелки увидеть можно не всегда;
  • вес вершины — величина входящей степени (ссылки на исполнителя как похожего у других исполнителей);
  • в легенде у большинства графов записаны размер в формате вершины х рёбра, коэффициент кластеризации и средняя близость вершин.

Все графы построены без учёта одиночек — тех артистов, на которых никто не ссылается и которые сами ни на кого не ссылаются. Они только создают шум и не дают никакой дополнительной информации. Можно было отсечь и вершины с небольшими степенями дабы не засоряли изображение, но мне показалось, я смог без этого обойтись на итоговом графе.
Некоторые графы представлены в двух вариантах — основном и полном. Отличаются они тем, что в первом варианте участвуют только исполнители, входящие в индекс я.музыки по какому либо жанру (условно primary исполнители).

Метал


Начнём с поджанров. Графы небольшие, поэтому строил сразу полные.

фолк металпрогрессив метал

ню металэпик метал

экстрим металклассика метал

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

основные исполнители металавсе исполнители метала

Рок



украинский рокnew wave

пост-рокрусский рок

рок-н-роллпрогрессивный рок

Заметьте насколько прогрессив и рок-н-ролл опережают своих собратьев. Рок исполнителей вообще сильно больше металистов (25 тысяч против 8,5), возможно это особенности я.музыки или относительная молодость метала.

Суммарный граф рока со всеми поджанрами, тоже в двух вариантах.

основные исполнители рокавсе исполнители рока

На основном графе отлично виден маленький и гордый кластер русского рока, столь далёкий от остальных.

Пересечение рок + метал


Наконец, начнём пересекать оба жанра. Тут уже только полные графы.

пересечение рока и метала
Красным отмечены рок исполнители, синим — метал, фиолетовым — оба жанра одновременно (это когда исполнитель одновременно и рок и метал). В таком виде удобно смотреть насколько близки эти жанры в принципе. Издалека это выглядит конечно интересно, но мне хотелось большей наглядности.

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

На этой превьюшке ничего не разглядеть, но она кликабельна и за ней карта в 10х10 килопикселей с легендой для вершин весом 30 и более. Эта же карта есть в другом разрешении (10к, 20к, 32к). В конце статьи есть ссылки на более детальные варианты этой карты и на исходники (на случай если вам захочется свой вариант цвета/размера/etc).

Интересное


Сердце рока — Элвис непобедим!

сердце рока


рок и метал - переходПерешеек между роком и металом. Фиолетовые, напомню, исполнители которые входят в оба жанра.


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

сердце метала


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

интересный кластер рокаЗабавный кластер рокеров — немногочисленный, очень плотный и увесистый.

Кусочек русского метала очень далеко от всех.

русский метал

Топы


Интересно было посмотреть топов по входящей степени
Рок
Исполнитель Степень
Elvis Presley 185
Deep Purple 133
Paul McCartney 97
Eric Clapton 93
Whitesnake 73
ЧайФ 73
David Bowie 72
The Rolling Stones 70
The Ventures 67
Би-2 67
Метал
Исполнитель Степень
Black Sabbath 78
Edguy 62
Sonata Arctica 60
In Flames 58
Therion 58
Judas Priest 57
Glenn Hughes 56
Eluveitie 55
Of Mice & Men 54
Doro Pesch 54
Интересно, что исполнители ссылаются не только на своих коллег по стилю. Топ по входящим ссылкам вне жанров рока и метала.
Другие жанры
Исполнитель Степень
Dr 114
Bob Dylan 87
Ryan Tedder 61
Pharrell 58
John Frusciante 48
Rihanna 47
Frank Sinatra 47
Lana Del Rey 46
Ray Charles 44
NOFX 43
Обратите внимание на самого первого исполнителя Dr. Его страничка весьма скудна, при этом вес и сейчас не маленький (шутка ли, почти deep purple и это среди рокеров/металлистов), а до весеннего апдейта был и вовсе огромным. Может его добавляли как похожего когда никого более подходящего не нашлось, а ссылок нужно было добрать до девяти? Это могут сказать только ребята из яндекса.

Заключение


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

Исходники
Варианты итогового графа

Послесловие


  1. Будьте аккуратны с запуском скриптов на локальной машине. За парсинг яндекса вас могут на нём забанить, а рендер картинок может съесть всю память, особенно если её меньше 16гб.
  2. Аналогично рассчитывайте производительность своего ноутбука, прежде чем открывать карту в 32 килопикселя.
  3. Cairo, которая под капотом рисовальщика Igraph-а, падает в кору на генерации больших картинок в не последних версиях, а в последней загоняет нас в рамки 32к пикселей. Если вам нужно больше золота — генерируйте .ps файл и конвертируйте его сторонними средствами.
  4. Насколько я заметил, вопрос количества л в названии жанра метала является очень болезненным, поэтому я придерживаюсь стороны я.музыки, раз уж все данные с неё. Очень прошу не разжигать на эту тему =)