Я очень давно пользуюсь яндекс музыкой для поиска «что послушать». Чаще всего, я просто хожу по похожим исполнителям приятных мне групп, однако, этот метод уже давно не даёт результатов. Какое-то время мои потребности закрывало я.радио с фильтром по жанру, но и его репертуар на удивление скуп. Настало время решать проблему глобально, и вот что из этого получилось =)
Что хотелось
Сразу замечу, что я не ставил целью узнать, как и хорошо ли работают рекомендации, или провести кластерный анализ. Над полученными данными можно поработать в очень разные стороны, но для моей конечной цели это не нужно.
А хотелось, в первую очередь, найти тех рок и метал исполнителей, о которых все знают, а я, ввиду своей неопытности, нет.
Проблема ерундовая, скажете вы, возьми ТОП100 по версии какого-либо издания и радуйся, но оно так не работает: все топы, что я видел, либо слишком “новомодные” и мне не по нраву, либо очень классические и я всё это уже слышал.
Вообще, мои путешествия по музыке — это отдельная история: смешно было лицезреть друзей-металлистов, когда я рассказывал им про новых для себя Black Sabbath в контексте "вы только послушайте как звучат!" =)
В общем, решено было собрать всех рок и метал исполнителей, и ссылки на других исполнителей с их страниц, посчитать входящие степени и построить свой топ. Ну, и раз уж у меня есть явно сетевая структура, не визуализировать её в виде графа было выше моих сил.
Как собирал
Не раз и не два садился я за этот проект, но каждый раз интерес затухал раньше значимого результата (прямо по книжке). В этот раз я решил послушаться идеологов хакатонов и постарался напилить минимальный рабочий продукт за минимальное же время. По этой причине остановился на сборе наиболее близких мне жанрах рока и метала вместо сбора всей музыки.
Сам парсинг написан на питоне и селениуме плюс Postgree для данных, поскольку под рукой был готовый проект на этом стеке. Селениум для продакшена решение конечно спорное, но у нас и не продакшен.
Для начала я собрал данные по рок исполнителям, их оказалось около шести тысяч.
Когда стал собирать ссылки на похожих, оказалось, что рокеров на самом деле сильно больше и только небольшая их часть представлена в индексе по жанру. Отдельно собирал поджанры (русский рок и другие) — они с основным индексом совсем слабо пересекаются. С металом сюрпризов уже не было, разве что на середине парсинга у него появились поджанры и пришлось собирать всё заново.
В общем, трижды всё пересобрав я понял, что всё, что мог сделал и нужно рисовать.
Хотелось бы отдельно попросить не ругаться ребят из яндекса на мои паразитные запросы, пусть их было не так много — парни, всё ради науки =)
Как рисовал
Хотел я наконец отказаться от ручного рисования в пользу Gephi, чтоб только ползуночки двигать между красиво и понятно, но не срослось — небольшие графы на тысячу вершин он отлично рисует, а в десять раз больше молча отказывается. Ни ошибок, ни приветов, у коллег на винде работает, а у меня белый лист =( Сделал себе зарубку к нему вернуться (и вам рекомендую), и пошёл рисовать привычными средствами.
Поднял довольно старенькое сравнение питонячих либ для распасовки графов и выбрал Igraph с FR алгоритмом за итоговую картинку и удовлетворительную производительность.
Что получилось
Немного вводных, которые могут показаться неочевидными:
- вершина — исполнитель;
- рёбра — ссылки на похожих;
- граф направленный, но стрелки увидеть можно не всегда;
- вес вершины — величина входящей степени (ссылки на исполнителя как похожего у других исполнителей);
- в легенде у большинства графов записаны размер в формате вершины х рёбра, коэффициент кластеризации и средняя близость вершин.
Все графы построены без учёта одиночек — тех артистов, на которых никто не ссылается и которые сами ни на кого не ссылаются. Они только создают шум и не дают никакой дополнительной информации. Можно было отсечь и вершины с небольшими степенями дабы не засоряли изображение, но мне показалось, я смог без этого обойтись на итоговом графе.
Некоторые графы представлены в двух вариантах — основном и полном. Отличаются они тем, что в первом варианте участвуют только исполнители, входящие в индекс я.музыки по какому либо жанру (условно primary исполнители).
Метал
Начнём с поджанров. Графы небольшие, поэтому строил сразу полные.
Поджанры метала на момент сбора только появились, думаю сейчас они значительно выросли.
А вот так выглядит суммарный граф метала со всеми поджанрами в двух вариантах — основной и полный.
Рок
Заметьте насколько прогрессив и рок-н-ролл опережают своих собратьев. Рок исполнителей вообще сильно больше металистов (25 тысяч против 8,5), возможно это особенности я.музыки или относительная молодость метала.
Суммарный граф рока со всеми поджанрами, тоже в двух вариантах.
На основном графе отлично виден маленький и гордый кластер русского рока, столь далёкий от остальных.
Пересечение рок + метал
Наконец, начнём пересекать оба жанра. Тут уже только полные графы.
Красным отмечены рок исполнители, синим — метал, фиолетовым — оба жанра одновременно (это когда исполнитель одновременно и рок и метал). В таком виде удобно смотреть насколько близки эти жанры в принципе. Издалека это выглядит конечно интересно, но мне хотелось большей наглядности.
Изменив размер каждой вершины пропорционально её входящей степени я получил наконец ту картинку, которую буду долго изучать в поисках интересного.
На этой превьюшке ничего не разглядеть, но она кликабельна и за ней карта в 10х10 килопикселей с легендой для вершин весом 30 и более. Эта же карта есть в другом разрешении (10к, 20к, 32к). В конце статьи есть ссылки на более детальные варианты этой карты и на исходники (на случай если вам захочется свой вариант цвета/размера/etc).
Интересное
Сердце рока — Элвис непобедим!
Перешеек между роком и металом. Фиолетовые, напомню, исполнители которые входят в оба жанра.
Сердце метала. В отличии от рока тут фиолетовые есть и имеют приличный вес.
Русский рок стоит очень особняком и почти не связан с металом, даже русским.
Забавный кластер рокеров — немногочисленный, очень плотный и увесистый.
Кусочек русского метала очень далеко от всех.
Топы
Интересно было посмотреть топов по входящей степени
|
|
Исполнитель | Степень |
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 |
Заключение
Надеюсь, вы почерпнули для себя что-нибудь интересное из статьи. Лично я составил себе большой список исполнителей на ознакомление и надеюсь найти новых любимчиков.
Попрошу также не забывать, что всё представленное есть результат работы рекомендаций я.музыки, так что граф может быть очень далек от аналогов с зарубежных агрегаторов.
Буду рад аргументированной критике и фидбеку по проделанной работе.
> Исходники
> Варианты итогового графа
Послесловие
- Будьте аккуратны с запуском скриптов на локальной машине. За парсинг яндекса вас могут на нём забанить, а рендер картинок может съесть всю память, особенно если её меньше 16гб.
- Аналогично рассчитывайте производительность своего ноутбука, прежде чем открывать карту в 32 килопикселя.
- Cairo, которая под капотом рисовальщика Igraph-а, падает в кору на генерации больших картинок в не последних версиях, а в последней загоняет нас в рамки 32к пикселей. Если вам нужно больше
золота— генерируйте .ps файл и конвертируйте его сторонними средствами. - Насколько я заметил, вопрос количества л в названии жанра метала является очень болезненным, поэтому я придерживаюсь стороны я.музыки, раз уж все данные с неё. Очень прошу не разжигать на эту тему =)
Комментарии (22)
Ugrum
07.11.2017 13:28Хорошее начало корпоративного блога!
Спасибо, отличная статья (и я уже вижу, что надо послушать).
Kelt_Rivera
07.11.2017 13:48Видимо, Ария с Кипеловым сейчас совсем непопулярны). Не нашёл их в кусочке русского метала
Defersa
07.11.2017 13:49Очень занимательная инфографика, мне кажется на музыкальных сервисах такой вещи нехватает. У меня вот вопрос: не хотите всю эту штуку в интерактив перевести? был бы очень забавный сервис.
esemi Автор
07.11.2017 13:50С этого всё и начиналось, но чукча не фронтендер и мои успехи на этом поприще весьма скромны =( Нужно очень вдумчиво поработать с d3 чтобы это могло не тормозя работать в браузере и ещё и красиво было. Поэтому пока в статике =)
Defersa
07.11.2017 14:05Как не странно я имею некоторые познания во фронт-енде (правда не знаю насколько глубокие для такой задачи), и я бы с удовольствием обдумал бы создание прототипа такого сервиса ^_^
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
Сейчас пытаюсь другой около-музыкальный проект сделать, где визуализаций и такого вида интерактивности будет меньше, но идеи и наработки пойдут в дело.
Пишите, если у кого интерес есть.esemi Автор
08.11.2017 13:25А насколько большой граф тянуло устройство клиента (это я так понимаю под мобильные)?
У меня интерес скорее к библиотеке интерактивного просмотра большого графа в браузере, нежели к я.музыке — на этом наборе данных просто можно потренироваться.rapkasta
08.11.2017 14:03Сложно сказать по размерам, я тестировал только на ситуациях, приближенных к реальному использованию (три-четыре популярные группы, типа beatles и led zeppelin, с открытыми вложенными подграфами). Всё это дело работало на
html5
(отрисовка на канвасе с помощьюpixi.js
, граф расчитывал сspringy
, приложение —cordova
), была тестовая реализация наSVG
, но последний оказался годен только для прототипа.
По производительности: сильно не тормозило, но лаги были. Во многом из-за однопоточности вычислений, которые в браузерном js вызывают боль (да, даже воркеры там в итоге не очень помогли). Если бы сейчас делал такую визуализацию интерактивную с расчётом графов на клиенте, то только на нативщине.
Но, честно говоря, я за оптимизацию особо не заморачивался — хотелось сначала получить базу пользователей и их реальные хотелки, что не очень удалось.
Maccimo
08.11.2017 19:52Недавно была статья про большие графы применительно к картам, там есть и глава про отрисовку: https://habrahabr.ru/post/338440/
sayber
07.11.2017 17:44+1Люблю данный сервис яндекса и постоянно его использую в фоне, когда работаю.
Есть много вещей которые хотелось бы видеть в проекте, включая подобные графики.
Чаще всего, я выбираю подборки (для работы, для фона и т.п.).
Спасибо за актуальную для меня информацию.
joelynn
08.11.2017 14:20+1Спасибо, интересная статья. Забавно было бы ещё поиграться с узкими кластерами поджанров — выделить причину сходства — узкий единый стиль или одинаковое время пика популярности и т.д.
Хотя вполне вероятно, что наполненность агрегатора действительно недостаточная.
Кстати, чтоб выбрать себе новое послушать + похожие проекты:
1. musicmap.info — здесь с историей музыки, поджанров и топ-исполнителями стиля
2. everynoise.com/engenremap.html — крутая штука, можно знакомиться с поджанрами, а если клацнуть на них, то откроется тоже граф с исполнителями в этом жанре, всё можно прослушать, чтоб ознакомиться и понимать, о чём вообще речь
3. www.music-map.com/black+sabbath.html — карта по исполнителям. Но откуда они собирали изначально — неизвестно
GalayZloy
08.11.2017 14:20Интересно, но один момент не раскрыт — как Яндекс формирует эти ссылки на похожих?
GalayZloy
08.11.2017 14:40Мне кажется, это ключевой момент, т.к. непонятно, что же в конце концов отображают эти диаграммы — толи количество прослушиваний, толи количество лайков исполнителей, а может некий ИИ сканирует композиции и связывает их по похожести...
esemi Автор
08.11.2017 15:02Ну это ключевой момент если исследовать насколько этот алгоритм хорошо работает, ну или кластеры искать. Мне же достаточно красивой картинки и списка на «послушать» =)
foldr
08.11.2017 19:11Выглядит красиво, но ориентироваться на топ по ссылаемости с других страниц — идея изначально "не очень". Очевидно же, чем популярнее группа, тем чаще она будет фигурировать в похожих.
Что послушать — есть отличный сервис last.fm, который строит рекомендации, исходя из твоей истории прослушиваний и похожести с предпочтениями других пользователей. К своему удивлению, открыл немалое колличество не очень известных групп/исполнителей, которые мне очень понравились и которые с удовольствию слушаю. Попадаются, вовсе, записавшие все время своего существования 1-2 альбома и распавшиеся, но эти 1-2 альбома — шедевры. И количество их слушателей может быть всего десятки или сотни тысяч человек. Сомневаюсь, что Вашим способом можно о них узнать. Плюс, не всегда можно четко определить жанр, особенно как это делает Яндекс — все либо рок, либо металл, а что в каждой из этих групп десятки поджанров, отличающихся друг от друга по звучанию как небо и земля, он не учитывает
К слову, рекомендации google play тоже очень хорошо работают, выдают результаты, схожие с last.fm
vmm86
Взаимосвязи сходных по жанру исполнителей похожим образом отрисовывались в раздачах почившего недавно музтрекера what.cd, правда, кажется, без "удельного веса" исполнителя среди остальных.