{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог об аналитике, визуализации данных, data science и BI, заметки с тегом: word cloud",
    "home_page_url": "http:\/\/test.leftjoin.ru\/tags\/word-cloud\/",
    "feed_url": "http:\/\/test.leftjoin.ru\/tags\/word-cloud\/json\/",
    "icon": "http:\/\/test.leftjoin.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Николай Валиотти",
        "url": "http:\/\/test.leftjoin.ru\/",
        "avatar": "http:\/\/test.leftjoin.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "136",
            "url": "http:\/\/test.leftjoin.ru\/all\/youtube-interview-speech-analysis\/",
            "title": "Анализируем речь с помощью Python: Сколько раз в минуту матерятся на интервью YouTube-канала «вДудь»?",
            "content_html": "<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/13-1.jpg\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>Выход практически каждого ролика на канале «вДудь» считается событием, а некоторые из этих релизов даже сопровождаются скандалами из-за неосторожных высказываний его гостей.<br \/>\nСегодня при помощи статистических подходов и алгоритмов ML мы будем анализировать прямую речь. В качестве данных используем интервью, которые журналист Юрий Дудь (признан иностранным агентом на территории РФ) берет для своего YouTube-канала. Посмотрим с помощью Python, о чем таком интересном говорили в интервью на канале «вДудь».<\/p>\n<h2>Сбор данных<\/h2>\n<p>C помощью <a href=\"https:\/\/developers.google.com\/youtube\/v3\">YouTube API<\/a> мы получили список всех видео с канала Юрия Дудя, а также их метаинформацию. О том, как это сделать, вы можете узнать, например, из <a href=\"http:\/\/test.leftjoin.ru\/all\/youtube-api\/\">статьи нашего блога<\/a>.<br \/>\nЕсли вы уже слышали знаменитое “Юрий будет дуть, дуть будет Юрий”, то наверняка знаете, что на этом канале есть документальные фильмы, а также интервью, в которых участвуют сразу несколько гостей. Нас заинтересовали только те выпуски, в которых преимущественно говорит только один гость. Поэтому нам пришлось провести фильтрацию всех видео вручную.<br \/>\nДля дальнейшего анализа нам необходимо было получить длительности роликов. Это мы сделали с помощью GET-запросов к YouTube API. Результаты приходили в специфическом формате (для примера: “PT1H49M35S”), поэтому их нам пришлось распарсить и перевести в секунды.<br \/>\nИтак, мы получили датафрейм, состоящий из 122 записей:<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/--1.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>На основе метаинформации по лайкам, комментариям и просмотрам мы построили следующий Bubble Chart:<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/29.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Так как наша цель — проанализировать речь в интервью, нам необходимо было получить текстовые составляющие роликов. В этом нам помог API-интерфейс <a href=\"https:\/\/pypi.org\/project\/youtube-transcript-api\/\">youtube_transcript_api<\/a>, который скачивает субтитры из видео на YouTube. Для каких-то роликов субтитры были прописаны вручную, но для большинства они были сгенерированы автоматически. К сожалению, для 10 видео субтитров не оказалось: беседы с L’one, Шнуром, Ресторатором, Амираном, Ильичом, Ильей Найшуллером, Соболевым, Иваном Дорном, Навальным, Noize MC. Причину их отсутствия мы, к сожалению, понять не смогли.<\/p>\n<h2>А гости кто?<\/h2>\n<p>Спектр рода деятельности гостей канала «вДудь» достаточно обширен, поэтому было решено пополнить исходные данные информацией о том, чем же в основном занимается приглашенный участник каждого интервью. К сожалению, ролики не сопровождаются четкими метками профессиональной принадлежности гостя, поэтому мы прописали эту информацию сами. На момент выгрузки данных последним видео на канале был разговор с комиком Дмитрием Романовым.<br \/>\nЕсли с идентификацией профессии каждого гостя мы не ошиблись, то вот такое распределение в итоге получается:<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/31.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Музыканты, рэперы и актеры — самые частые гости Юрия, скорее всего, они являются самыми интересными для автора и аудитории. Представителей научного сообщества (астрофизик, историк, экономист и т.д) наоборот, гораздо меньше, ведь научно-популярные интервью — прерогатива других интервьюеров.<\/p>\n<h2>Обработка текста<\/h2>\n<p>Анализ текстовой информации сложен в той степени, в какой сложен язык, на котором написан текст. Подробно о подготовке текста к анализу мы рассказывали в материале <a href=\"http:\/\/test.leftjoin.ru\/all\/borderline-text-analysis\/\" class=\"nu\">«<u>Python и тексты нового альбома Земфиры<\/u>»<\/a>. Тут была проведена идентичная работа.<br \/>\nКак и раньше, для решения аналитической задачи мы решили использовать такой подход как лемматизация, т. е. приведение слова к его словарной форме. Проведя лемматизацию текстовых данных по правилам русского языка, мы получим существительные в именительном падеже единственного числа (кошками — кошка), прилагательные в именительном падеже мужского рода (пушистая — пушистый), а глаголы в инфинитиве (бежит — бежать). В этом проекте мы опять воспользовались библиотекой <a href=\"https:\/\/pymorphy2.readthedocs.io\/en\/stable\/\">Pymorphy<\/a>, представляющую собой морфологический анализатор.<br \/>\nПомимо приведения к словарной форме нам потребовалось убрать из текстов часто встречающиеся слова, которые не несут ценности для анализа. Это было необходимо, потому что так называемые стоп-слова могут повлиять на работу используемой модели машинного обучения. Список таких слов мы взяли из пакета <a href=\"https:\/\/www.nltk.org\/api\/nltk.corpus.html\">ntlk.corpus<\/a>, а после расширили его, изучив тексты интервью. Конечно, мы также убрали все знаки пунктуации.<\/p>\n<h2>Анализ словарного запаса<\/h2>\n<p>После обработки текста мы посчитали для каждого интервью количество всех слов, а также абсолютное и относительное количество уникальных слов. Конечно, полученные значения неидеальны, так как, во-первых, для большинства интервью были получены автоматически сгенерированные субтитры, которые являются неточными, а во-вторых, тексты были очищены от лишней информации.<br \/>\nСперва мы решили наглядно представить основной массив лексики, которая звучит в интервью. После группировки интервью по роду деятельности гостя нам удалось это сделать и в этом нам помогла библиотека <a href=\"http:\/\/amueller.github.io\/word_cloud\/\">wordcloud<\/a>. У нас получились такие облака слов:<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/All-wordclouds.png.jpg\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>Лейтмотивом всех интервью Юрия являются обсуждение России (политики, социальной жизни и других особенностей), уровня заработка гостей, а также непосредственно профессиональной деятельности гостя (это особенно заметно у представителей индустрии кинопроизводства).<br \/>\nДалее мы решили построить боксплот для количества слов для каждого рода деятельности (профессии, которые были представлены единственным гостем, мы не стали учитывать):<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/33.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Наиболее разговорчивыми гостями оказались блогеры. По медиане, они наговорили больше всего слов. Чуть поодаль от них журналисты и комики, а вот самыми немногословными оказались рэперы.<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/35.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Что касается количества уникальных слов, то тут ситуация аналогичная. И рэперы опять в аутсайдерах…<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/37.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Если говорить об отношении уникальных слов к общему количеству, то тут можно увидеть совершенно иную картину. Теперь впереди оказываются, рэперы, музыканты и бизнесмены. Предыдущие же лидеры, наоборот, становятся самыми последними.<br \/>\nКонечно, стоит отметить, что такие сравнения могут быть несправедливыми, так как длительность интервью у каждого гостя Дудя разная, а потому кто-то просто мог успеть наговорить больше слов, чем остальные. Наглядно в этом можно убедиться, взглянув на распределение длительности интервью по роду деятельности (для построения использовался тот же пул гостей, что и для боксплотов выше):<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/39.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>К тому же, разные роды деятельности представляет разное количество человек, это тоже могло сказаться на результатах.<br \/>\nДалее мы составили список слов, появление которых в интервью было бы интересно отследить, и посмотрели как часто они упоминаются для каждого рода деятельности. Также мы решили учесть дисбаланс среди представителей разных профессиональных категорий и разделили полученные частоты на соответствующее количество гостей.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/-.png\" border=\"0\" width=\"90%\" height=\"90%\"><\/a><\/p>\n<p>Первое место по упоминаниям очевидно занимает Россия. Что касается Запада, то про США гости говорили в 2,5 раза меньше. Что касается лидера РФ, то про него речь заходила достаточно часто. Его оппонент, Алексей Навальный, в этой словесной “баталии” потерпел поражение. Интересно, что политики далеко не в топе по упоминаниям Путина. Впереди оказался экономист Сергей Гуриев, после него ведущий Александр Гордон, а тройку замкнули журналисты.<br \/>\nГлагол “любить” чаще использовали люди, имеющие отношение к искусству, творчеству и гуманитарным наукам — кинокритик Антон Долин, мультипликатор Олег Куваев, историк Тамара Эйдельман, актеры, рэперы, художник Федор Павлов-Андреевич, комики, музыканты, режиссеры. Про страхи (если судить по глаголу “бояться”) гости говорили реже, чем о любви. В топ вошли историк Эйдельман, дизайнер Артемий Лебедев, кинокритик Долин и политики. Может быть в этом кроется ответ на вопрос, почему же политики не так охотно произносили имя президента России.<br \/>\nЧто касается денег, то о них говорили все. Ну, за исключением человека науки, астрофизика Константина Батыгина. С церковью же имеем совершенно обратную ситуацию. О ней по большей части говорили только писатели и художник Павлов-Андреевич.<\/p>\n<h2>Анализ мата<\/h2>\n<p>Далее мы решили проанализировать то, как часто гости Юрия Дудя ругались матом. С помощью регулярных выражений мы составили словарь матерных слов со всех интервью. После этого, для каждого ролика было подсчитано суммарное количество вхождений элементов составленного словаря.<br \/>\nМы построили диаграммы, отражающие топ-10 любителей нецензурно выражаться по количеству “запрещенных” слов в минуту.<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/43.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Как видим, рэперы и музыканты почти полностью захватили топ. Помимо них очень часто ругались такие гости как блогер Данила Поперечный и комики Иван Усович и Алексей Щербаков. Первое место в рейтинге с большим отрывом от остальных держит Morgenstern (признан иностранным агентом на территории РФ), а вот Олег Тиньков в своем последнем интервью матерился не так много, чтобы попасть в Топ-10.<br \/>\nЗато, как искрометно!<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/FSgosl8XwAAmtpw.jpg\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>После персонального анализа мы решили узнать, насколько насыщена нецензурными словами речь представителей разных профессиональных групп. Нулевые показатели при этом были опущены.<\/p>\n<iframe width=\"730\" height=\"480\" frameborder=\"0\" scrolling=\"no\" src=\"\/\/plotly.com\/~satiukov.e\/41.embed?showlink=false\"><\/iframe>\n<p><\/a><\/p>\n<p>Ожидаемо, что больше всех матерились рэперы. На втором месте оказались блогеры (по большей части за счет Поперечного). За ними следует Артемий Лебедев, единственный дизайнер в нашей выборке, благодаря разнообразия речи которого, представители этой профессии и попали в топ-3 этого распределения. Кстати, если вы еще не знакомы с нашим <a href=\"https:\/\/habr.com\/ru\/post\/596035\/\">анализом телеграм-канала Лебедева<\/a>, то мы не понимаем, чего же вы ждете! Несмотря на то что генератор постов Артемия Лебедева сейчас выключен, исследование его телеграм-канала все равно заслуживает вашего внимания.<\/p>\n<h2>Ограничения анализа<\/h2>\n<p>Стоит отметить, что в нашем небольшом исследовании есть два недостатка:<\/p>\n<ol start=\"1\">\n<li>Как уже говорилось ранее, мы не смогли отделить слова гостей Дудя от речи Юрия, который и сам зачастую не брезгует использовать нецензурные выражения. Однако, задача интервьюера — подстроиться под стиль речи гостя, поэтому, скорее всего, результаты бы не сильно изменились.<\/li>\n<li>В автосгенерированных субтитрах нам встретилось некое подобие цензуры — некоторые слова были заменены на ‘[ __ ]’. Тут можно выделить несколько интересных моментов:\n<ul>\n  <li>действительно некоторые матерные слова были зацензурены (по большей части слово “бл**ь”);<\/li>\n  <li>остальные матерные слова остались нетронутыми;<\/li>\n  <li>под чистку попали некоторые другие грубые слова, при этом не являющиеся матерными (“мудак”, “гавно”).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Продемонстрируем наглядно на примере следующего диалога:<br \/>\n<i>Дудь: Почему твои треки такое гавно?<\/i><br \/>\n<i>Гнойный: Мои треки ох**тельные, Юра, просто ты любишь гавно.<\/i><\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/image.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n<p>Такие замены встречались в субтитрах роликов с людьми, которые не употребляли нецензурные выражения в своей речи (по крайней мере на протяжении интервью). Однозначное решение, что же делать с ‘[ __ ]’, мы не смогли принять, поэтому для некоторых гостей какая-то часть матерных слов была, увы, не подсчитана.<\/p>\n<h2>Работа с Word2vec<\/h2>\n<p>После статистического анализа интервью мы перешли к определению их контекста. Для этого мы, как и раньше, воспользовались моделью Word2vec. Она основана на нейронной сети и позволяет представлять слова в виде векторов с учетом семантической составляющей. Косинусная мера семантически схожих слов будет стремиться к 1, а у двух слов, не имеющих ничего общего по смыслу, она близка к 0. Модель можно обучать самостоятельно на подготовленном корпусе текстов, но мы решили взять готовую — от <a href=\"https:\/\/rusvectores.org\/ru\/\">RusVectores<\/a>.  Для ее использования нам понадобилась библиотека <a href=\"https:\/\/radimrehurek.com\/gensim\/\">gensim<\/a>.<br \/>\nМы рассчитали векторы-представления для каждой профессиональной группы. Наверное, можно ожидать, что режиссёры обсуждали кино и все, что с ним связано, а музыканты — музыку. Поэтому для каждого рода деятельности мы получили список слов, описывающих тематику текстов соответствующих роликов. Также мы раскрасили ячейки в зависимости от того, насколько каждое полученное слово было близко к текстам соответствующей категории гостей.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/-10-----.png\" border=\"0\" width=\"120%\" height=\"120%\"><\/a><\/p>\n<p>Можно сказать, что в целом каждая профессиональная категория описывается вполне соответствующими терминами. Конечно, некоторые слова могут показаться спорными. К примеру, на первом месте для рэперов стоит слово “джазовый”, хотя ни с 1 представителем хип-хоп течения речь о джазе не заходила. Тем не менее модель посчитала, что это слово достаточно близко к общему смыслу интервью людей, относящихся к этой категории (видимо, за счет непосредственного отношения рэперов к музыке).<\/p>\n<h2>P.S. Мистическое число 25.000000<\/h2>\n<p>Как мы уже говорили, среди скачанных субтитров некоторые были написаны вручную. Интересно, что все они начинаются с числа 25.000000, причем оно нигде не озвучивается.<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/25.000000--1.png\" border=\"0\" width=\"50%\" height=\"100%\"><\/a><\/p>\n<p>Что же это за мистическое число? Если уйти в конспирологию, то можно вспомнить про 25-й кадр. К сожалению, нам об этом ничего неизвестно, мы просто оставим это как пищу для размышлений…<\/p>\n<p><img src=\"http:\/\/test.leftjoin.ru\/pictures\/25.000000-.png\" border=\"0\" width=\"100%\" height=\"100%\"><\/a><\/p>\n",
            "date_published": "2022-06-02T11:09:33+03:00",
            "date_modified": "2022-06-02T13:21:08+03:00",
            "image": "http:\/\/test.leftjoin.ru\/pictures\/--1.png",
            "_date_published_rfc2822": "Thu, 02 Jun 2022 11:09:33 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "136",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "http:\/\/test.leftjoin.ru\/pictures\/--1.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/---,-,-.png.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/----.png.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/All-wordclouds.png.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/---.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/----1.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/-_--.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/-----.png.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/-.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/-10-------.png.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/FSgosl8XwAAmtpw.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/-------.png.jpg",
                    "http:\/\/test.leftjoin.ru\/pictures\/image.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/-10-----.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/25.000000--1.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/25.000000-.png"
                ]
            }
        }
    ],
    "_e2_version": 3365,
    "_e2_ua_string": "E2 (v3365; Aegea)"
}