Автор книги: Валентин Арьков
Жанр: Руководства, Справочники
Возрастные ограничения: +12
сообщить о неприемлемом содержимом
Текущая страница: 2 (всего у книги 3 страниц)
2.2. Облако слов (тегов)
Познакомимся с таким инструментом, как облако слов. Вначале нужно подключить необходимые библиотеки, см. рис. В рамках одного блокнота Jupyter Notebook можно загружать одни и те же библиотеки несколько раз. Это может быть полезно, если мы запускаем отдельные ячейки блокнота.
Дело в том, что после отключения от облачного блокнота все предыдущие результаты теряются. А при очередном подключении к блокноту мы можем запустить несколько ячеек, и не обязательно в правильном порядке.
Рис. Загружаем библиотеки
Сформируем несколько строк текста, см. рис. Мы используем тройные кавычки. Это означает, что мы создаём переменную типа string – «строка». Но эта «строка» состоит из нескольких строк. Такой объект обычно называют Python Multiline String – «Многострочная строка Питона». Здесь string – это тип переменной (фактически список или массив символов), а line – это строка текста. Оба слова переводятся как «строка».
Рис. Многострочная строка
Теперь построим наше облако слов. Создаем вспомогательный графический объект – переменную под названием wordcloud из нашей многострочной строки.
Затем выводим это объект на экран с помощью функции plt.imshow.
Рис. Первое облако слов
Настроим наше изображение, см. рис. Указываем следующие параметры:
– width=1000 – ширина изображения (в пикселах);
– height=600 – высота изображения;
– background_color=’white’ – цвет фона – белый.
Отключаем вывод осей координат командой plt.axis («off»).
Наконец, отключаем вывод служебной информации о графике: plt.show ().
Рис. Облако на белом фоне
2.3. Маска
Следующий шаг в «украшательстве» облака – придать графику любую форму. Создаём маску в любом графическом редакторе. Например, запустим Paint. Маска – это белый фон и черная фигура, которая будет заполнена нашими словами. Маска придает облаку любую форму.
На белом фоне рисуем овал и заливаем его черным цветом. Сохраняем в файл под простым названием, лучше латинскими буквами.
Рис. Создаем маску
Подключим библиотеки и загрузим наш файл маски. На этот раз задействуем другой приём – используем функцию files. upload, см. рис.
Появляется кнопка Browse. Нажимаем кнопку и выбираем нужный файл.
После успешной загрузки мы увидим сообщение с указанием названия и размера файла.
Файл также выводится в разделе Files – после нажатия кнопки Refresh – Обновить.
Рис. Загружаем файл маски
Файл загружен. Вводим команду ls – сокращение от английского LIST – список файлов. Это команда операционной системы Linux, которая запущена в облаке на нашей виртуальной машине. Команды ОС мы вводим в кодовой ячейке после восклицательного знака.
Чтобы использовать маску, нужно прочитать содержимое файла командой Image. open. Преобразуем прочитанные данные в массив Numpy с помощью команды np.array. Поместим полученный массив в переменную oval_mask.
Мы сразу же можем уточнить, какой тип имеет наша переменная с помощью команды type. Как видим, это массив Numpy.
Рис. Читаем файл маски
Теперь мы можем сформировать облако слов в форме нашей маски, см. рис. Для этого указываем параметр mask=oval_mask. В остальном все точно так же, как и в предыдущем примере. Как видим, облако приобрело нужную форму.
Рис. Облако слов по маске
Наконец, сохраним наше художественно оформленное облако в файл, см. рис. Используем функцию wordcloud3.to_file и указываем имя файла – в кавычках.
Файл появляется в списке файлов в текущем каталоге.
Рис. Сохраняем облако слов в файл
Пока что наш файл лежит на удаленной виртуальной машине – где-то в интернете. Он сохраняется только на время текущего сеанса работы. При отключении от блокнота мы этот файл потеряем.
Чтобы скачать файл на локальную машину, наводим курсор на файл и нажимаем на «многоточие», см. рис. В выпадающем меню выбираем пункт Download – скачать.
Находим файл в каталоге загрузок и любуемся нашим облаком с помощью любой программы просмотра изображений.
Рис. Скачиваем файл на компьютер
2.4. Облако фраз
Хотя мы старательно разбили текст на строки, при построении облака слов были использованы отдельные слова, а не фразы. С этим тоже можно поработать.
Соединим слова в наших выражениях с помощью символа подчёркивания: Machine_Learning, см рис. Теперь эта цепочка символов будет рассматриваться как одно «слово».
Рис. Объединение слов
Повторим построение изображения с маской, см. рис.
Теперь наше облако построено не из отдельных слов, а из фраз. Конечно, символ подчеркивания смотрится не слишком привлекательно. Это было решение задачи, что называется, «в лоб».
Более грамотное решение можно предложить, если использовать так называемые би-граммы – Collocations / Bigrams:
https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html
Это словосочетания, состоящие из двух слов.
Рис. Облако из фраз
Попутно зададим размер изображения на экране побольше – с помощью параметра figsize функции plt.figure. Но это размеры картинки на экране. А вот размеры изображения, которое мы сможем скачать на компьютер, заданы параметрами width и height при вызове функции WordCloud. Правда, здесь участвует маска, а это файл с другими размерами – в пикселах. В конечном счете, нас интересует качество полученного изображения, подробная передача деталей – а это зависит от количества точек (пикселов).
Проверим, какие размеры мы получили на самом деле. В Проводнике Windows вызываем Properties – Details (Свойства – Подробности), см. рис.
Рис. Размеры изображений
Задание. Проверьте размеры изображения и маски с помощью Проводника. Измените размеры маски и проверьте, как изменились размеры изображения облака. Проверьте размеры маски в Python с помощью свойства объекта oval_mask.shape.
2.5. Словарь весов (частот)
Идём дальше и зададим разный «вес» нашим словам и выражениям. Для этого нам понадобится объект Python под названием «словарь» – dictionary, см. рис. Словарь содержит ключи и значения, соответствующие этим ключам.
Словарь создают с помощью фигурных скобок. Внутри этих скобок мы даём пары «ключ-значение» через двоеточие.
Ключами у нас будут слова, а значениями – вес этих слов. Более важные слова должны изображаться более крупным шрифтом.
Рис. Создаем словарь для построения облака
Повторим построение облака и создадим очередной объект wordcloud4, см. рис. Действительно, буквы на изображении разного размера.
Рис. Облако слов по словарю
Сохраним изображение в файл и скачаем его на локальный компьютер, см. рис. Здесь мы используем новую функцию (метод загрузки объектов) download из модуля files.
Рис. Сохраняем и загружаем изображение
Мы потренировались в работе с английскими фразами. Пора перейти к русским. Сформируем «словарь» с весовыми коэффициентами для построения облака слов, см. рис.
Рис. Русский «словарь» с весами
Сгенерируем и выведем на экран наше облако, используя уже известные нам команды, см. рис.
Рис. Облако слов на русском
2.6. Расшифровка видео Youtube
При анализе аудио– и видеозаписей требуется вначале получить текстовый файл с расшифровкой записи. Для перевода звуковых записей в текст используют сервисы транскрибирования (Speech to Text). В том числе, модные нынче нейронные сети.
Есть один сервис расшифровки – экзотический, зато совершенно бесплатный. Запускаем звуковую запись на воспроизведение и отправляем этот аудиопоток голосовому помощнику. Это самый долгий путь, потому что придётся дождаться, пока проиграется вся запись.
Бесплатный сервис транскрибирования можно организовать с помощью личного канала Youtube. Загружаем видеоролик на свой канал, и через несколько часов можно будет получить расшифровку записи в виде субтитров. Свой ролик можно опубликовать с ограничением доступа – только по ссылке. В этом случае кроме нас никто даже не увидит данную запись. Тем не менее, автоматическая расшифровка будет сделана.
Скачать субтитры Youtube можно самыми разными способами. Мы рассмотрим три простых варианта:
– страница демонстрации ролика Youtube;
– сторонний сервис скачивания субтитров;
– творческая студия Youtube.
В качестве примера мы получим расшифровку лекции автора данной работы по дисциплине «Бизнес-аналитика и статистика». Ссылка на видео:
https://youtu.be/kBiD09CATeo
2.6.1. Страница видеороликаСамое простое решение – скачать расшифровку на странице видеоролика. Нажимаем кнопку […] под видео и выбираем пункт Посмотреть расшифровку видео, см. рис.
Рис. Просмотр расшифровки (субтитров)
В правой части окна браузера выводится текст расшифровки. Нажимаем кнопку «вертикального многоточия» над расшифровкой в панели субтитров и отключаем метки времени: Показать или скрыть временные метки, см. рис.
Рис. Копирование текста расшифровки
Выделяем с помощью мыши интересующий текст. На выделение и прокрутку текста может потребоваться несколько секунд. Затем вставляем текст из буфера обмена в Блокнот.
Можно поступить по-другому. Выделяем весь текст на странице: [Crtl + A]. Копируем в буфер: [Ctrl + C]. Вставляем в Блокнот: [Ctrl + V]. Затем удаляем всё лишнее.
Сохраняем текстовый файл, см. рис. В файле находится только текст, ничего лишнего. Никаких меток, никаких знаков препинания.
Рис. Текст расшифровки в файле
2.6.2. Субтитры DownSubВторой вариант скачивания субтитров – сервис DownSub:
https://downsub.com/
Переходим на указанный сайт, вводим адрес видео и наживаем кнопку Download. Выбираем текстовый вариант без временных меток: TXT, см. рис.
Рис. Скачивание текста субтитров
Получаем текстовый файл и изучаем содержимое в Блокноте, см. рис. Всё хорошо, но появились лишние пустые строки. Придётся дополнительно удалять пустые строки с помощью функции поиска и замены.
Рис. Текстовые субтитры DownSub
2.6.3. Студия YoutubeКонечно, можно скачать субтитры напрямую из Творческой Студии Youtube. Для этого выбираем видео, находим раздел Язык и субтитры, выбираем автоматически созданные субтитры и нажимаем Скачать, см. рис.
Рис. Скачивание субтитров Студии Youtube
Получаем текстовый файл, но с временными метками, см. рис. Удаление временных меток – это лишняя работа, и мы её в данной работе не рассматриваем. Такой полноценный файл субтитров решает совсем другие задачи, выходящие за рамки текущего исследования.
Рис. Файл субтитров Youtube
Полученные субтитры, конечно же, не идеальные. Результаты автоматической расшифровки зависят от качества записи и разборчивости произношения докладчика. Но для первоначального анализа материала этого вполне достаточно. Мы сможем просмотреть текст полуторачасового выступления за пару минут. Затем с помощью частотного анализа текста мы сможем выделить ключевые слова, которые чаще всего встречаются в записи. И этот список ключевых слов представляет собой сжатое содержание, смысл материала.
2.7. Предварительный анализ текста
Итак, мы скачали расшифровку видео – любым способом, как описано выше. Переходим к работе с текстом в Python.
Переходим к работе с файлом. Вначале нужно загрузить текстовый файл с локального компьютера на облачный диск. Мы эту процедуру уже обсудили выше. Повторяться не будем.
Открываем наш файл на чтение и читаем его содержимое в переменную t0. Можно скопировать путь к файлу и вставить его в команду, как показано на рис.
Рис. Чтение файла
Содержимое текстового файла теперь находится в переменной-срок t0. Выводим переменную на экран, см. рис. Можно видеть, что прочитан не только текст, но и разделители строк – знакомая комбинация символов n, которая используется в команде printf в языке Си.
Рис. Содержимое переменной
Определим размер полученной переменный. Сравним с результатами подсчета количества слов и символов в текстовом редакторе MS Word, нажав на соответствующую кнопку в нижней части окна текстового редактора, см. рис.
Рис. Количество слов и символов
Выясним, какая кодировка используется в нашем текстовом файле. Откроем файл в текстовом редакторе Notepad. В строке состояния видим указание на кодировку UTF-8, см. рис.
Задание. Выясните, сколько байт используется в UTF-8 для хранения одного символа. Для этого рекомендуем ознакомиться с соответствующей статьёй в Википедии:
https://ru.wikipedia.org/wiki/UTF-8
Рис. Кодировка файла
Для определения количества прочитанной информации мы использовали команду len. Разберемся, что делает эта команда. Скорее всего, это сокращение от английского слова lenght, то есть «длина». Чтобы получить описание команды, пишем название команды и вопросительный знак, см. рис.
В правой части окна читаем описание: «количество элементов в контейнере». Проще говоря, это размер массива или длина строки.
Рис. Описание команды len
Откроем файл в редакторе Notepad++ и вызовем в верхнем меню пункт View – Summary. Получаем сводные данные по нашему документу. Здесь указано количество знаков без учёта символа конца строки – Characters without line endings, а также число слов – Words и строк – Lines, см. рис. Сравним со счётчиком MS Word.
Рис. Сводные данные по документу
Теперь проверим, что нам сообщит операционная система. Вводим восклицательный знак и команду LS – это команда Linux – сокращение от LIST, то есть «список файлов». В нашем случае получим подробную информацию об указанном файле. Операционная система сообщает размер файла в байтах, см. рис.
Если навести курсор на наш файл в левой части окна, появляется всплывающая подсказка. Здесь размер файла измеряется в килобайтах.
Чтобы перевести байты в килобайты, поделим число байт на 1024, см. рис.
Рис. Размер файла
Выведем на экран первые 100 элементов переменной t0, см. рис. В квадратных скобках мы указываем номера начального и конечного элементов списка, причем нумерация начинается с нуля, а последний элемент не выводится. Если первый номер не указан, вывод начинается с нулевого элемента. Если конечный номер 100, то последним выводится элемент номер 99. Таким образом, мы получаем элементы строки с номерами от 0 до 99, итого 100 символов.
Рассмотрим полученные результаты. Как мы уже говорили, на экран выводится, в том числе, и символ перевода строки n. Кроме того, на экране дополнительно выводятся кавычки в начале и в конце вывода. Таким образом, переменная t0 – это просто текстовая строка. Весь текстовый файл был прочитан в переменную в виде одной строки большой длины.
Рис. Начало файла
Для дальнейшей работы нам необходимо удалить символ конца строки. Заменим его на пробел с помощью функции replace, см. рис.
Выведем на экран первые 100 элементов новой переменой t1. Теперь это строка стала удобочитаемой. Слова разделены пробелами. Длина строки не изменилась.
Определим тип переменной с помощью команды type. Нам сообщают, что это строка: str – от английского слова STRING.
Рис. Удаление символа конца строки
2.8. Облако слов
Итак, мы получили длинную строку текста, в которой слова разделены пробелами. Построим по этой строке облако слов «в лоб», безо всякой обработки.
Создадим новый раздел. Загружаем необходимые библиотеки. Строим облако слов по переменной t1.
Рис. Облако слов без обработки
Настроим оформление графика, как мы уже проделали выше. Выбираем белый фон – background_color.
Задаем размеры облака слов в точках – width, height.
Укажем размеры графика figsize в дюймах, см. рис.
Рис. Настройка оформления
Рассмотрим полученный график. Большими буквами выделены самые обычные слова: «на», «что», «это». Причина проста – эти слова встречаются в нашем тексте чаще всего. Как мы помним, чем выше частота, тем больше размер шрифта на изображении.
Найдём частоту для каждого слова. Для этого разобьём нашу длинную строку на отдельные слова. В качестве разделителя здесь выступает символ пробела, см. рис.
Рис. Разбиваем строку на слова
Загрузим библиотеку pandas для анализа табличных данных. Создадим объект типа DataFrame и посчитаем частоту каждого значения с помощью функции value_counts, см. рис.
Мы получили результаты в две колонки: сами слова и их частоты. Как видим, в этом тексте чаще всего встречаются общеупотребительные слова: «и», «это», «на», «что». Это так называемые служебные слова. В первой десятке нет ни одного слова, несущего смысл текста. В дальнейшем нам предстоит избавиться от таких служебных слов, которые не несут особой смысловой нагрузки.
Рис. Частота слов
Задание. Просмотрите в Википедии статью Служебные слова.
Теперь из этих результатов сформируем новый объект типа DataFrame. Переименуем столбец частот и дадим ему название Frequency, см. рис.
Рис. Таблица частот
Первоначально слова были использованы в качестве индекса. Выделим колонку слов в отдельный столбец с помощью функции reset_index. С помощью функции rename переименуем этот столбец Word, см. рис. Здесь использован параметр inplace с значением True. Это позволяет сразу же внести изменения с существующую таблицу, не используя операцию присваивания.
Рис. Столбец слов
Теперь разберемся с тем, какие слова были подсчитаны в нашем примере.
Отсортируем наши слова. Расположим их в алфавитном порядке с помощью функции sort_values.
Выведем на экран последние семь строк в нашей таблице функцией tail. Английское слово TAIL означает «хвост животного», а также «хвост поезда или чего-то подобного». В нашем случае это «последние строки таблицы».
Как видим, в этом списке присутствует одно и тоже слово «язык», но в разных формах, в разных падежах. В дальнейшем нам нужно будет привести слова к начальной форме. Тогда мы сможем грамотно подсчитать, сколько раз в тексте употреблялось каждое слово (в любой грамматической форме).
Рис. Сортировка слов
У нас есть еще одна проблема с анализом текстов, и мы сейчас её продемонстрируем. Выделяем собранные слова в один массив с помощью функции unique. Обратим внимание, что мы используем столбец Word и для этого указываем название столбца через точку после названия таблицы. Выведем на экран первые 200 слов, см. рис.
Как видим, здесь есть английские слова, а также цифры и знаки препинания. Есть здесь и комментарии из субтитров: [музыка].
Это отдельная проблема в обработке текстов, и от этих «лишних» элементов тоже предстоит избавиться.
Рис. Уникальные значения
Теперь попробуем оставить в исходной строке только русские буквы, а также пробел и черточку (дефис). Сформируем строку из «желательных» символов и назовём её alpha, см. рис.
Здесь мы используем функцию (метод) join. Этот инструмент позволяет объединить список в одну строку. Перед ним указаны пустые кавычки. Это строка, которая беде использована как разделитель при объединении строк. В нашем примере разделителя не будет.
В скобках идёт любопытная конструкция. Фактически, здесь использован цикл for, внутри которого проверяется условие принадлежности каждого символа к списку alpha. Если условие выполняется, мы возвращаем очередной символ.
Рис. Только буквы
Рассмотрим выражение в скобках поподробнее, см. рис. Присвоим это выражение как значение переменной с. Выводим на экран тип переменной с. Нам сообщают, что это «генератор» – конструкция Питона, которая выдаёт очередное значение «по требованию».
Выводим на экран первые 10 элементов с. Чтобы получить значения элементов с, мы преобразуем её в список – list. Далее в квадратных скобках мы указали, что нам нужны первые десять элементов этого объекта.
Обратим внимание, что вывод на экран в середине ячейки требует использования функции print. Если в последней строке ячейки ввести только имя переменной, она будет выведена на экран даже без print.
Рис. Генератор
Повторим предыдущие шаги по обработке текста и изучим полученные результаты. Мы использовали команду split, чтобы разделить строку на отдельные слова. В качестве мы указали символ пробела. Теперь у нас остались только русские слова. В некоторых словах сохранился дефис, см. рис.
Таким образом, мы избавились от английских слов, а также от цифр и знаков препинания. Обратим внимание на то, что в расшифровке видео используются только символы нижнего регистра.
Рис. Очищенный текст
Посмотрим, сколько слов у нас набралось после всех наших манипуляций, см. рис. Мы вызываем свойство shape. Так мы можем узнать, какие «размеры» имеет наш объект. В данном примере это 2626 элементов.
Рис. Размерность объекта
2.9. Лемматизация
Как мы уже убедились, в тексте встречаются одинаковые слова, но в разных формах. Перед анализом частоты употребления слов их нужно привести к начальной форме. Для существительных это единственное число, именительный падеж. Для прилагательных – мужской род, единственное число, именительный падеж. Такая операция называется стандартизацией, нормализацией или, более конкретно, лемматизацией. ЛЕММА в данном случае – это начальная форма слова.
Создадим новый раздел блокнота и назовём его «Лемматизация».
Мы будем использовать специальную библиотеку pymorphy. Для начала установим эту библиотеку, см. рис.
Мы вызываем команду pip install, причем не в Питоне, в операционной системе. Утилита pip находит и скачивает нужные файлы из интернета. На экран выводятся соответствующие сообщения: Downloading…
Задание. Просмотрите в Википедии статью Pip (менеджер пакетов). Выясните, как можно расшифровывать это название.
Рис. Установка библиотеки
Теперь можем провести лемматизацию, см. рис.
Создаем экземпляр объекта lemmatizer.
По умолчанию используется словарь русского языка.
Далее создаем пустую строку, к которой будем добавлять шаг за шагом новые леммы.
В цикле перебираем все слова в массиве t6 и преобразуем их в леммы.
Для работы мы задействуем только один главный элемент результата грамматического разбора word [0]. Остальную информацию мы пока не используем.
Полученный текст читать человеку будет тяжеловато. Этот текст предназначен только для машинной обработки, см. рис.
Обратим внимание, что теперь текст звучит немного «неграмотно» – примерно, как «моя твоя не понимай». Здесь все слова приведены к своей исходной форме.
Рис. Лемматизация
Посмотрим, что же происходит при лемматизации, см. рис.
Введем всего одно слово: «красными». Проведем грамматический разбор командой parse. На жаргоне программистов это называется «распарсить».
Подробнее можно прочитать в руководстве:
Морфологический анализатор pymorphy2. Руководство пользователя:
https://pymorphy2.readthedocs.io/en/stable/user/guide.html
Первый вариант разбора, он же наиболее вероятный: ADJ – adjective – прилагательное. Эти сведения находятся в атрибуте tag – тег.
Атрибут normal_form содержит исходную, нормальную форму слова. В нашем случае «красный».
Рис. Внутри лемматизации
У каждого слова в языке много форм. Это и число, и род, и падеж, и многое другое. Подробности в можно найти в словарях, см. рис.
Ссылка на ВИКИ-словарь:
https://ru.wiktionary.org
Рис. Формы слова «красный»
Зададим несколько форм слова «красный» и посмотрим, как с ними справится наш инструмент, см. рис.
Рис. Исследование лемматизации
Задание. Проверьте, как лемматизатор обработает все формы слова «статистика».
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.