Визуализация информации в текстовых документах. Кластеризация и визуализация текстовой информации Форма проведения урока

Практическая работа по теме «Визуализация информации в текстовых документах».

Дан текст:

Самые известные космонавты.

Прошло уже 55 лет с того дня, как первый человек поднялся в космос. С тех пор там побывало более 500 человек, из них - более 50 женщин. На орбите нашей планете побывали представители 36 стран.

Юрий Гагарин (1934-1968). 12 апреля 1961 года с Байконура стартовал космический корабль Восток-1 с первым в истории космонавтом на борту. На орбите Гагарин делал простейшие эксперименты - ел, пил, делал заметки. Космонавт выполнил 1 оборот вокруг Земли, что заняло 108 минут. День же исторического полета стал праздноваться, как День космонавтики. 12 апреля 1961 года навсегда изменило жизнь человечества и самого Гагарина. Он стал живым символом.

Валентина Терешкова (род.1937). Первые успешные полеты советских космонавтов зародили мысль у главного конструктора Сергея Королева запустить в космос и женщину. С 1962 года по всей стране отбирали претенденток. Из пяти подготовленных кандидатов была выбрана именно Терешкова, в том числе благодаря и своему рабочему происхождению. Свой первый полет женщина-космонавт совершила 16 июня 1963 года на корабле Восток-6. Пребывание в космосе заняло трое суток.

Алексей Леонов (род. 1934). В списке советских космонавтов у него №11. Славу Леонову принес его полет в космос в статусе второго пилота на космическом корабле «Восход-2» 18-19 марта 1961 года. Космонавт совершил первый в истории выход в открытый космос, который продлился 12 минут 9 секунд. Во время тех исторических мгновений Леонов проявил исключительное хладнокровие - ведь его скафандр разбух, что мешало выходить в космос. Приземлился корабль в глухой тайге, космонавты двое суток провели на морозе.

Нил Армстронг (род. 1930). 20 июля Нил Армстронг и пилот Эдвин Олдрин посадили свой лунный модуль в районе Моря Спокойствия. Пребывание на поверхности Луны заняло 21,5 час. Астронавты совершили также выход на лунную поверхность, длительностью 2,5 часа. Первым человеком, ступившим туда, стал именно Нил Армстронг. Встав на поверхность, космонавт произнес историческую фразу: «Это лишь один маленький шаг для человека, но огромный скачок для всего человечества.»

Сергей Крикалев (род.1958). Два человека - Джерри Росс и Франклин Чанг-Диаз побывали в космосе 7 раз. Но рекорд по времени, проведенному на орбите, принадлежит советскому и российскому космонавту. Он стартовал в небо 6 раз, проведя в космосе в общей сложности 803 дня. Свой последний полет космонавт совершил в 2005 году, прожив на МКС полгода.

Валерий Поляков (род. 1942). Профессия Полякова - врач, он стал доктором медицинских наук и профессором. В истории СССР и России Поляков стал космонавтом №66. Именно ему принадлежит рекорд наиболее длительного пребывания в космосе. На орбите Земли Поляков пробыл 437 суток 18 часов, в течение 1994-1995 годов. А свой первый полет космонавт совершил еще в 1988 году, находясь над Землей с 29 августа 1988 года по 27 апреля 1989 года. Тот полет продлился 240 суток, за что Валерий Поляков получил звание Героя Советского Союза. Всего Поляков провел в космосе 678 суток.

Согласно тексту составить:

    Нумерованный список людей побывавших в космосе, согласно дате их полета (от самого раннего);

    Проиллюстрировать текст картинками (Рабочий стол- папка Космос);

    По тексту составить таблицу типа:

4) Из папки «Оценка» выберите картинку и оцените свою практическую работу, вставив изображение под выполненной работой.

ВИЗУАЛИЗАЦИЯ ИНФОРМАЦИИ В ТЕКСТОВЫХ ДОКУМЕНТАХ

Визуализация – представление информации в наглядном виде. Текстовую информацию представляют в виде списков, таблиц, диаграмм, снабжают иллюстрациями (фотографиями, схемами, рисунками).

Списки

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

Элементы нумерованного списка обозначаются с помощью чисел или букв (латинских или русских).

Элементы маркированного списка обозначаются с помощью значков-маркеров .

По структуре списки различают: одноуровневые и многоуровневые. Все примеры, рассмотренные, ранее являются одноуровневыми списками

Список, элемент которого сам является списком, называется многоуровневым .

Таблицы

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

Представленная в таблице информация наглядна, компактна и легкообазрима.

