- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему 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. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
58 Глава 2. Установление авторства с помощью стилометрии
слов, например в постах в социальных сетях. Стилометрия даже годится для обнаружения признаков депрессии и суицидальных наклонностей.
В этой главе мы с вами при помощи техник стилометрии определим, кто является автором романа «Затерянный мир» — Артур Конан Дойл или Г. Д. Уэллс.
Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
Сэр Артур Конан Дойл (1859 — 1930) больше всего известен историями о Шерлоке Холмсе, которые считаются эталоном в детективном жанре. Г. Д. Уэллс (1866 — 1946) прославился несколькими новаторскими научно-фантастиче- скими романами — «Война миров», «Машина времени», «Человек-невидимка» и «Остров доктора Моро».
В 1912 году Strand Magazine опубликовал «Затерянный мир», серийную версию научно-фантастического романа. Это история экспедиции в бассейн Амазонки под предводительством профессора зоологии Джорджа Эдварда Челленджера, который утверждал, что там водятся динозавры. Собственно, их он там и обнаружил, а также племя злобных обезьяноподобных существ.
Несмотря на то что в реальности автор романа хорошо известен, давайте предположим, что это не так, и наша задача — установить его личность. Эксперты сузили область поиска до двух имен, Дойл и Уэллс. Уэллс выглядит предпочтительнее, потому что «Затерянный мир» относится к жанру научной фантастики, который для этого автора характерен. При этом в книге также встречаются жестокие пещерные люди, напоминающие морлоков из его же романа «Машина времени» (1895). Дойл же, наоборот, известен своими детективными историями и исторической фантастикой.
ЗАДАЧА
Написать на Python программу, использующую стилометрию, чтобы определить, кто является автором романа «Затерянный мир» — Артур Конан Дойл или Г. Д. Уэллс.
Стратегия
Дисциплина обработка естественного языка (natural language processing, NLP)
занимается взаимодействиями между точным и структурированным языком
Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир» 59
компьютеров и специфичным, зачастую неоднозначным «естественным» языком, используемым людьми. NLP применяется для машинного перевода, определения спама, понимания поисковых запросов, а также предиктивного распознавания текста для пользователей сотовых телефонов.
Наиболее типичными тестами NLP на авторство анализируются следующие особенности текста.
Длина слов. График распределения частотности длин слов в документе.
Стоп-слова. График распределения частотности стоп-слов (короткие, внеконтекстные функциональные слова вроде the, but, if).
Части речи. График распределения частотности слов на основе их синтаксической роли (существительные, местоимения, глаголы, обстоятельства, определения и пр.).
Наиболее распространенные слова. Сравнение наиболее часто встречающихся в тексте слов.
Коэффициент Жаккара. Статистика, используемая для оценки сходства и разнообразия выборки.
Если стили письма Дойла и Уэллса отличаются, тогда этих пяти тестов будет достаточно, чтобы выявить их различие. Более подробно о каждом из тестов мы поговорим, когда будем писать код.
Чтобы охватить и проанализировать стиль автора, потребуется образец корпуса, иначе говоря — тела текста. Для определения стиля Дойла мы используем известный роман о Шерлоке Холмсе «Собака Баскервилей», опубликованный в 1902 году. Для Уэллса же возьмем книгу «Война миров», выпущенную в 1898 году. Каждый из этих романов содержит более 50 000 слов, чего вполне хватит для репрезентативной статистической выборки. После этого мы сравним выборку каждого автора с произведением «Затерянный мир», чтобы определить, какой стиль для него ближе.
Сам процесс стилометрии будем выполнять с помощью Natural Language Toolkit (NLTK), популярного набора программ и библиотек для работы с данными на естественном языке в Python. Он бесплатный и работает в Windows, macOS, а также Linux. NLTK был разработан в 2001 году в рамках курса компьютерной лингвистики в Университете Пенсильвании и далее развивался усилиями десятков добровольных участников. Более подробно можете узнать об этом проекте на сайте http://www.nltk.org/.
60 Глава 2. Установление авторства с помощью стилометрии
Установка NLTK
Инструкции по установке вы найдете на сайте http://www.nltk.org/install.html. В случае с Windows откройте PowerShell и установите пакет с помощью Preferred Installer Program (pip).
python -m pip install nltk
Если у вас установлено несколько версий Python, необходимо указать версию. Вот команда для Python 3.7:
py -3.7 -m pip install nltk
Чтобы убедиться в успешности установки, откройте интерактивную оболочку Python и введите:
>>> import nltk
>>>
Если ошибок не возникнет, то все в порядке. В противном случае следуйте инструкциям по установке на http://www.nltk.org/install.html.
Скачивание токенизатора
Для выполнения стилометрических тестов потребуется разбивать тексты — их корпусы — на отдельные слова, называемые токенами. На момент написания книги метод word_tokenize() в NLTK неявно вызывает sent_tokenize(), используемую для фрагментирования корпуса на отдельные предложения. Для обработки sent_tokenize() вам потребуется Punkt Tokenizer Models. Несмотря на то что это часть NLTK, нужно скачать и установить ее отдельно с помощью удобного NLTK Downloader. Для его запуска введите в оболочке Python:
>>>import nltk
>>>nltk.download()
Должно открыться окно NLTK Downloader (рис. 2.1). Перейдите во вкладку Models либо All Packages вверху; затем щелкните punkt в столбце Identifier. Прокрутите окно вниз и установите Download Directory для вашей платформы (см. http://www.nltk.org/data.html). В завершение щелкните на кнопке Download
для скачивания Punkt Tokenizer Models.
Заметьте, что пакеты NLTK можно также скачать напрямую из оболочки. Вот пример:
>>>import nltk
>>>nltk.download('punkt')
Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир» 61
Рис. 2.1. Скачивание Punkt Tokenizer Models
Вам также потребуется обращаться к Stopwords Corpus, который можно скачать тем же способом.
Скачивание Stopwords Corpus
Перейдите во вкладку Corpora в окне NLTK Downloader и скачайте Stopwords Corpus, как показано на рис. 2.2.
Вкачестве альтернативы можно использовать оболочку.
>>>import nltk
>>>nltk.download('stopwords')
Давайте скачаем еще один пакет, который поможет анализировать части речи — существительные и глаголы. В окне NLTK Downloader перейдите во вкладку All Packages и скачайте Averaged Perceptron Tagger.
Чтобы сделать это с помощью оболочки, введите:
>>>import nltk
>>>nltk.download('averaged_perceptron_tagger')