Седьмая и последняя книга из серии о Гарри Поттере, Гарри Поттер и Дары смерти, была опубликована в июле 2007 года и была продана 11 миллионов копий по всему миру в течение 24 часов. Это делает ее самой продаваемой книгой в истории. Я был одним из тех преданных фанатов, которые стояли в очереди в полночь, чтобы достать книгу. Я прочитал всю книгу за один присест сразу после того, как вернулся домой. Это было так хорошо.

Мой первый проект на Python - анализ текста из серии о Гарри Поттере. Я знаком с данными, которые в научном мире называются предметными знаниями. Надеюсь, это повысит точность анализа.

Вот мой код.

Цели этого проекта:

  1. Укрепите основы Python, которые я изучил за последние несколько недель, написав простой, легко читаемый код.
  2. Используйте как можно меньше библиотек (чтобы научиться делать что-то сложным)
  3. Включите хранилище Amazon, один внешний API для извлечения данных и библиотеку визуализации
  4. Откройте для себя некоторые интересные идеи, которые, возможно, еще никто в мире не осознавал о сериале о Гарри Поттере.

Я намеренно не использовал Python Natural Language Toolkit (NLTK), потому что хотел научиться писать код Python с нуля, а не полностью полагаться на то, что уже было написано другими. Я, вероятно, вернусь к этому проекту и в будущем проведу более сложный анализ с использованием сторонних библиотек.

Вот названия каждой книги о Гарри Поттере, год, когда она была выпущена в США, ее размер и то, как я ее называю:

  • Гарри Поттер и философский камень - 1998 г. / 0,4 МБ (HP 1)
  • Гарри Поттер и Тайная комната - 1999 г. / 0,5 МБ (HP 2)
  • Гарри Поттер и узник Азкабана - 1999 г. / 0,7 МБ (HP 3)
  • Гарри Поттер и Кубок огня - 2000 / 1,2 МБ (HP 4)
  • Гарри Поттер и Орден Феникса - 2003 г. / 1,6 МБ (HP 5)
  • Гарри Поттер и принц-полукровка - 2005/1 МБ (HP 6)
  • Гарри Поттер и Дары смерти - 2007 г. / 1,2 МБ (HP 7)

Получить данные в записную книжку

Во-первых, я делаю 7 файлов HP доступными из записной книжки Databricks, которая является моей средой программирования. Итак, я копирую 7 файлов в хранилище Amazon S3 и использую кластер Spark для загрузки файлов с S3 в локальную файловую систему моего кластера. Оттуда я могу написать обычный код ввода-вывода Python для чтения файлов с локального диска.

Мешок слов

Для этого анализа я использую подход «мешок слов», когда текст каждой книги представлен в виде мешка со словами из этой конкретной книги. Например, если в HP 1 всего 75 000 слов, то его набор слов содержит 75 000 слов, разделенных запятыми. Подразумевается, что каждое слово анализируется индивидуально, без учета порядка слов или грамматики.

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

Чтобы преобразовать данные в пакет слов, мой код:

  • удаляет символы конца строки (/ n) из текста
  • разбивает текст на пробелы, чтобы разбить его на слова
  • нижний регистр весь текст
  • удаляет все знаки препинания

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

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

Как видите, большинство популярных слов, таких как , of и to, являются пустыми словами, не добавляющими особого контекста. Это так называемые стоп-слова. В обработке естественного языка (NLP) обычно удаляются стоп-слова. Вот список английских стоп-слов, которые я удаляю для части анализа.

Вот пересмотренная частота самых популярных слов без стоп-слов, что дает немного лучшее понимание того, какие слова на самом деле важны:

Некоторые библиотеки НЛП используют основание, которое преобразует каждое слово в его «основу». Например, работает, работает и runner будет изменено на run, поскольку это одно и то же базовое слово. Это уменьшает количество слов в пакете слов и может быть более точным для анализа. Я, вероятно, осуществлю стемминг, когда вернусь к этому коду.

Количество слов

Ниже приведено общее и уникальное количество слов для каждой книги.

Общее количество слов увеличивается с HP 1 до HP 5 (HP 5 - самая большая книга), падает при HP 6 и немного увеличивается для HP 7.

Количество уникальных слов также увеличивается с серией. В HP 1 5687 уникальных слов по сравнению с 12624 уникальными словами в HP 5, поэтому письмо более сложное, или J.K. Роулинг знакомит читателей с новыми словами (например, именами персонажей, новыми локациями, заклинаниями и т. Д.).

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

  1. Первая книга может быть самой короткой, потому что J.K. Когда книга была опубликована, Роулинг не была проверенным автором. Возможно, было бы труднее заставить издательство прочитать ее рукопись, если бы она была длиннее.
  2. Сериал о Гарри Поттере предназначен для молодой взрослой аудитории, и средний возраст аудитории рос с каждой книгой. Для справки, я прочитал первую книгу в четвертом классе, так что мне было восемь лет. Я прочитал седьмую книгу в шестнадцать лет. В восемь лет у меня было меньше шансов прочитать большую книгу с более чем четвертью миллиона слов, как в двенадцать, когда были опубликованы Гарри Поттер и Орден Феникса.
  3. По мере развития сериала сюжет сгущается. Может быть, все эти лишние слова необходимы для самого феерического рассказа.
  4. После первых двух книг появилось множество преданных поклонников и спрос на следующую книгу в серии. По мере продолжения сериала количество фанатов только увеличивалось. Когда-то возник реальный спрос на новые книги, возможно, J.K. У Роулинг было больше контроля и гибкости в своей работе. Кстати, J.K. Роулинг стала первым автором, который стал миллиардером, написав книги!

