Обработка естественного языка, Программирование

Анализ поэзии в Python

Можем ли мы лучше понять Шекспира с помощью кода?

Насколько легко написать стихотворение? Добавьте несколько слов на страницу, заставьте их рифмовать, и у вас есть стихотворение. Некоторые поэты, вероятно, вздрагивают сразу после прочтения этого предложения. Может быть, вы решили следовать хорошо известной форме поэзии, такой как хайку, лимерики и сонеты - это, безусловно, сделает ваши слова похожими на стихотворение. Иногда бывает трудно понять, соответствует ли ваше стихотворение форме. Вот где вам пригодятся ваши навыки программирования!

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

Наши требования: что такое сонет?

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

Какие аспекты стихотворения говорят нам, что это сонет? Мы можем выделить некоторые из них ниже:

  • 14 строк
  • Схема рифмы ABAB CDCD EFEF GG
  • Ямбический пентаметр

Схема рифмы ABAB CDCD EFEF GG означает, что первая строка [A] рифмуется с третьей строкой [A]. Вторая строка [B] рифмуется с четвертой строкой [B]. Пятая строка [C] рифмуется с седьмой строкой [C]. Так продолжается до тех пор, пока мы не дойдем до последних двух строк [G], которые рифмуются вместе.

Ямбический пентаметр - более сложный термин, но он относится к тому, как мы подчеркиваем разные слова в английском языке. Ямбический означает, что первый слог (ступня) не ударен, а второй слог - ударен. В британском английском акценте слово, которое следует этому правилу, называется «принадлежать», потому что ударение ставится на второй слог.

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

Один из самых известных сонетов известен как Сонет 18 Уильяма Шекспира.

Могу я сравнить тебя с летним днем?

Ты милее и умереннее:

Буйные ветры сотрясают любимые майские бутоны,

И у летней аренды слишком короткий срок;

Когда-то слишком жарко светит око небес,

И часто его золотой цвет лица тускнеет;

И каждая ярмарка от ярмарки иногда снижается,

Случайно или необузданное изменение курса природы;

Но твое вечное лето не угаснет,

Не теряй владения той прекрасной, которой ты являешься;

И смерть не хвастается, что ты блуждаешь в его тени,

Когда в вечных линиях времени ты растешь:

Пока люди могут дышать или видеть глаза,

Так долго живет это, и это дает тебе жизнь.

Теперь, когда мы знаем наши требования, мы можем начать писать наш код.

Проверить количество строк

Наше первое требование - в стихотворении должно быть 14 строк. Это будет самый простой и самый короткий код, который мы напишем в этой статье. В строках Python новая строка представлена ​​специальным символом «\ n». Где бы это ни происходило, у нас появляется новая строка.

Один из этих специальных символов означает две строки, два специальных символа означает три строки и так далее. Таким образом, мы знаем, что 13 из этих специальных символов соответствуют 14 строкам в нашем стихотворении. Мы можем сделать простой подсчет для этого специального символа.

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

Проверить рифмы

Наше следующее требование - чтобы наше стихотворение соответствовало следующей схеме рифм: ABAB CDCD EFEF GG. Есть несколько способов решить эту проблему. Вы можете заметить, что существует семь разных пар рифмующихся строк. Поэтому нашим первым шагом будет проверка, рифмуются ли две строки.

Определить рифму напрямую с английскими словами невозможно из-за необычной природы языка. Вместо этого мы должны преобразовать наше стихотворение в текст, отражающий то, как оно произносится. Международный фонетический алфавит (IPA) - это один из способов показать, как произносится текст, поэтому мы преобразуем наш текст в IPA. К счастью, есть пакет Python под названием eng_to_ipa, который может выполнить этот перевод за нас.

Когда мы преобразовали наши строки в IPA, мы можем проверить, рифмуются ли последние два слова. Чтобы сделать это проще, мы можем просто преобразовать последнее слово каждой строки и сравнить.

Большая часть этого кода должна иметь смысл. Единственная часть, которая может сбивать с толку, - это получение последней гласной. Мы делаем это, чтобы проверить рифму ассонанса, чрезвычайно распространенный тип рифмы в поэзии и лирике. Это отличается от обычных идеальных рифм, поскольку мы только смотрим, рифмуются ли гласные. Проверяя созвучие, мы можем проверить наличие большего количества рифмующихся слов, чем если бы мы делали это с идеальными рифмами.

Этот код проверяет, рифмуются ли две строки, поэтому теперь нам нужно проверить всю схему рифмы.

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

Есть ли случаи, когда наш метод не сработает? Да, и это важно признать. Если непонятное слово не найдено пакетом eng_to_ipa, тогда он не получит рифмующиеся гласные, поэтому мы не можем знать, рифмуется ли оно с другим словом. Это должно быть подходящим для нашей статьи, но важно помнить, если вы хотите протестировать свой код со многими старыми сонетами.

Проверить наличие ямбического пентаметра

Наше последнее требование - проверить пентаметр ямба. Если вы забыли, это означает, что наши строки состоят из десяти слогов с образцом безударного, безударного, ударного и т. Д.

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

Произношение - это интерфейс для словаря произношения CMU, ресурса, похожего на eng_to_ipa, который предоставляет такие данные, как произношение IPA. С помощью пакета произношения мы можем легко преобразовать текст в ударение; следующий код показывает нам, как это делается.

Образец ударения - это строка, представляющая ударение в слове, с числом, указывающим уровень напряжения. 1 - первичное напряжение, 2 - вторичное напряжение, а 0 - ненапряженное. И первичное, и вторичное напряжение будут считаться стрессом для определения пентаметра ямба, поэтому мы преобразуем все 2 в 1.

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

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

Завершить все проверки сонета сразу

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

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

Наш последний метод возвращает два значения. Первое - это логическое значение, определяющее, является ли наше стихотворение сонетом. Второе значение - это итоговая оценка в процентах.

Использование этого метода с Сонетом 18 Уильяма Шекспира дает результат 0,904, что едва превышает наш порог. Это все еще успех! Мы также должны учитывать, сколько лет этому сонету, и тот факт, что произношение изменится с тех пор, как его написал Шекспир. Более точные методы рифмы и ударения увеличили бы оценку еще больше.

Заключение

В этой статье мы написали код, который можно использовать для анализа поэзии, в частности сонетов. Для этого мы проверили количество строк, схему рифм и размер стихотворения. Для этого мы использовали два пакета Python, eng_to_ipa и pronouncing.

Мы протестировали наш код в Сонете 18 Уильяма Шекспира, и он был успешным. Было определено, что вероятность того, что Сонет 18 на самом деле сонет, составляет 90,4%.

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

Ресурсы