Тематическое исследование с глубоким погружением

Я Грег Рафферти, специалист по обработке данных из района Залива. Вы можете посмотреть код этого проекта на моем гитхабе. Не стесняйтесь обращаться ко мне с любыми вопросами!

В этой серии публикаций я рассмотрю несколько удобных техник НЛП через призму Гарри Поттера. В моем предыдущем посте из этой серии, посвященном основам НЛП, я рассматривал Тематическое моделирование со скрытым распределением Дирихле, а следующий пост будет посвящен резюмированию текста.

На протяжении всего этого проекта НЛП я использовал в качестве корпуса текстов собрание из семи книг о Гарри Поттере. Но прежде чем я смог отправить эти книги с помощью своих алгоритмов, мне сначала пришлось сохранить PDF-файлы в виде файлов txt, а затем извлечь главы как отдельные документы. Для этого я использовал регулярные выражения. Чтобы получить хорошее представление о регулярных выражениях в Python, посетите Быстрый курс Google.

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

pattern = r"((?:[A-Z-][ ]){9,}[A-Z])\s+([A-Z \n',.-]+)\b(?![A-Z]+(?=\.))\b(?![a-z']|[A-Z.])(.*?)(?=(?:[A-Z][ ]){9,}|This book)"

При применении с re.findall к книге Гарри Поттера, сохраненной в виде текстового файла, на выходе получается список кортежей из трех элементов. Каждый кортеж в списке соответствует главе в книге, принимает форму (‘C H A P T E R O N E’, ‘THE BOY WHO LIVED’, ‘Mr. and Mrs. Dursley, of number four, Privet Drive, blah, blah, blah...’) и содержит текст всей главы. Нам нужно извлечь это из этого:

C H A P T E R O N E

МАЛЬЧИК, КОТОРЫЙ ЖИЛ

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

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

Группа №1 - это часть: ((?:[A-Z-][ ]){9,}[A-Z]). Это первое поле слева на схеме выше. Внешняя скобка указывает python фиксировать то, что находится внутри, как группу 1 (в конечном итоге это будет 'C H A P T E R O N E'). Внутренние круглые скобки представляют собой группу подшаблона, а ?: указывает python не захватывать его как вторую группу. Подшаблон ([A-Z][ ]){9,}[A-Z] означает любую заглавную букву, за которой следует пробел, повторяемую 9 или более раз и заканчивающуюся последней заглавной буквой. Так фиксируются номера глав.

За ним следует \s+, который не в скобках, поэтому не фиксируется и указывает python искать пробелы (разрывы строк, табуляции, пробелы и т. Д.) Один или несколько раз. По сути, это переходит к заголовку главы, захваченному в Группе № 2, со следующим набором круглых скобок: ([A-Z]\n',.-]+). Это снова означает любую заглавную букву и / или разрыв строки (\n), апостроф, запятую, точку и тире один или несколько раз. Некоторые заголовки глав имеют разрывы строк или другие знаки препинания, например:

Узник Азкабана, Глава 18: ЛУНА, ЧЕРТОВНИК, ПАДФА И ЩЕБНИЦЫ

Кубок огня, Глава 21: ФРОНТ ОСВОБОЖДЕНИЯ ДОМАШНИХ ЭЛЬФОВ

Орден Феникса, Глава 8: ЖЕНЩИНЫ МИССИС. УИЗЛИ

Однако здесь есть одна проблема: четвертая глава книги 1 начинается с

БУМ. Они снова постучали ...

Итак, ища все заглавные буквы, это «БУМ». будет записан как часть названия. Нам нужно использовать так называемый отрицательный прогноз, объявленный с помощью ?!: /b(?![A-Z]+(?=\.))/b. Знаки \b обозначают границы слов. Таким образом, строка захвата заголовка главы, приведенная выше, захватывает все буквы ВЕРХНИМ РЕГИСТРАТОМ , если следующее слово также полностью ВЕРХНИЙ, но сразу за ним следует точка, объявленная с положительным взглядом вперед ?=. Большой! Теперь мы можем найти этот «БУМ». и исключить его из нашего захвата. Но здесь возникает другая проблема. Одна из глав, о которых я упоминал в предыдущем абзаце, «ВОУС МИССИС. WEASLEY », также содержит слово, за которым следует точка, поэтому теперь мы будем записывать только название главы как« THE WOES OF ». Нам нужен другой отрицательный просмотр вперед, (?![a-z']|[A-Z.]), чтобы убедиться, что все слова в верхнем регистре, за которыми следует точка, также не сопровождаются словами в нижнем регистре (текст главы) или не являются последними слово в строке ЗАПИСИ (потому что, хотя название главы может содержать точку, оно никогда не заканчивается на ней).

Группа №3 самая простая: (.*?). Это означает захват любого персонажа, любое количество раз, и проявлять к этому жадность. Продолжайте, пока не остановитесь, переходя к следующей части.

Последняя часть регулярного выражения сообщает python, в какой момент прекратить захват текста: (?=(?:[A-Z][ ]){9,}|This book \n). Это еще один незанятый просмотр вперед. Он предоставляет инструкции по прекращению захвата текста после того, как последовательность заглавных букв и пробелов повторяется не менее 9 раз (потому что с этого начинается следующая глава, «C H A P T E R T W O»), или до тех пор, пока не появится строка This book \n. Эта последняя строка отмечает конец книги; каждая из семи книг о Гарри Поттере заканчивается таким текстом:

Эта книга
была создана
Дэвидом Сэйлором, а дизайн - Бекки
Терхьюн. Обложка и пиджака, и интерьера была
создана пастелью на тонированной бумаге для гравюры. Текст был
набран 12 кеглем Adobe Garamond, шрифтом, основанным на шрифтах Клода Гарамонда шестнадцатого
века, перерисованных Робертом
Слимбахом в 1989 году. Книга была напечатана и переплетена < br /> в RR Donnelley & Sons, Уиллард, штат Огайо.
Производством руководила
Анджела Биола.

Уф! Надеюсь, все это имело смысл! Я настоятельно рекомендую вам посетить эту ссылку, чтобы увидеть все это в действии с еще более подробными сведениями и поэтапным описанием того, что все происходит.