Пунктуационный анализ

Читатели часто упускают из виду знаки препинания в тексте, но я подумал, что будет интересно посмотреть на знаки препинания в моих данных. Сколько отметок в каждой книге? Как насчет восклицательных знаков? Вопросительные знаки? Увеличивается ли длина предложения по мере развития сериала?

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

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

В английском языке есть четыре типа предложений:

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

J.K. Длина предложения Роулинг остается неизменной на протяжении всего сериала. Однако, как вы можете видеть в таблицах количества слов и анализа пунктуации выше, в HP 5 в целом больше предложений.

Анализ настроений

Анализ настроений (или анализ мнений) использует НЛП, чтобы определить, является ли текст положительным, отрицательным или нейтральным. Это используется для бинарных решений, таких как хорошее или плохое, нравится или не нравится. Примеры использования: Yelp анализирует, есть ли у ресторана хорошие или плохие отзывы, или маркетинговый отдел анализирует твиты, чтобы понять мнение потребителей о запуске нового продукта.

Анализ настроений в моем коде слишком упрощен, что создает некоторую ошибку. Обдумайте это предложение.

Фильм не получился ни смешным, ни супер-остроумным.

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

Одним из примеров такого чрезмерного упрощения в моем коде является слово просто, которое является наиболее часто встречающимся положительным словом в каждой книге HP. Есть несколько определений просто, и некоторые из них положительны - 1. основанные на том, что является морально правильным и справедливым, или поведение в соответствии с ним, и 2. точно. Однако есть альтернативные определения just, которые не являются положительными, но мой код не может это понять и просто считает каждый экземпляр just как положительный.

Другая возможная проблема - отсутствие взвешенных слов как более позитивных или более негативных. Таким образом, слова ужасный и странный одинаково негативны, хотя ужасный имеет гораздо более сильный негативный оттенок.

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

Обратите внимание на ось Y выше для количества слов. HP 5 и HP 7 кажутся более темными книгами, чем HP 1 или HP 2.

Если посмотреть на слова в целом, то здесь очень мало положительных или отрицательных слов. В среднем только около 2,9% слов являются положительными, 3,3% - отрицательными, а остальные - нейтральными. Вероятно, это так мало, потому что в моем списке положительных и отрицательных слов нет никаких специфических для Гарри Поттера положительных и отрицательных слов. Если бы только был способ программно определить, является ли слово положительным или отрицательным, на основе окружающего текста…. хм, звучит как интересный проект на будущее.

N-граммы

N-грамма - это непрерывная последовательность N слов в данном тексте. N-граммы размера N = 1 называются униграммами, N = 2 - биграммами, N = 3 триграммами, а все, что больше, обозначается значением N, поэтому четыре -граммы, пятиграммы и т. д.

Вот первое предложение в Гарри Поттер и узник Азкабана.

Гарри Поттер был очень необычным мальчиком во многих отношениях.

Если N = 2, вот биграммы:

Если N = 3, вот триграммы:

Количество N-граммов для любого предложения можно рассчитать с помощью уравнения, приведенного ниже.

Вот несколько диаграмм N-граммов для этой серии.

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

Эта таблица показывает, что Хогвартс упоминается чаще, чем другие волшебные места. Интересно видеть, как Министерство магии становится важным в середине сериала. Я был удивлен, увидев его снижение частоты для HP 6 и HP 7, но я думаю, это потому, что его начали называть просто «Министерством», а не его полным названием.

В этой таблице сравниваются курсы, преподаваемые в Школе чародейства и волшебства Хогвартс. Защита от тьмы Искусство и зелья кажутся наиболее важными. Пятиграммовая защита от темных искусств достигает пика по частоте во время ХП 5. Вероятно, это связано с битвой Гарри и Амбридж в этой книге. В HP 6 курс зельеварения является самым важным, так как Гарри преуспевает после того, как нашел учебник Принца-полукровки. Все курсы упали почти до нуля для HP 7, поскольку Гарри не ходит в Хогвартс в этом году.

Анализ взаимоотношений персонажей

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

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

