Следите за кодом, используемым в этой серии, здесь: GitHub

Введение

Вам только что пришло письмо от Palantir; они хотят назначить первое собеседование с вами завтра. Вы усердно оттачивали свои практические навыки работы с данными, включая манипулирование структурами данных с помощью NumPy и Pandas, а также некоторое машинное обучение с SKLearn и Keras. Предполагая, что вы прошли техническую часть собеседования, вы уверены в своих силах. Но что, если личный раздел окажется сложнее, чем вы ожидали?

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

Используя комбинацию распознавания именованных объектов, теории сетей и суммирования текста, этот пост научит вас, как это сделать.

Обзор

Часть 1: Распознавание именованных объектов (NER)

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

Часть 2: Анализ сети персонажей

С помощью библиотеки networkx мы сопоставим наш окончательный список персонажей из Части 1 с корпусом предложений, составленным из Братства Кольца, чтобы измерить центральность каждого персонажа. Это поможет нам ответить на такие вопросы, как Кто главные герои? и кто с кем связан? Ответы на эти вопросы обеспечат контекст для 5-минутного текстового резюме, которое мы создадим в Части 3.

Часть 3: Резюме извлеченного текста

Существует два основных метода обобщения текста с использованием науки о данных. Первый и самый простой способ — это извлекающееобобщение текста, при котором компонент или предложение из основной части текста выбираются как представляющие основную мысль. Часто это делается путем сравнения схожести предложений, для чего мы будем использовать алгоритм PageRank от networkx.

Другой метод — это абстрактноеобобщение текста, при котором создается новый текст для обобщения оригинала. Абстрактный метод больше всего напоминает то, как люди резюмируют текст, но в погоне за простотой и лаконичностью (а также во избежание искажения текста Толкина) он будет зарезервирован для будущей статьи.

Вооружившись обоснованной точкой зрения, окрашенной нашей обученной моделью NER и сетевым анализом, мы воспользуемся извлеченным резюме, чтобы построить фундаментальное понимание Властелина колец: Братство кольца.

Часть 1: Распознавание именованных объектов

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

Но мы забегаем вперед. Начнем с запуска предварительно обученной модели SpaCy NER по умолчанию:

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

Приведенная выше функция run_spacy создает двумерный фрейм данных, содержащий распознанный текст («Гэндальф») и метку или тип сущности, назначенную ему модель («ЧЕЛОВЕК»). Если мы отфильтруем этот фрейм данных, чтобы показать только объекты PERSON, мы сможем приблизиться к точности модели при распознавании символов:

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

Чтобы подогнать модель SpaCy к этому корпусу фантастических имен, нам нужно снабдить ее несколькими примерами. Из аккаунта GitHub другого самопровозглашенного фаната LOTR мы можем получить полный список персонажей Средиземья, который содержит персонажей из всех трех книг! Этот список ничего не говорит нам о важности персонажей (или о том, какие из них встречаются в Братстве Кольца), но дает нам способ выбора предложений для тренировки.

Согласно документации SpaCy данные для обучения должны предоставляться в виде:

(Предложение, [(Начало индекса, Конец индекса, Метка)]), что мы можем сделать с парой хороших (и эффективных по времени!) списков.

Вы можете заметить, что столбец, выбранный из фрейма данных «full_characters», назван «первым». Это связано с тем, что в книге персонажи редко упоминаются по их полным именам (имени и фамилии), поэтому поиск только по первому обеспечит набор предложений для использования в качестве обучающих данных. Вот пример одного из них:

Теперь мы готовы определить функцию для обучения модели:

Новая пустая модель нейронной сети NER инициализируется английским словарем, затем к модели добавляется труба или набор слоев NER перед повторением каждой обучающей выборки, чтобы минимизировать функцию потерь журнала с несколькими метками. Стохастический градиентный спуск используется в качестве функции оптимизации, поскольку он позволяет обновлять веса нейронов в правильном направлении (в сторону локального минимума функции стоимости) после неверного прогноза метки/сущности. Чтобы узнать больше о стохастическом градиентном спуске, вот хороший ресурс.

Наконец, давайте взглянем на предсказанный список символов обученной модели:

Несмотря на то, что все еще существует довольно много ложноположительных персонажей (например, Смертный, Лэндс) и имя одного основного персонажа нужно было заменить его прозвищем (Сэмвайз → Сэм), модель NER обученного персонажа дала список с большей точностью.

Но то, что наша модель дает более точный список символов, не означает, что мы знаем, на какие из них следует обратить внимание. Неужели все 200 символов не могут быть одинаково важны? Продолжение следует в Часть 2 этой серии: Анализ сети персонажей.