КДПВ

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

Что хотелось


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

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

Проблема ерундовая, скажете вы, возьми ТОП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. Насколько я заметил, вопрос количества л в названии жанра метала является очень болезненным, поэтому я придерживаюсь стороны я.музыки, раз уж все данные с неё. Очень прошу не разжигать на эту тему =)

Комментарии (22)


  1. vmm86
    07.11.2017 13:18

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


  1. Ugrum
    07.11.2017 13:28

    Хорошее начало корпоративного блога!
    Спасибо, отличная статья (и я уже вижу, что надо послушать).


  1. Kelt_Rivera
    07.11.2017 13:48

    Видимо, Ария с Кипеловым сейчас совсем непопулярны). Не нашёл их в кусочке русского метала


  1. Defersa
    07.11.2017 13:49

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


    1. esemi Автор
      07.11.2017 13:50

      С этого всё и начиналось, но чукча не фронтендер и мои успехи на этом поприще весьма скромны =( Нужно очень вдумчиво поработать с d3 чтобы это могло не тормозя работать в браузере и ещё и красиво было. Поэтому пока в статике =)


      1. Defersa
        07.11.2017 14:05

        Как не странно я имею некоторые познания во фронт-енде (правда не знаю насколько глубокие для такой задачи), и я бы с удовольствием обдумал бы создание прототипа такого сервиса ^_^


        1. Kuorell
          08.11.2017 15:38

          Придется делить на кластеры и грузить \ рендерить кластерами при прокрутке, отмаунчивая невидимые. Это минимум. Просто сделать d3.data() тут не выйдет


          1. esemi Автор
            08.11.2017 15:39

            Вот в такие дебри я пока и не набрался сил погрузиться =)


    1. rapkasta
      08.11.2017 12:55

      Я разрабатывал подобный сервис (с 2014 по начало 2017, самой идее ещё больше времени), но реальной заинтересованности у аудитории не нашлось и деньги надоело на него тратить. Весов не было, но были связи вида музыкант-группа. Много идей было, в том числе с рекомендациями.

      Вот так вот оно выглядело:
      habrastorage.org/webt/zv/xy/lu/zvxylugr6onc7o85ckypvhpjsnq.png
      habrastorage.org/webt/la/gw/oq/lagwoq1mvmg_ytjjfmfe4bn3xvo.png
      habrastorage.org/webt/jw/4z/fy/jw4zfy48yeiknxqd95dsxbzfkfe.png

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

      Пишите, если у кого интерес есть.


      1. esemi Автор
        08.11.2017 13:25

        А насколько большой граф тянуло устройство клиента (это я так понимаю под мобильные)?
        У меня интерес скорее к библиотеке интерактивного просмотра большого графа в браузере, нежели к я.музыке — на этом наборе данных просто можно потренироваться.


        1. rapkasta
          08.11.2017 14:03

          Сложно сказать по размерам, я тестировал только на ситуациях, приближенных к реальному использованию (три-четыре популярные группы, типа beatles и led zeppelin, с открытыми вложенными подграфами). Всё это дело работало на html5 (отрисовка на канвасе с помощью pixi.js, граф расчитывал с springy, приложение — cordova), была тестовая реализация на SVG, но последний оказался годен только для прототипа.


          По производительности: сильно не тормозило, но лаги были. Во многом из-за однопоточности вычислений, которые в браузерном js вызывают боль (да, даже воркеры там в итоге не очень помогли). Если бы сейчас делал такую визуализацию интерактивную с расчётом графов на клиенте, то только на нативщине.


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


        1. Maccimo
          08.11.2017 19:52

          Недавно была статья про большие графы применительно к картам, там есть и глава про отрисовку: https://habrahabr.ru/post/338440/


  1. sayber
    07.11.2017 17:44
    +1

    Люблю данный сервис яндекса и постоянно его использую в фоне, когда работаю.
    Есть много вещей которые хотелось бы видеть в проекте, включая подобные графики.
    Чаще всего, я выбираю подборки (для работы, для фона и т.п.).
    Спасибо за актуальную для меня информацию.


  1. Horror_24
    08.11.2017 13:25

    Сразу вспомнил сайт по поиску похожих исполнителей использующий схожий стиль связей.


    1. esemi Автор
      08.11.2017 13:27

      Это вот прямо то что хочется) Попробую нагенерить граф побольше, может возьму на вооружение)


  1. joelynn
    08.11.2017 14:20
    +1

    Спасибо, интересная статья. Забавно было бы ещё поиграться с узкими кластерами поджанров — выделить причину сходства — узкий единый стиль или одинаковое время пика популярности и т.д.
    Хотя вполне вероятно, что наполненность агрегатора действительно недостаточная.
    Кстати, чтоб выбрать себе новое послушать + похожие проекты:
    1. musicmap.info — здесь с историей музыки, поджанров и топ-исполнителями стиля
    2. everynoise.com/engenremap.html — крутая штука, можно знакомиться с поджанрами, а если клацнуть на них, то откроется тоже граф с исполнителями в этом жанре, всё можно прослушать, чтоб ознакомиться и понимать, о чём вообще речь
    3. www.music-map.com/black+sabbath.html — карта по исполнителям. Но откуда они собирали изначально — неизвестно


  1. GalayZloy
    08.11.2017 14:20

    Интересно, но один момент не раскрыт — как Яндекс формирует эти ссылки на похожих?


    1. esemi Автор
      08.11.2017 14:21

      Это лучше спросить у них) Но я полагаю доработанная коллаборативная фильтрация, по плейлистам например)


      1. GalayZloy
        08.11.2017 14:42

        Можно как-то подключить к обсуждению Яндекс?


  1. GalayZloy
    08.11.2017 14:40

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


    1. esemi Автор
      08.11.2017 15:02

      Ну это ключевой момент если исследовать насколько этот алгоритм хорошо работает, ну или кластеры искать. Мне же достаточно красивой картинки и списка на «послушать» =)


  1. foldr
    08.11.2017 19:11

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


    Что послушать — есть отличный сервис last.fm, который строит рекомендации, исходя из твоей истории прослушиваний и похожести с предпочтениями других пользователей. К своему удивлению, открыл немалое колличество не очень известных групп/исполнителей, которые мне очень понравились и которые с удовольствию слушаю. Попадаются, вовсе, записавшие все время своего существования 1-2 альбома и распавшиеся, но эти 1-2 альбома — шедевры. И количество их слушателей может быть всего десятки или сотни тысяч человек. Сомневаюсь, что Вашим способом можно о них узнать. Плюс, не всегда можно четко определить жанр, особенно как это делает Яндекс — все либо рок, либо металл, а что в каждой из этих групп десятки поджанров, отличающихся друг от друга по звучанию как небо и земля, он не учитывает


    К слову, рекомендации google play тоже очень хорошо работают, выдают результаты, схожие с last.fm