Word cloud python как использовать
Частотный анализ является одним из сравнительно простых методов обработки текста на естественном языке (NLP). Его результатом является список слов, наиболее часто встречающихся в тексте. Частотный анализ также позволяет получить представление о тематике и основных понятиях текста. Визуализировать его результаты удобно в виде «облака слов». Эта диаграмма содержит слова, размер шрифта которых отражает их популярность в тексте.
Обработку текста на естественном языке удобно производить с помощью Python, поскольку он является достаточно высокоуровневым инструментом программирования, имеет развитую инфраструктуру, хорошо зарекомендовал себя в сфере анализа данных и машинного обучения. Сообществом разработано несколько библиотек и фреймворков для решения задач NLP на Python. Мы в своей работе будем использовать интерактивный веб-инструмент для разработки python-скриптов Jupyter Notebook, библиотеку NLTK для анализа текста и библиотеку wordcloud для построения облака слов.
В сети представлено достаточно большое количество материала по теме анализа текста, но во многих статьях (в том числе русскоязычных) предлагается анализировать текст на английском языке. Анализ русского текста имеет некоторую специфику применения инструментария NLP. В качестве примера рассмотрим частотный анализ текста повести «Метель» А. С. Пушкина.
Проведение частотного анализа можно условно разделить на несколько этапов:
- Загрузка и обзор данных
- Очистка и предварительная обработка текста
- Удаление стоп-слов
- Перевод слов в основную форму
- Подсчёт статистики встречаемости слов в тексте
- Визуализация популярности слов в виде облака
Загрузка данных
Открываем файл с помощью встроенной функции open, указываем режим чтения и кодировку. Читаем всё содержимое файла, в результате получаем строку text:
Длину текста – количество символов – можно получить стандартной функцией len:
Строка в python может быть представлена как список символов, поэтому для работы со строками также возможны операции доступа по индексам и получения срезов. Например, для просмотра первых 300 символов текста достаточно выполнить команду:
Предварительная обработка (препроцессинг) текста
Для проведения частотного анализа и определения тематики текста рекомендуется выполнить очистку текста от знаков пунктуации, лишних пробельных символов и цифр. Сделать это можно различными способами – с помощью встроенных функций работы со строками, с помощью регулярных выражений, с помощью операций обработки списков или другим способом.
Для начала переведём символы в единый регистр, например, нижний:
Используем стандартный набор символов пунктуации из модуля string:
string.punctuation представляет собой строку. Набор специальных символов, которые будут удалены из текста может быть расширен. Необходимо проанализировать исходный текст и выявить символы, которые следует удалить. Добавим к знакам пунктуации символы переноса строки, табуляции и другие символы, которые встречаются в нашем исходном тексте (например, символ с кодом \xa0):
Для удаления символов используем поэлементную обработку строки – разделим исходную строку text на символы, оставим только символы, не входящие в набор spec_chars и снова объединим список символов в строку:
Можно объявить простую функцию, которая удаляет указанный набор символов из исходного текста:
Её можно использовать как для удаления спец.символов, так и для удаления цифр из исходного текста:
Токенизация текста
Для последующей обработки очищенный текст необходимо разбить на составные части – токены. В анализе текста на естественном языке применяется разбиение на символы, слова и предложения. Процесс разбиения называется токенизация. Для нашей задачи частотного анализа необходимо разбить текст на слова. Для этого можно использовать готовый метод библиотеки NLTK:
Переменная text_tokens представляет собой список слов (токенов). Для вычисления количества слов в предобработанном тексте можно получить длину списка токенов:
Для вывода первых 10 слов воспользуемся операцией среза:
Для применения инструментов частотного анализа библиотеки NLTK необходимо список токенов преобразовать к классу Text, который входит в эту библиотеку:
Выведем тип переменной text:
К переменной этого типа также применимы операции среза. Например, это действие выведет 10 первых токенов из текста:
Подсчёт статистики встречаемости слов в тексте
Для подсчёта статистики распределения частот слов в тексте применяется класс FreqDist (frequency distributions):
Попытка вывести переменную fdist отобразит словарь, содержащий токены и их частоты – количество раз, которые эти слова встречаются в тексте:
Также можно воспользоваться методом most_common для получения списка кортежей с наиболее часто встречающимися токенами:
Частота распределения слов тексте может быть визуализирована с помощью графика. Класс FreqDist содержит встроенный метод plot для построения такого графика. Необходимо указать количество токенов, частоты которых будут показаны на графике. С параметром cumulative=False график иллюстрирует закон Ципфа: если все слова достаточно длинного текста упорядочить по убыванию частоты их использования, то частота n-го слова в таком списке окажется приблизительно обратно пропорциональной его порядковому номеру n.
Можно заметить, что в данный момент наибольшие частоты имеют союзы, предлоги и другие служебные части речи, не несущие смысловой нагрузки, а только выражающие семантико-синтаксические отношения между словами. Для того, чтобы результаты частотного анализа отражали тематику текста, необходимо удалить эти слова из текста.
Удаление стоп-слов
К стоп-словам (или шумовым словам), как правило, относят предлоги, союзы, междометия, частицы и другие части речи, которые часто встречаются в тексте, являются служебными и не несут смысловой нагрузки – являются избыточными.
Библиотека NLTK содержит готовые списки стоп-слов для различных языков. Получим список сто-слов для русского языка:
Следует отметить, что стоп-слова являются контекстно зависимыми – для текстов различной тематики стоп-слова могут отличаться. Как и в случае со спец.символами, необходимо проанализировать исходный текст и выявить стоп-слова, которые не вошли в типовой набор.
Список стоп-слов может быть расширен с помощью стандартного метода extend:
После удаления стоп-слов частота распределения токенов в тексте выглядит следующим образом:
Как видно, результаты частотного анализа стали более информативными и точнее стали отражать основную тематику текста. Однако, мы видим в результатах такие токены, как «владимир» и «владимира», которые являются, по сути, одним словом, но в разных формах. Для исправления этой ситуации необходимо слова исходного текста привести к их основам или изначальной форме – провести стемминг или лемматизацию.
Визуализация популярности слов в виде облака
В завершение нашей работы визуализируем результаты частотного анализа текста в виде «облака слов».
Для этого нам потребуются библиотеки wordcloud и matplotlib:
Для построения облака слов на вход методу необходимо передать строку. Для преобразования списка токенов после предобработки и удаления стоп-слов воспользуемся методом join, указав в качестве разделителя пробел:
Выполним вызов метода построения облака:
В результате получаем такое «облако слов» для нашего текста:
Глядя на него, можно получить общее представление о тематике и главных персонажах произведения.
Хотя в среднем для каждодневных задач автоматизация не требуется, бывают случаи, когда она может быть необходима. Создание множества диаграмм, рисунков, таблиц и отчётов может утомить, если вы работаете вручную. Так быть не должно. Специально к старту нового потока курса Fullstack-разработчик на Python делимся с вами кейсом постройки конвейера на Python, с помощью которого Excel и Word легко интегрировать: нужно создать таблицы в Excel, а затем перенести результаты в Word, чтобы практически мгновенно получить отчёт.
Openpyxl
Встречайте Openpyxl — возможно, одну из самых универсальных связок [биндингов] с Python, которая сделает взаимодействие с Excel очень простым. Вооружившись этой библиотекой, вы сможете читать и записывать все нынешние и устаревшие форматы Excel, то есть xlsx и xls.
Openpyxl позволяет заполнять строки и столбцы, выполнять формулы, создавать 2D и 3D диаграммы, маркировать оси и заголовки, а также предоставляет множество других возможностей, которые могут пригодиться.
И самое важное — этот пакет позволяет вам перебирать бесконечное количество строк и столбцов в Excel, тем самым избавляя вас от всех этих надоедливых вычислений и построения графиков, которые вам приходилось делать раньше.
Python-docx
Затем идёт Python-docx, этот пакет для Word — то же самое, что Openpyxl для Excel. Если вы ещё не изучили его документацию, вам, вероятно, стоит взглянуть на неё. Python-docx — без преувеличения один из самых простых и понятных мне наборов инструментов, с которыми я работал с тех пор, как начал работать с самим Python.
Python-docx позволяет автоматизировать создание документов путём автоматической вставки текста, заполнения таблиц и рендеринга изображений в отчёт без каких-либо накладных расходов. Без лишних слов давайте создадим наш собственный автоматизированный конвейер. Запустите Anaconda (или любую другую IDE по вашему выбору) и установите эти пакеты:
Автоматизация Microsoft Excel
Сначала загрузим уже созданный лист Excel, вот так:
Теперь переберём все строки в нашей таблице, чтобы вычислить и вставить значения мощности, умножив ток на напряжение:
Как только это будет сделано, мы используем рассчитанные значения мощности, чтобы сгенерировать линейную диаграмму, которая будет вставлена в указанную ячейку, код показан ниже:
Автоматически созданная таблица Excel
Извлечение диаграммы
Теперь, когда мы сгенерировали нашу диаграмму, нам нужно извлечь её как изображение, чтобы мы могли использовать её в нашем отчёте Word. Сначала укажем точное местоположение файла Excel, а также место, где должно быть сохранено изображение диаграммы:
Затем откройте электронную таблицу, используя следующий метод:
Позднее вы сможете перебирать все объекты диаграммы в электронной таблице (если их несколько) и сохранять их в указанном месте:
Автоматизация Microsoft Word
Теперь, когда у нас есть сгенерированное изображение диаграммы, мы должны создать шаблон документа, который в принципе является обычным документом Microsoft Word (.docx), сформированным именно так, как мы хотим: отчёт содержит шрифты, размеры шрифтов, структуру и форматирование страниц.
Теперь всё, что нам нужно сделать, — создать плейсхолдеры для сгенерированного нами контента, то есть табличные значения и изображения, и объявить их с именами переменных, как показано ниже.
Шаблон документа Microsoft Word
Любой сгенерированный контент, включая текст и изображения, может быть объявлен в двойных фигурных скобках >. В случае таблиц вам нужно создать таблицу со строкой шаблона со всеми включёнными столбцами, затем нужно добавить одну строку вверху и одну строку ниже со следующей нотацией:
На рисунке выше — имена переменных:
table_contents для словаря Python, в котором будут храниться наши табличные данные;
Index для ключей словаря (первый столбец);
Power, Current и Voltage для значений словаря (второй, третий и четвёртый столбцы).
Затем импортируем наш шаблонный документ в Python и создаём словарь, в котором будут храниться значения нашей таблицы:
Далее импортируем ранее созданное в Excel изображение диаграммы и создадим другой словарь для создания экземпляров всех объявленных в документе шаблона переменных-заполнителей:
И, наконец, визуализируем отчёт с нашей таблицей значений и изображением диаграммы:
Результаты
И вот — автоматически сгенерированный отчёт Microsoft Word с числами и созданной в Microsoft Excel диаграммой. Мы получили полностью автоматизированный конвейер, его можно использовать, чтобы создать столько таблиц, диаграмм и документов, сколько вам потребуется.
Автоматически сгенерированный отчёт
Исходный код
Вот мой репозиторий на GitHub с шаблоном документа и исходным кодом для этого туториала. А вот ссылка на курс Fullstack-разработчик на Python, который сделает из вас настоящего универсального солдата от кодинга.
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
В качестве примера мы рассмотрим датасет с информацией о статьях текущего сайта. Сформируем облако слов в Python на основе текстовой информации из колонки «Title». Действовать будем поэтапно:
- Сначала мы загрузим датасет
- После этого познакомимся с основным принципом создания облака слов и сформируем стандартное прямоугольное облако на неочищенных данных.
- Затем, используя функции препроцессинга текста, преобразуем наши данные и выведем прямоугольное облако на подготовленных данных.
- И в заключение, сформируем облако слов в виде фигуры, загруженной в качестве маски из jpg-изображения. В нашем случае это будет фигура самолета.
Итак, открываем редактор, потому как пришло время покодить!
1. Загружаем датасет
Отлично, данные загружены, можно приступать к созданию облака слов!
А теперь загрузим класс WordCloud из библиотеки wordcloud и сгенерируем облако слов с помощью функции generate(). В качестве аргумента функции generate() передадим наш текст. После этого выведем сгенерированное облако с помощью библиотеки matplotlib. Добавленные на этом этапе строки выделены в коде подсветкой:
В результате исполнения кода, получим:
3. Осуществляем предобработку текста
3.1. Удаляем стоп-слова
На первый взгляд, получилось довольно приятное облако. Однако, после второго взгляда хочется воскликнуть: «Обманули! Подменили. » и так далее. Ведь мы на самом деле ожидали, что крупным шрифтом будут написаны основные значащие слова, а вместо этого на переднем плане оказались теряющие смысл без контекста предлоги: «как, в, на, и». Эти предлоги называются стоп-словами, и они действительно чаще всего используются в нашей речи, однако в большинстве случаев при анализе текста, являются лишним шумом. Этот фактор был учтен создателями библиотеки wordcloud, и для объекта облака слова WordCloud() был добавлен параметр stopwords. По умолчанию, значение этого параметра «None», это значит, что функция использует встроенный список стоп-слов, среди которых присутствуют английские слова, но нет русских. Поэтому при выводе облака слов на основе английского текста, не нужно менять значение параметра stopwords — предлоги, союзы и прочие артикли будут исключены автоматически. В нашем же случае, необходимо передать параметру stopwords список со стоп-словами русского языка. Этот список есть в библиотеке nltk. Давайте это сделаем! (добавленные строки выделены подсветкой):
3.2. Разбиваем текст на токены и получаем леммы
Отлично! Теперь предлоги исчезли из облака слов! Однако, выводятся слова с разными склонениями, такие как «помощи», «изображений», «файла» и т. д. Конечно, можно оставить оставить эти слова в покое, однако я предлагаю добавить немного строк кода, чтобы привести их все к основной форме до загрузки текста в функцию generate(). Для этого мы будем использовать библиотеку созданную для лемматизации русского и украинского языков под названием pymorphy2. Однако, предварительно, нам потребуется разбить текст на слова, другими словами, токенизировать текст:
4. Меняем форму облака слов
- Загрузить изображение, которое будет использоваться в качестве маски при формировании облака, и преобразовать его в матрицу
- Передать параметру mask в качестве значения полученную матрицу
- По желанию добавить параметры обводки полученной фигуры: contour_width и contour_color
Посмотрим на результат:
Неплохо, однако, не мешало бы поиграться с параметрами WordCloud, изменить размеры изображения и цвета на свой вкус.
Редактируем облако слов в Python: меняем фон, цветовую схему и максимальное количество слов
У объекта WordCloud довольно много настраиваемых параметров. Описание всех параметров можно найти по ссылке в документации. Сейчас мы изменим значения лишь некоторых из них:
Таким образом, после внесенных изменений итоговый код имеет вид:
Отлично! Теперь полученное облако слов выводится в виде симпатичного самолета:
Заключение:
Поздравляю вас с успешно проделанной работой! Мы изучили основной принцип формирования облака слов в Python, подготовили русский текст для формирования корректного облака, а также научились менять цвет и форму облака слов. В итоге у нас получилось 2 вида облаков: стандартное облако в виде прямоугольника, и облако в форме самолета!
Click to open the interactive viz
Дополнительно про Word Clouds в Python можно прочитать в статьях:
1. Подготовка данных
2. Облака слов в Python
Код ниже создает облако слов из названий 1000 величайших фильмов.
Этот код читает текст из файла 1000 Top Films.csv, а также читает STOPLIST из другого файла .csv. В стоплисте содержатся слова, которые будут удаляться из исходного текста. Также можно использовать стоплисты из библиотек типа stop_words или nltk:
Кроме этого в коде есть возможность ввода стоп-слов, это реализовано в строке, которая добавляет сова в список стоп-слов:
Следующая строка читает файл маски:
В результате выполнения кода получается такое облако слов:
Ниже перечислены параметры облака слов, которые используются в коде:
Это не все параметры, которые можно использовать. Все параметры и их описание можно найти в описании библиотеки WordCloud.
Важно: библиотека wordcloud не со всеми шрифтами работает корректно, поэтому сначала лучше проверить на небольшом объеме данных как отображается выбранный вами шрифт
Следующие строки в коде нужны для расчета времени выполнения кода и вывода времени на экран, они не влияют на саму визуализацию:
Также после выполнения кода будет сгенерирован файл Film_Coordinates.csv, в котором будут перечислены пары координат X и Y для каждого слова. Этот файл нужен только для того, чтобы перенести облако слов в Tableau.
Все буквы приводим к верхнему регистру в строке:
Это нужно для того, чтобы не различались слова с большой буквы в начале и середине предложений.
3. Стоп-слова
В коде используется библиотека stop_words, в которой список стоп-слов на английском выглядит так:
При анализе текстов книг мне не хватило этого списка, поэтому я создал отдельный файл Stop List.csv с наречиями, числительными, местоимениями, междометиями, числительными, предлогами, устаревшими и нецензурными словами. В списке оказалось больше 1000 слов, часть списка выглядит так:
Обратите внимание, что я добавил в стоп-лист слово Chapter (глава), поскольку для книг с небольшими главами это слово было очень частотным, но на сюжет книг оно не влияет.
Кроме этого, для каждого источника текста могут встречаться специфические слова, например, у Шекспира. Их можно убирать прямо в коде, добавляя в список:
Таким образом, в качестве источника стоп-слов можно использовать:
- Библиотеки
- Файлы
- Список внутри кода
Также все эти списки можно объединять.
Таким образом мы избавляемся от частотных слов: предлогов, наречий, местоимений и пр., которые не характеризуют сюжет книги или смысл другого источника текста
4. Облака слов в Tableau
Стандартное облако в Tableau выглядит следующим образом:
Такой тип визуализации подходит для небольших объёмов текстовых данных. Кроме того у этого облака слов есть существенные ограничения:
- Максимальный размер текста ограничен
- Слова можно располагать либо горизонтально либо вертикально
- Нельзя выбрать форму облака
В Python же таких ограничений нет. Кроме того, есть множество дополнительных настроек. Tableau же предоставляет дополнительные интерактивные возможности (фильтрация, actions). Поэтому можно рассчитать координаты слов в Python и потом перенести из в Tableau для создания кастомного облака слов.
Библиотека WordCloud позволяет забирать координаты слов, цвет и направление текста. Это делает метод wordcloud.layout_ в строках:
Файл Film_Coordinates.csv выгладит так:
Его можно либо допилить в питоне (разделить X и Y, перевести цвета в шестнадцатеричный формат и т.д), либо перенести вычисления в Tableau. Пойдём вторым путем и сначала разделим поле Name и координаты при помощи SPLIT:
Name
X
Y
Вычисления выше выглядят достаточно громоздко, но в них просто разобраться. Если же вы знакомы с регулярными выражениями, то можно применять их. Например, для Y аналогичное вычисление выглядит так:
Спасибо Артему Прыткову за совет по регулярным выражениям.
Если хотите больше знать о том как работать с текстом в Tableau при помощи регулярных выражений, можете почитать статьи:
После этого построим точки начала координат на диаграмме разброса, используя картинку облака слов, полученное в Python, в качестве подложки:
Можно видеть, что Python передал координаты верхних левых углов каждого слова. Tableau же работает с центрами (центроидами) слов. То есть, если представить каждое слово в виде прямоугольника, мы имеем координаты левых верхних углов, а нам нужны геометрические координаты центров этих прямоугольников. Поэтому нам нужно рассчитать координаты центров.
Вычисления для координат центров прямоугольников (слов).
X Shift
IF ISNULL ( [Direction] ) THEN
[X] + [Parameter 1] * [Size] /2* LEN ( [Name Split] )
ELSE [X] + [Parameter 1] * [Size] /2
END
Y Shift Horizontal
Y Shift Vertical
Эти вычисления основаны на делении длины и высоты слов пополам так чтобы координаты сместились от углов к центрам слов.
Важно: в визуализации используется моноширинный шрифт Courier New у которого ширина всех букв одинакова. Так центры прямоугольников точнее находятся в Tableau .
Parameter 1 здесь нужен для подгонки слов. Это связано с тем что на разных разрешениях Tableau не меняет размер шрифта, поэтому приходится настраивать размер шрифта на панели Marks в Size. Параметром же дополнительно можно минимизировать зазоры между словами.
В итоге получится такая визуализация с двумя осями:
На оси для вертикальных слов можно выбирать направление снизу вверх или сверху вниз в настройках направления текста.
Также надо настроить одинаковые шаги сетки по X и Y. Получим финальный виз:
Click to open the interactive viz
В Tableau есть ограничения на высоту текста, поэтому больше и меньше определенных границ текст в облаке сделать нельзя. Таких ограничений нет в Python. Поэтому в Tableau иногда слова немного наезжают на другие слова, и такой идеальной картинки как в Python не получается.
В Color можно добавлять различные вычисления, например, если добавить X Shift то для фильмов получим такую картину:
Заключение
Читайте также: