- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Дополнительная литература 81
встречающиеся в них обоих. На основе этой информации можно вычислить коэффициент Жаккара .
Обновляем словарь jacard_by_author и выводим каждый результат в окне интерпретатора. Затем находим автора с максимальным значением Жаккара и выводим результаты.
Коэффициент сходства Жаккара для doyle = 0.34847801578354004 Коэффициент сходства Жаккара для wells = 0.30786921307869214 Наиболее вероятным автором по схожести является doyle
В итоге счет оказывается в пользу Дойла.
Завершаем stylometry.py кодом для выполнения программы в качестве импортируемого модуля или в автономном режиме.
Итоги
Истинный автор «Затерянного мира» — Дойл. Установив это, мы останавливаемся и объявляем победу. Если вы хотите провести дополнительные исследования, то можете в качестве следующего теста добавить другие известные тексты к doyle
иwells, чтобы их совмещенная длина была ближе к тексту «Затерянного мира»
ине пришлось его слишком обрезать. Можно также протестировать длину предложений и стиль пунктуации или применить более сложные техники, такие как нейронные сети и генетические алгоритмы.
Помимо этого, иногда полезно доработать существующие функции, например vocab_test() и jaccard_test(), техниками стемминга и лемматизации, чтобы сократить слова до их корневых форм для лучшего сравнения. В том виде, в каком сейчас написана программа, talk, talking и talked рассматриваются как совершенно разные слова, несмотря на общий корень.
И все же стилометрия не может с абсолютной достоверностью гарантировать, что именно сэр Артур Конан Дойл написал «Затерянный мир». Она может лишь предположить на основе весомых свидетельств, что он более вероятный автор, нежели Уэллс. Здесь очень важна формулировка вопроса, поскольку нельзя оценить всех возможных авторов. По этой причине успешное определение авторства начинается со старой доброй детективной работы, которая сокращает список кандидатов до приемлемой длины.
Дополнительная литература
«Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit» (O’Reilly, 2009) Стивена Берда (Steven Bird), Эвана Клейна
82 Глава 2. Установление авторства с помощью стилометрии
(Ewan Klein) и Эдварда Лопера (Edward Loper)1 представляет доступное введение в область NLP при помощи Python со множеством упражнений и полезной интеграцией с сайтом NLTK. Новая версия книги, обновленная для Python 3 и NLTK 3, доступна онлайн на http:www.nltk.org/book/.
В 1995 году романист Курт Воннегут высказал идею, что «истории имеют формы, которые можно нарисовать на миллиметровой бумаге», и предложил «передать их на обработку компьютерам». В 2018 году энтузиасты реализовали его идею, использовав более 1700 английских романов. Они применили NLPтехнику анализа тональности текста, которая распознает присущий словам эмоциональный окрас. Полученные результаты описаны в книге «Every Story in the World Has One of These Six Basic Plots», которую можно найти на сайте BBC.com по ссылке http://www.bbc.com/culture/story/20180525-every-story-in-the- world-has-one-of-these-six-basic-plots/.
Практический проект: охота на собаку Баскервилей с помощью распределения
В NLTK есть небольшая занятная функция, называемая диаграммой распределения, которая позволяет определить местоположение слова в тексте. Если конкретнее, то она составляет диаграмму вхождений слова относительно количества предшествующих ему слов с начала корпуса.
На рис. 2.7 показана диаграмма распределения упоминания главных персонажей в книге «Собака Баскервилей».
Если вы знакомы с этой историей — а если нет, то спойлерить я ее не стану, — то согласитесь с редким упоминанием Холмса в середине, практически двухполярным распределением вхождений Мортимера и возникшим под конец рассказа пересечением упоминаний о Бэрриморе, Сэлдене и собаке Баскервилей.
Диаграммы распределения имеют и более практическое применение. Например, как автор технической литературы, я должен давать определение новому термину при его первичном появлении в книге. Звучит это просто, но иногда главы пишутся не по порядку, и подобные нюансы проскакивают незамеченными. Диаграмма распределения, построенная для списка технических терминов, если их много, может существенно упростить поиск места их первого упоминания.
1Эта книга не издавалась на русском языке, но можно порекомендовать другие издания, имеющие высокий рейтинг: Бенгфорт Б., Ребекка Билбро Р., Тони Охеда Т. «Прикладной анализ текстовых данных на Python. Машинное обучение и создание приложений обработки естественного языка» или Хобсон Л., Ханнес Х., Коул Х. «Обработка естественного языка в действии», обе — издательство «Питер». — Примеч. ред.
Практический проект: тепловая карта пунктуации 83
Д а а а а
Х
Ва
М
Г
Б
С
С
С а а
С а
Рис. 2.7. График распределения упоминания главных персонажей в книге «Собака Баскервилей»
Или вот другой вариант. Представьте, что вы — аналитик данных и работаете с ассистентами адвоката по уголовному делу, связанному с торговлей внутренней информацией компании. Для выяснения, говорил ли обвиняемый с конкретным членом правления как раз перед совершением незаконной продажи, вы можете загрузить истребованные электронные письма обвиняемого в виде непрерывной строки и сгенерировать диаграмму распределения. Если имя члена правления появится в ожидаемом месте, то дело можно считать решенным!
Для этого практического проекта напишите на Python программу, воссоздающую диаграмму распределения с рис. 2.7. Если у вас возникнут проблемы с загрузкой корпуса hound.txt, обратитесь еще раз к обсуждению Юникода на с. 66. Решение под названием practice_hound_dispersion.py вы найдете в приложении к книге или онлайн.
Практический проект: тепловая карта пунктуации
Тепловая карта — это диаграмма, в которой значения данных представляются с помощью цвета. Тепловые карты используются для визуализации особенностей авторской пунктуации (https://www.fastcompany.com/3057101/the-surprising- punctuation-habits-of-famous-authors-visualized/) и могут оказаться полезными при установлении авторства «Затерянного мира».
84 Глава 2. Установление авторства с помощью стилометрии
Напишите программу Python, токенизирующую три рассмотренные в этой главе книги на основе только пунктуации. Далее сосредоточьтесь исключительно на использовании точек с запятой. Для каждого автора составьте тепловую карту, отображающую точки с запятыми синим, а все остальные знаки препинания — желтым или красным. На рис. 2.8 показаны примеры тепловых карт для «Войны миров» Уэллса и «Собаки Баскервилей» Дойла.
Рис. 2.8. Тепловая карта использования точек с запятой (темные квадраты) Уэллсом (слева) и Дойлом (справа)
Сравните эти три тепловые карты. За чьим авторством, согласно результатам, был написан роман «Затерянный мир» — Дойла или Уэллса?
Решение под названием practice_heatmap_semicolon.py вы найдете в приложении к книге или онлайн.
Усложняем проект: фиксирование частотности
Как уже ранее отмечалось, частотность в NLP означает количество, но также может быть выражена в виде числа вхождений за единицу времени. Еще она выражается как соотношение или процент.
Определите новый вариант метода nltk.FreqDist(), который вместо количеств будет использовать проценты, и задействуйте его для формирования графиков в программе stylometry.py. За помощью можете обратиться к блогу Clearly Erroneous на https://martinapugliese.github.io/tech/plotting-the-actual-frequencies-in- a-FreqDist-in-nltk/.