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

Дополнительную информацию см. в разделе мой репозиторий.

Часть 1. Бизнес-цель

Часть 2. Сбор данных

Часть 3. Обработка данных

Часть 4. Исследовательский анализ данных (вы здесь)

Часть 5. Построение модели (еще не опубликовано)

Часть 6. Развертывание модели (еще не опубликовано)

Приветствуем энтузиастов науки о данных и кино на Medium. Это четвертая часть моей серии из 6 частей, в которой мы используем НЛП и машинное обучение для создания модели классификации с несколькими метками для обозначения жанров киносценария.

Если вы еще не ознакомились с частями 1, 2 и 3 серии, где я обсуждаю, как использовать BeautifulSoup для извлечения сценариев фильмов и как использовать API базы данных фильмов для маркировки наших данных, то ссылки приведены выше.

Часть 4. Исследовательский анализ данных — использование термина «облачный пакет»

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

Каждый сценарий может иметь различную комбинацию каждого жанра.

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

Шаги, которые мы предпримем:

  1. Импортировать необходимые пакеты
  2. Загрузка данных
  3. Визуализация жанров
  4. Визуализация жанров с очисткой текста
  5. Визуализация жанров с очисткой и нормализацией текста
  6. Визуализация жанров с очисткой текста, нормализацией и оптимальным списком стоп-слов

Для этого исходного кода проверьте EDA_pt1 и EDA_pt2 в моем репозитории.

  1. Импорт необходимых пакетов

Класс TextPreprocessing можно скачать здесь. Однако в этой статье я напишу функции класса.

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

2. Загрузка данных

#loading in dataset
data = pd.read_csv("data/cleaned_data.csv", index_col=[0])

Эти данные были собраны и обработаны в предыдущих руководствах, поэтому сначала проверьте их, если хотите использовать тот же набор данных.

3. Визуализация жанров

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

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

Во-первых, давайте разделим наши жанры на разные фреймы данных.

#intializing empty dct to store dataframes
genre_df = {}
for genre in genre_lst:
   #creates a key and value of only that genre
   genre_df[genre] = data[data[genre] == 1]

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

Например, значением ключа комедии будет такой кадр данных pandas:

Теперь, чтобы использовать пакет wordcloud, мы сначала соединим весь комедийный текст в каждой строке и сохраним его в переменной.

comedy_text = " ".join(genre_df['Comedy']['text'])

Давайте визуализируем первые 1000 элементов нашей переменной строкового типа.

print(comedy_text[:1000])

Теперь давайте посмотрим на размер нашей переменной:

print(len(comedy_text))
84708731

Запустите этот код:

Выход:

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

4. Визуализация жанров с чистым текстом

Чтобы улучшить предыдущее облако слов, мы собираемся очистить наш текст.

Функция принимает один параметр — текст, который мы хотим очистить. Первая строка заменяет «\\r», «\\n» и «\\» пробелами, а затем разбивает текст для создания списка. Во второй строке используется пакет regex для замены всех специальных символов в любом слове в списке пробелами. Затем третья строка объединяет весь текст после проверки, не является ли элемент числом и превышает ли он 1 символ.

Чтобы увидеть разницу в очистке текста, давайте посмотрим на первые 1000 символов Knocked Up перед очисткой:

Теперь после чистки:

Есть большая разница, которая поможет производительности нашей модели в будущем.

Обратите внимание, что очистка текста не так систематична, как другие методы обработки данных. Это зависит от того, с каким набором данных вы работаете. Например, я бы не стал использовать эту же функцию для очистки текста твитов или постов в Facebook. Я бы изменил его, чтобы он работал с тем, как написаны эти твиты или сообщения.

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

Теперь для визуализации:

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

5. Визуализация жанров с очисткой и нормализацией текста

Нормализация текста — это процесс перевода слова из его флективного состояния в базовое. Это поможет нам сжать наш текст и лучше проиллюстрировать облако слов.

Примеры: Цветы (перегиб) – Цветок (основа), Бег (перегиб) – Бег (основа), Smarter (перегиб) – Умный (основание)

Чтобы узнать больше о словоизменении и основанных формах в английском языке, ознакомьтесь с этой статьей.

В НЛП и науке о данных для нормализации текста мы используем стемминг или лемматизацию.

Стемминг — это процесс приведения слов к их корневой форме. Например, если в нашем корпусе есть изменение, изменение и изменение, то все эти слова будут сокращены до изменение.

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

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

Написание всего текста в нижнем регистре — хорошая практика в НЛП. Это связано с тем, что Python не считает слова в разных регистрах одинаковыми. Например, Python считает, что «все» и «все» — это разные значения.

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

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

Wordcloud после нормализации текста:

Нет четкой разницы между облаком слов до лемматизации и после лемматизации. Однако, если вы посмотрите на облако второго слова, в центре будет СМОТРЕТЬ, а СМОТРЕТЬ справа. Теперь, если вы посмотрите на третье облако, в центре будет только СМОТРЕТЬ, а справа НЕТ СМОТРЕТЬ. Это потому, что наши усилия по лемматизации свели СМОТРЕТЬ к СМОТРЕНИЮ. В конечном итоге это обеспечивает более точный подсчет слов. Визуально это небольшая разница, но поверьте мне, она даст лучшие результаты, когда мы создадим функцию подсчета для нашей модели в следующем уроке.

6. Визуализация жанров с очисткой текста, нормализацией и оптимальным списком стоп-слов

Посмотрите на эти два графика:

Как видите, первые 15 слов по количеству слов в сценариях комедии и криминала очень похожи. Можно с уверенностью предположить, что он, вероятно, очень похож для всех 18 наших жанров. Поэтому, чтобы устранить общие слова между каждым жанром, мы собираемся создать список стоп-слов с пересечением 500 наиболее распространенных слов в каждом жанре.

Мы будем использовать пакет FreqDist для создания списка слов по жанрам.

В этом коде мы находим количество слов по жанру, используя класс FreqDist из пакета nltk. Мы храним количество слов в словаре Python, где ключами являются жанры, а значениями являются объекты FreqDist.

Теперь давайте найдем пересечение всех частотных подсчетов из 18 слов.

Эта функция извлекает самые распространенные слова из объекта FreqDist. В нашем случае мы сделаем 500 лучших слов для каждого жанра.

Этот код перебирает все жанры и извлекает 500 лучших слов. В переменной stop мы храним пересечение лучших слов каждого жанра.

Это наш список стоп-слов:

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