Правильно оформленная таблица имеет следующую структуру:

В ячейках таблиц могут быть размещены тексты, числа, изображения.

Пример таблицы:

Создать таблицу можно с помощью соответствующего пункта меню или кнопки на панели инструментов, указав необходимое число столбцов и строк; в некоторых текстовых процессорах таблицу можно нарисовать. Созданную таблицу можно редактировать, изменяя ширину столбцов и высоту строк, объединяя и разбивая ячейки. Вводить информацию в ячейки таблицы можно так: с помощью клавиатуры, копировать и вставлять заранее подготовленные фрагменты. В текстовых процессорах есть возможность автоматически преобразовывать имеющийся текст в таблицу.

Внешний вид таблицы можно оформить самостоятельно, подобрав тип, ширину и цвет границ ячеек, цвет фона ячеек, отформатировав содержимое ячеек. Кроме того отформатировать таблицу можно автоматически.

Графические изображения

Современные текстовые процессоры позволяют включать в документы различные графические изображения.

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

Виды графических схем в текстовом процессоре Microsoft Word.

Ключевые слова:

  • нумерованные списки
  • маркированные списки
  • многоуровневые списки
  • таблица
  • графические изображения

Известно, что текстовая информация воспринимается человеком лучше, если она визуализирована - организована в виде списков, таблиц, диаграмм, снабжена иллюстрациями (фотографиями, рисунками, схемами). Современные текстовые процессоры представляют пользователям широкие возможности визуализации информации в создаваемых документах.

4.4.1. Списки

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

По способу оформления различают нумерованные и маркированные списки.

Элементы (пункты) нумерованного списка обозначаются с помощью последовательных чисел, для записи которых могут использоваться арабские и римские цифры. Элементы списка могут быть пронумерованы и буквами - русскими или латинскими (рис. 4.14).

Рис. 4.14.
Примеры нумерованных списков

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

При создании новых, удалении или перемещении существующих элементов нумерованного списка в текстовом процессоре вся нумерация списка меняется автоматически.

Элементы маркированного списка обозначаются с помощью значков-маркеров. Пользователь может выбрать в качестве маркера любой символ компьютерного алфавита, и даже небольшое графическое изображение (рис. 4.15). С помощью маркированного списка оформлены ключевые слова в начале каждого параграфа вашего учебника.

Рис. 4.15.
Примеры маркированных списков

Маркированный список используют в тех случаях, когда порядок следования элементов в нём не важен. Например, в виде маркированного списка можно оформить перечень предметов, изучаемых вами в 8 классе.

По структуре различают одноуровневые и многоуровневые списки.

Списки в рассмотренных выше примерах имеют одноуровневую структуру.

Список, элемент которого сам является списком, называется многоуровневым. Так, оглавление вашего учебника информатики является многоуровневым (трёхуровневым) списком.

Списки создаются в текстовом процессоре с помощью команды строки меню или кнопок панели форматирования (рис. 4.16).

Рис. 4.16.
Инструменты создания списков

4.4.2. Таблицы

Для описания ряда объектов, обладающих одинаковыми наборами свойств, наиболее часто используются таблицы, состоящие из столбцов (граф) и строк. Вам хорошо известно табличное представление расписания уроков, в табличной форме представляются расписания движения автобусов, самолётов, поездов и многое другое.

Представленная в таблице информация наглядна, компактна и легкообозрима.

Правильно оформленная таблица имеет структуру, показанную на рис. 4.17.

Рис. 4.17.
Структура таблицы

Необходимо соблюдать следующие правила оформления таблиц:

  1. Заголовок таблицы должен давать представление о содержащейся в ней информации.
  2. Заголовки столбцов и строк должны быть краткими, не содержать лишних слов и, по возможности, сокращений.
  3. В таблице должны быть указаны единицы измерения. Если они общие для всей таблицы, то указываются в заголовке таблицы (либо в скобках, либо через запятую после названия). Если единицы измерения различаются, то они указываются в заголовке соответствующей строки или столбца.
  4. Желательно, чтобы все ячейки таблицы были заполнены. При необходимости в них заносят следующие условные обозначения:

      Данные неизвестны;

      х - данные невозможны;

      ↓ - данные должны быть взяты из вышележащей ячейки.

В ячейках таблиц могут быть размещены тексты, числа, изображения. Пример таблицы показан на рис. 4.18.

Рис. 4.18.
Пример таблицы

Создать таблицу можно с помощью соответствующего пункта меню или кнопки на панели инструментов, указав необходимое число столбцов и строк; в некоторых текстовых процессорах таблицу можно «нарисовать». Созданную таблицу можно редактировать, изменяя ширину столбцов и высоту строк, добавляя и удаляя столбцы и строки, объединяя и разбивая ячейки. Вводить информацию в ячейки можно так: с помощью клавиатуры; копировать и вставлять заранее подготовленные фрагменты. В текстовых процессорах есть возможность автоматически преобразовать имеющийся текст в таблицу.

Внешний вид таблицы можно оформить самостоятельно, подобрав тип, ширину и цвет границ ячеек, цвет фона ячеек, отформатировав содержимое ячеек. Кроме того, отформатировать таблицу можно автоматически.

4.4.3. Графические изображения

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

Во многих текстовых процессорах имеется возможность непосредственного создания графических изображений из наборов автофигур (графических примитивов). Также есть возможность создания красочных надписей с использованием встроенных текстовых эффектов.

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

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

Рис. 4.19. Виды графических схем в текстовом процессоре Microsoft Word

Самое главное

Известно, что текстовая информация воспринимается человеком лучше, если она визуализирована - организована в виде списков, таблиц, диаграмм, снабжена иллюстрациями (фотографиями, рисунками, схемами).

Всевозможные перечни в документах оформляются с помощью списков. По способу оформления различают нумерованные и маркированные списки. Нумерованный список принято использовать в тех случаях, когда имеет значение порядок следования пунктов; маркированный - когда порядок следования пунктов в нём не важен. По структуре различают одноуровневые и многоуровневые списки.

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

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

Вопросы и задания

  1. С какой целью разработчики включают в текстовые документы списки, таблицы, графические изображения?
  2. Для чего используются списки? Приведите примеры.
  3. Сравните нумерованные и маркированные списки. Что у них общего? В чём различие?
  4. Какой список называется многоуровневым? Приведите пример такого списка?
  5. Какая информация может быть организована в табличной форме? Какие преимущества обеспечивает табличное представление информации?
  6. Каких правил следует придерживаться при оформлении таблиц?
  7. Какие графические объекты могут быть включены в текстовый документ?
  8. Перечислите основные возможности текстовых процессоров по работе с графическими объектами.

ПОВТОРЕНИЕ № 1. Определите, к какой группе операций (редактирование или форматирование) относятся следующие действия: форматирование Замена одного символа на другой; Вставка пропущенного слова; Изменение шрифта; Удаление фрагмента текста; Выравнивание текста по ширине; Автоматическая проверка правописания; Изменение междустрочного расстояния; Изменение размеров полей страницы; Удаление ошибочного символа; Поиск и замена; Перемещение фрагментов текста.

ПОВТОРЕНИЕ № 2. Определите, к какой группе (свойства символов или № 2 свойства абзацев) относятся следующие свойства: абзацев Шрифт Выравнивание Интервал после Отступ первой строки Начертание Цвет Междустрочный интервал Отступ слева Отступ перед Размер (кегль) шрифта Отступ справа

ПОВТОРЕНИЕ № 3. В каких из приведённых ниже предложений № 3 правильно расставлены пробелы между словами и знаками препинания? Где допущены ошибки? 1) 2) 3) 4) С родной земли –умри, не сходи. Речь вести – не лапти плести. Где родился, там и сгодился. Говорить -смешно, утаить-грешно.

ПОВТОРЕНИЕ № 4. Выберите параметры, устанавливаемые при № 4 задании параметров страницы: Ориентация Стиль Размер шрифта Размер бумаги Номера страниц Поля Междустрочный интервал Отступы Выравнивание абзацев Начертание

Визуализация – представление информации в наглядном виде. Текстовую информацию представляют в виде списков, таблиц, диаграмм, снабжают иллюстрациями (фотографиями, схемами, рисунками). Визуализация информации Список Таблица Диаграмма Иллюстрация Список предметов 8 класс 1. Алгебра 2. Английский язык Оценка 3. Биология 4. Ученик. География Математика Информатика 5. Геометрия 6. Информатика и ИКТ Иванов 7. История 5 Саша 4 8. Литература 9. ОБЖ Орлова Катя 4 5 10. Обществознание 11. Русский язык Петров 12. Физика Витя 5 5 13. Химия 14. Черчение Диаграмма цветов

СПИСКИ Всевозможные перечни в документах оформляются с помощью списков. Пункты перечня рассматриваются как абзацы, оформленные по единому образцу. Структура списка Маркированные 1. 2. 3. 4. 5. 6. Русский язык Алгебра ОБЖ Обществознание Биология Технология Расписание уроков - пример нумерованного списка Нумерованные Русский язык Литература Алгебра Геометрия Физика Перечень предметов изучаемых в 7 классе - пример маркированного списка

По структуре различают одноуровневые и многоуровневые списки. Список, элемент которого сам является списком, называется многоуровневым Пример: Глава 1. Информация и информационные процессы § 1. 1. Информация и её свойства 1. 1. 1. Информация и сигнал 1. 1. 2. Виды информации 1. 1. 3. Свойства информации § 1. 2. Информационные процессы 1. 2. 1. Понятие информационного процесса 1. 2. 2. Сбор информации

ИНСТРУМЕНТЫ СОЗДАНИЯ СПИСКОВ Быстро создать списки с пометками и нумерацией можно с помощью кнопок на панели инструментов:

ИЗМЕНЕНИЕ МАРКИРОВАННЫХ СПИСКОВ: Для изменения вида маркера можно воспользоваться кнопкой Изменить. Появится окно Изменение маркированного списка, в котором содержатся дополнительные пометки. При нажатии кнопки Маркер появляется диалоговое окно Символ, в котором можно выбрать любой из символов в качестве маркера списка.

ИЗМЕНЕНИЕ НУМЕРОВАННЫХ СПИСКОВ: Чтобы создать свой вариант нумерованного списка, следует щелкнуть кнопку Изменить. Появится окно Изменение нумерованного списка. В поле Формат номера указывается текст перед и после номера элемента списка, например). В поле Нумерация- стиль нумерации. В поле Начать с…указывается число (или буква), с которого должен начинаться список. Для изменения шрифта номеров элементов списка используется кнопка Шрифт.

ПРЕДСТАВИМ ПЕРЕЧЕНЬ УСТРОЙСТВ КОМПЬЮТЕРА В ВИДЕ МНОГОУРОВНЕВОГО СПИСКА, ИМЕЮЩЕГО ЧЕТЫРЕ УРОВНЯ ВЛОЖЕННОСТИ. Устройства современного компьютера Процессор Память Оперативная память Долговременная память Жесткий магнитный диск Дискета Флэш-память Оптические диски CD DVD Устройства ввода Клавиатура Мышь Сканер Графический планшет Цифровая камера Микрофон Джойстик Устройства вывода Монитор Жидкокристаллический монитор Монитор на электронно-лучевой трубке Принтер Матричный принтер Струйный принтер Лазерный принтер

Придадим первой строке стиль форматирования, например, Заголовок 1. Устройства современного компьютера Процессор Память Оперативная память Долговременная память Жесткий магнитный диск Дискета Флэш-память Оптические диски CD DVD Устройства ввода Клавиатура Мышь Сканер Графический планшет

Преобразуем оставшиеся строки в многоуровневый § § список. Для этого необходимо: выделить все оставшиеся строки; отдать команду Формат-Список. В диалоговом окне Список перейти на вкладку Многоуровневый и выбрать там список типа:

Список приобретет следующий вид: Устройства современного компьютера 1. Процессор 2. Память 3. Оперативная память 4. Долговременная память 5. Жесткий магнитный диск 6. Дискета 7. Флэш-память 8. Оптические диски 9. CD 10. DVD 11. Устройства ввода 12. Клавиатура 13. Мышь 14. Сканер 15. Графический планшет 16. Цифровая камера 17. Микрофон 18. Джойстик 19. Устройства вывода 20. Монитор 21. Жидкокристаллический монитор 22. Монитор на электронно-лучевой трубке 23. Принтер 24. Матричный принтер 25. Струйный принтер 26. Лазерный принтер

Выделим пункты 3 – 10 и понизим их уровень. Для этого воспользуемся кнопкой Увеличить отступ Устройства современного компьютера 1. Процессор 2. Память 3. Оперативная память 4. Долговременная память 5. Жесткий магнитный диск 6. Дискета 7. Флэш-память 8. Оптические диски 9. CD 10. DVD 11. Устройства ввода 12. Клавиатура 13. Мышь 14. Сканер 15. Графический планшет 16. Цифровая камера 17. Микрофон 18. Джойстик

Список приобретет следующий вид: Устройства современного компьютера 1. Процессор 2. Память 2. 1. Оперативная память 2. 2. Долговременная память 2. 3. Жесткий магнитный диск 2. 4. Дискета 2. 5. Флэш-память 2. 6. Оптические диски 2. 7. CD 2. 8. DVD 3. Устройства ввода 4. Клавиатура 5. Мышь 6. Сканер 7. Графический планшет 8. Цифровая камера 9. Микрофон 10. Джойстик

Выделим пункты 2. 3 – 2. 8 и понизим их уровень. Для этого воспользоваться кнопкой Увеличить отступ Устройства современного компьютера 1. Процессор 2. Память 2. 1. Оперативная память 2. 2. Долговременная память 2. 3. Жесткий магнитный диск 2. 4. Дискета 2. 5. Флэш-память 2. 6. Оптические диски 2. 7. CD 2. 8. DVD 3. Устройства ввода 4. Клавиатура 5. Мышь 6. Сканер 7. Графический планшет 8. Цифровая камера 9. Микрофон 10. Джойстик

Список приобретет следующий вид: Устройства современного компьютера 1. Процессор 2. Память 2. 1. Оперативная память 2. 2. Долговременная память 2. 2. 1. Жесткий магнитный диск 2. 2. 2. Дискета 2. 2. 3. Флэш-память 2. 2. 4. Оптические диски 2. 2. 5. CD 2. 2. 6. DVD 3. Устройства ввода 4. Клавиатура 5. Мышь 6. Сканер 7. Графический планшет 8. Цифровая камера 9. Микрофон 10. Джойстик

Выделить пункты 2. 2. 5 – 2. 2. 6 и понизим их уровень. Устройства современного компьютера 1. Процессор 2. Память 2. 1. Оперативная память 2. 2. Долговременная память 2. 2. 1. Жесткий магнитный диск 2. 2. 2. Дискета 2. 2. 3. Флэш-память 2. 2. 4. Оптические диски 2. 2. 4. 1. CD 2. 2. 4. 2. DVD 3. Устройства ввода 4. Клавиатура 5. Мышь 6. Сканер 7. Графический планшет 8. Цифровая камера 9. Микрофон 10. Джойстик

Повторим аналогичные операции для других пунктов списка: 3. Устройства ввода 3. 1. Клавиатура 3. 2. Мышь 3. 3. Сканер 3. 4. Графический планшет 3. 5. Цифровая камера 3. 6. Микрофон 3. 7. Джойстик 4. Устройства вывода 4. 1. Монитор 4. 1. 1. Жидкокристаллический монитор 4. 1. 2. Монитор на электронно-лучевой трубке 4. 2. Принтер 4. 2. 1. Матричный принтер 4. 2. 2. Струйный принтер 4. 2. 3. Лазерный принтер

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

Большинство используемых библиотек уже есть в дистрибутиве Anaconda 3 , поэтому советую использовать его. Недостающие модули/библиотеки можно установить стандартно через pip install «название пакета».
Подключаем следующие библиотеки:

Import numpy as np import pandas as pd import nltk import re import os import codecs from sklearn import feature_extraction import mpld3 import matplotlib.pyplot as plt import matplotlib as mpl
Для анализа можно взять любые данные. Мне на глаза тогда попала данная задача: Статистика поисковых запросов проекта Госзатраты . Им нужно было разбить данные на три группы: частные, государственные и коммерческие организации. Придумывать экстраординарное ничего не хотелось, поэтому решил проверить, как поведет кластеризация в данном случае (забегая наперед - не очень). Но можно выкачать данные из VK какого-нибудь паблика:

Import vk #передаешь id сессии session = vk.Session(access_token="") # URL для получения access_token, вместо tvoi_id вставляете id созданного приложения Вк: # https://oauth.vk.com/authorize?client_id=tvoi_id&scope=friends,pages,groups,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.21&response_type=token api = vk.API(session) poss= id_pab=-59229916 #id пабликов начинаются с минуса, id стены пользователя без минуса info=api.wall.get(owner_id=id_pab, offset=0, count=1) kolvo = (info//100)+1 shag=100 sdvig=0 h=0 import time while h70): print(h) #не обязательное условие, просто для контроля примерного окончания процесса pubpost=api.wall.get(owner_id=id_pab, offset=sdvig, count=100) i=1 while i < len(pubpost): b=pubpost[i]["text"] poss.append(b) i=i+1 h=h+1 sdvig=sdvig+shag time.sleep(1) len(poss) import io with io.open("public.txt", "w", encoding="utf-8", errors="ignore") as file: for line in poss: file.write("%s\n" % line) file.close() titles = open("public.txt", encoding="utf-8", errors="ignore").read().split("\n") print(str(len(titles)) + " постов считано") import re posti= #удалим все знаки препинания и цифры for line in titles: chis = re.sub(r"(\<(/?[^>]+)>)", " ", line) #chis = re.sub() chis = re.sub("[^а-яА-Я ]", "", chis) posti.append(chis)
Я буду использовать данные поисковых запросов чтобы показать, как плохо кластеризуются короткие текстовые данные. Я заранее очистил от спецсимволов и знаков препинания текст плюс провел замену сокращений (например, ИП – индивидуальный предприниматель). Получился текст, где в каждой строке находился один поисковый запрос.

Считываем данные в массив и приступаем к нормализации – приведению слова к начальной форме. Это можно сделать несколькими способами, используя стеммер Портера, стеммер MyStem и PyMorphy2. Хочу предупредить – MyStem работает через wrapper, поэтому скорость выполнения операций очень медленная. Остановимся на стеммере Портера, хотя никто не мешает использовать другие и комбинировать их с друг другом (например, пройтись PyMorphy2, а после стеммером Портера).

Titles = open("material4.csv", "r", encoding="utf-8", errors="ignore").read().split("\n") print(str(len(titles)) + " запросов считано") from nltk.stem.snowball import SnowballStemmer stemmer = SnowballStemmer("russian") def token_and_stem(text): tokens = filtered_tokens = for token in tokens: if re.search("[а-яА-Я]", token): filtered_tokens.append(token) stems = return stems def token_only(text): tokens = filtered_tokens = for token in tokens: if re.search("[а-яА-Я]", token): filtered_tokens.append(token) return filtered_tokens #Создаем словари (массивы) из полученных основ totalvocab_stem = totalvocab_token = for i in titles: allwords_stemmed = token_and_stem(i) #print(allwords_stemmed) totalvocab_stem.extend(allwords_stemmed) allwords_tokenized = token_only(i) totalvocab_token.extend(allwords_tokenized)

Pymorphy2

import pymorphy2 morph = pymorphy2.MorphAnalyzer() G= for i in titles: h=i.split(" ") #print(h) s="" for k in h: #print(k) p = morph.parse(k).normal_form #print(p) s+=" " s += p #print(s) #G.append(p) #print(s) G.append(s) pymof = open("pymof_pod.txt", "w", encoding="utf-8", errors="ignore") pymofcsv = open("pymofcsv_pod.csv", "w", encoding="utf-8", errors="ignore") for item in G: pymof.write("%s\n" % item) pymofcsv.write("%s\n" % item) pymof.close() pymofcsv.close()


pymystem3

Исполняемые файлы анализатора для текущей операционной системы будут автоматически загружены и установлены при первом использовании библиотеки.

From pymystem3 import Mystem m = Mystem() A = for i in titles: #print(i) lemmas = m.lemmatize(i) A.append(lemmas) #Этот массив можно сохранить в файл либо "забэкапить" import pickle with open("mystem.pkl", "wb") as handle: pickle.dump(A, handle)


Создадим матрицу весов TF-IDF. Будем считать каждый поисковой запрос за документ (так делают при анализе постов в Twitter, где каждый твит – это документ). tfidf_vectorizer мы возьмем из пакета sklearn, а стоп-слова мы возьмем из корпуса ntlk (изначально придется скачать через nltk.download()). Параметры можно подстроить как вы считаете нужным – от верхней и нижней границы до количества n-gram (в данном случае возьмем 3).

Stopwords = nltk.corpus.stopwords.words("russian") #можно расширить список стоп-слов stopwords.extend(["что", "это", "так", "вот", "быть", "как", "в", "к", "на"]) from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer n_featur=200000 tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=10000, min_df=0.01, stop_words=stopwords, use_idf=True, tokenizer=token_and_stem, ngram_range=(1,3)) get_ipython().magic("time tfidf_matrix = tfidf_vectorizer.fit_transform(titles)") print(tfidf_matrix.shape)
Над полученной матрицей начинаем применять различные методы кластеризации:

Num_clusters = 5 # Метод к-средних - KMeans from sklearn.cluster import KMeans km = KMeans(n_clusters=num_clusters) get_ipython().magic("time km.fit(tfidf_matrix)") idx = km.fit(tfidf_matrix) clusters = km.labels_.tolist() print(clusters) print (km.labels_) # MiniBatchKMeans from sklearn.cluster import MiniBatchKMeans mbk = MiniBatchKMeans(init="random", n_clusters=num_clusters) #(init="k-means++", ‘random’ or an ndarray) mbk.fit_transform(tfidf_matrix) %time mbk.fit(tfidf_matrix) miniclusters = mbk.labels_.tolist() print (mbk.labels_) # DBSCAN from sklearn.cluster import DBSCAN get_ipython().magic("time db = DBSCAN(eps=0.3, min_samples=10).fit(tfidf_matrix)") labels = db.labels_ labels.shape print(labels) # Аггломеративная класстеризация from sklearn.cluster import AgglomerativeClustering agglo1 = AgglomerativeClustering(n_clusters=num_clusters, affinity="euclidean") #affinity можно выбрать любое или попробовать все по очереди: cosine, l1, l2, manhattan get_ipython().magic("time answer = agglo1.fit_predict(tfidf_matrix.toarray())") answer.shape
Полученные данные можно сгруппировать в dataframe и посчитать количество запросов, попавших в каждый кластер.

#k-means clusterkm = km.labels_.tolist() #minikmeans clustermbk = mbk.labels_.tolist() #dbscan clusters3 = labels #agglo #clusters4 = answer.tolist() frame = pd.DataFrame(titles, index = ) #k-means out = { "title": titles, "cluster": clusterkm } frame1 = pd.DataFrame(out, index = , columns = ["title", "cluster"]) #mini out = { "title": titles, "cluster": clustermbk } frame_minik = pd.DataFrame(out, index = , columns = ["title", "cluster"]) frame1["cluster"].value_counts() frame_minik["cluster"].value_counts()
Из-за большого количества запросов не совсем удобно смотреть таблицы и хотелось бы больше интерактивности для понимания. Поэтому сделаем графики взаимного расположения запросов относительного друг друга.

Сначала необходимо вычислить расстояние между векторами. Для этого будет применяться косинусовое расстояние. В статьях предлагают использовать вычитание из единицы, чтобы не было отрицательных значений и находилось в пределах от 0 до 1, поэтому сделаем так же:

From sklearn.metrics.pairwise import cosine_similarity dist = 1 - cosine_similarity(tfidf_matrix) dist.shape
Так как графики будут двух-, трехмерные, а исходная матрица расстояний n-мерная, то придется применять алгоритмы снижения размерности. На выбор есть много алгоритмов (MDS, PCA, t-SNE), но остановим выбор на Incremental PCA. Этот выбор сделан в следствии практического применения – я пробовал MDS и PCA, но оперативной памяти мне не хватало (8 гигабайт) и когда начинал использоваться файл подкачки, то можно было сразу уводить компьютер на перезагрузку.

Алгоритм Incremental PCA используется в качестве замены метода главных компонентов (PCA), когда набор данных, подлежащий разложению, слишком велик, чтобы разместиться в оперативной памяти. IPCA создает низкоуровневое приближение для входных данных, используя объем памяти, который не зависит от количества входных выборок данных.

# Метод главных компонент - PCA from sklearn.decomposition import IncrementalPCA icpa = IncrementalPCA(n_components=2, batch_size=16) get_ipython().magic("time icpa.fit(dist) #demo =") get_ipython().magic("time demo2 = icpa.transform(dist)") xs, ys = demo2[:, 0], demo2[:, 1] # PCA 3D from sklearn.decomposition import IncrementalPCA icpa = IncrementalPCA(n_components=3, batch_size=16) get_ipython().magic("time icpa.fit(dist) #demo =") get_ipython().magic("time ddd = icpa.transform(dist)") xs, ys, zs = ddd[:, 0], ddd[:, 1], ddd[:, 2] #Можно сразу примерно посмотреть, что получится в итоге #from mpl_toolkits.mplot3d import Axes3D #fig = plt.figure() #ax = fig.add_subplot(111, projection="3d") #ax.scatter(xs, ys, zs) #ax.set_xlabel("X") #ax.set_ylabel("Y") #ax.set_zlabel("Z") #plt.show()
Перейдем непосредственно к самой визуализации:

From matplotlib import rc #включаем русские символы на графике font = {"family" : "Verdana"}#, "weigth": "normal"} rc("font", **font) #можно сгенерировать цвета для кластеров import random def generate_colors(n): color_list = for c in range(0,n): r = lambda: random.randint(0,255) color_list.append("#%02X%02X%02X" % (r(),r(),r())) return color_list #устанавливаем цвета cluster_colors = {0: "#ff0000", 1: "#ff0066", 2: "#ff0099", 3: "#ff00cc", 4: "#ff00ff",} #даем имена кластерам, но из-за рандома пусть будут просто 01234 cluster_names = {0: "0", 1: "1", 2: "2", 3: "3", 4: "4",} #matplotlib inline #создаем data frame, который содержит координаты (из PCA) + номера кластеров и сами запросы df = pd.DataFrame(dict(x=xs, y=ys, label=clusterkm, title=titles)) #группируем по кластерам groups = df.groupby("label") fig, ax = plt.subplots(figsize=(72, 36)) #figsize подбирается под ваш вкус for name, group in groups: ax.plot(group.x, group.y, marker="o", linestyle="", ms=12, label=cluster_names, color=cluster_colors, mec="none") ax.set_aspect("auto") ax.tick_params(axis= "x", which="both", bottom="off", top="off", labelbottom="off") ax.tick_params(axis= "y", which="both", left="off", top="off", labelleft="off") ax.legend(numpoints=1) #показать легенду только 1 точки #добавляем метки/названия в х,у позиции с поисковым запросом #for i in range(len(df)): # ax.text(df.ix[i]["x"], df.ix[i]["y"], df.ix[i]["title"], size=6) #показать график plt.show() plt.close()
Если раскомментировать строку с добавлением названий, то выглядеть это будет примерно так:

Пример с 10 кластерами


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

# Plot fig, ax = plt.subplots(figsize=(25,27)) ax.margins(0.03) for name, group in groups_mbk: points = ax.plot(group.x, group.y, marker="o", linestyle="", ms=12, #ms=18 label=cluster_names, mec="none", color=cluster_colors) ax.set_aspect("auto") labels = tooltip = mpld3.plugins.PointHTMLTooltip(points, labels, voffset=10, hoffset=10, #css=css) mpld3.plugins.connect(fig, tooltip) # , TopToolbar() ax.axes.get_xaxis().set_ticks() ax.axes.get_yaxis().set_ticks() #ax.axes.get_xaxis().set_visible(False) #ax.axes.get_yaxis().set_visible(False) ax.set_title("Mini K-Means", size=20) #groups_mbk ax.legend(numpoints=1) mpld3.disable_notebook() #mpld3.display() mpld3.save_html(fig, "mbk.html") mpld3.show() #mpld3.save_json(fig, "vivod.json") #mpld3.fig_to_html(fig) fig, ax = plt.subplots(figsize=(51,25)) scatter = ax.scatter(np.random.normal(size=N), np.random.normal(size=N), c=np.random.random(size=N), s=1000 * np.random.random(size=N), alpha=0.3, cmap=plt.cm.jet) ax.grid(color="white", linestyle="solid") ax.set_title("Кластеры", size=20) fig, ax = plt.subplots(figsize=(51,25)) labels = ["point {0}".format(i + 1) for i in range(N)] tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels) mpld3.plugins.connect(fig, tooltip) mpld3.show()fig, ax = plt.subplots(figsize=(72,36)) for name, group in groups: points = ax.plot(group.x, group.y, marker="o", linestyle="", ms=18, label=cluster_names, mec="none", color=cluster_colors) ax.set_aspect("auto") labels = tooltip = mpld3.plugins.PointLabelTooltip(points, labels=labels) mpld3.plugins.connect(fig, tooltip) ax.set_title("K-means", size=20) mpld3.display()
Теперь при наведении на любую точку графика всплывает текст с соотвествующим поисковым запросом. Пример готового html файла можно посмотреть здесь: Mini K-Means

Если хочется в 3D и с изменяемым масштабом, то существует сервис Plotly , который имеет плагин для Python.

Plotly 3D

#для примера просто 3D график из полученных значений import plotly plotly.__version__ import plotly.plotly as py import plotly.graph_objs as go trace1 = go.Scatter3d(x=xs, y=ys, z=zs, mode="markers", marker=dict(size=12, line=dict(color="rgba(217, 217, 217, 0.14)", width=0.5), opacity=0.8)) data = layout = go.Layout(margin=dict(l=0, r=0, b=0, t=0)) fig = go.Figure(data=data, layout=layout) py.iplot(fig, filename="cluster-3d-plot")


Результаты можно увидеть здесь: Пример

И заключительным пунктом выполним иерархическую (аггломеративную) кластеризацию по методу Уорда для создания дендограммы.

In : from scipy.cluster.hierarchy import ward, dendrogram linkage_matrix = ward(dist) fig, ax = plt.subplots(figsize=(15, 20)) ax = dendrogram(linkage_matrix, orientation="right", labels=titles); plt.tick_params(\ axis= "x", which="both", bottom="off", top="off", labelbottom="off") plt.tight_layout() #сохраним рисунок plt.savefig("ward_clusters2.png", dpi=200)
Выводы

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