Анализ отношений персонажей был довольно сложным для понимания. Я применил несколько разных подходов и застрял, прежде чем наконец нашел решение, которое я реализовал. Вот несколько идей, с которыми я экспериментировал:

  • Подход 1. Поместите каждое имя каждого символа в список в том порядке, в котором оно отображается в тексте, и выполните вычисление среднего расстояния, чтобы определить количество людей между двумя символами. Однако при этом не учитывается, сколько других слов, не являющихся именами символов, находится между именами персонажей, поэтому, если это число велико, символы не совсем близки, и код предполагает, что они есть.
  • Подход 2. Разбейте мой текст на набор абзацев и определите, какие символы часто встречаются вместе в одних и тех же абзацах. Когда я написал и протестировал этот код, он не выглядел очень точным. Я думаю, это связано с тем, что длина абзаца сильно различается, и иногда абзац может быть просто ответом в одну строку в разговоре.

Я изначально предполагал, что анализ персонажей - это равные отношения между двумя персонажами. После долгих размышлений об этом и взлома кода, который я написал для описанных выше подходов, я понял, что сила отношений двусторонняя. Так что отношения Гарри Поттера с Сириусом Блэком могут отличаться от отношений Сириуса Блэка с Гарри Поттером.

В конце концов, я решил, что лучший подход - сначала выбрать персонажа точки обзора и целевого персонажа (персонажа, отношения которого с персонажем точки обзора мы анализируем). Давайте выберем Гарри Поттера в качестве персонажа точки обзора и Сириуса Блэка в качестве целевого персонажа. Затем я фиксирую каждый случай, когда «Сириус» появляется в пределах 40 слов до и 40 слов после каждого слова «Гарри», и сравниваю это число с общим количеством раз, когда «Гарри» встречается в тексте. Это предполагает, что у персонажей есть отношения (положительный или отрицательный - другой вопрос), потому что они либо физически близки в это время, либо один упоминает другого в разговоре.

Выходные данные показывают, что в первых двух книгах между Гарри и Сириусом не было никаких отношений. Поскольку Сириус был представлен как персонаж только в третьей книге, это имеет смысл. 8,88% от Гарри до Сириуса в HP 3 можно прочитать как «когда появляется слово Гарри, если вы посмотрите 40 слов влево и 40 слов вправо, в 8,88% случаев появляется Сириус». Точно так же отношения Сириуса и Гарри в HP 3 можно описать как «69,17% времени, когда Сириус появляется, Гарри появляется в пределах 40 слов». Я предполагаю, что если имена появляются в пределах 40 слов друг от друга, они вместе или говорят друг о друге (следовательно, их отношения улучшаются).

Отношение Гарри к Сириусу снижается до 7,37% в HP 4. Вероятно, это связано с тем, что Сириус тратит большую часть HP 4 в укрытии и не часто видит Гарри (или кого-либо). Их общение в основном происходит через периодические сообщения о совах. В HP 5 их отношения становятся сильнее, вероятно, из-за времени, проведенного вместе в штаб-квартире Ордена Феникса в начале книги. К сожалению, после трагической смерти Сириуса в конце HP 5 оценка отношений Гарри с Сириусом снижается примерно до 2% до конца серии. Он не опускается до 0%, потому что Гарри все еще говорит о Сириусе другим, проводит время в доме Сириуса и оплакивает смерть Сириуса.

В каждых отношениях, которые я анализирую, оценка отношения другого персонажа к Гарри намного выше, чем оценка отношения Гарри к ним. Поскольку Гарри - главный герой, и большая часть истории происходит из повествования Гарри, это имеет смысл. Имя Гарри встречается значительно чаще, чем любое другое имя в сериале. Таким образом, даже после смерти Сириуса, когда имя Сириуса появляется в тексте, это примерно в 80% случаев, когда речь идет о Гарри.

Ниже представлена ​​диаграмма, показывающая общий балл Гарри в отношениях с другими главными персонажами. Размер кружков соответствует количеству раз, когда это имя появляется в 7 книгах, а толщина линии представляет собой оценку отношений.

Похоже, что Гарри ближе всего к Гермионе и Рону, что верно.

Есть несколько крайних случаев, которые мой код не учитывает. Например, предположим, что имя Гарри появляется в самом конце главы, а следующая глава - это совершенно другое место или время, но имя Сириуса появляется в первых 40 словах этой следующей главы. Мой анализ по-прежнему предполагает, что они либо вместе, либо говорят друг о друге, хотя это может быть не так. Тем не менее, я думаю, что частота ошибок здесь достаточно низкая, чтобы быть приемлемой.

Кроме того, мой код ищет только одно имя на символ, поэтому Сириус Блэк упоминается в коде только Сириусом, хотя в тексте он иногда может упоминаться только по фамилии. В будущем я обновлю свой код, чтобы разрешить использование псевдонимов и нескольких имен для персонажей. Прямо сейчас я выбрал то имя, на которое, по моему мнению, персонажа ссылаются чаще всего в тексте (например: Дамблдор для Альбуса Дамблдора).

Вот некоторые из оценок отношений:

У вас еще недостаточно знаний о Гарри Поттере? Затем следите за моим блогом, пока я исследую вселенную Гарри Поттера в различных проектах!