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

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

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

Обработка

Файлы субтитров можно извлечь из фильма в виде файла .srt. Это в основном просто текстовые файлы, но с очень строгим форматированием. Каждый субтитр имеет уникальный идентификатор, время начала и окончания (указывающее, что оно должно отображаться в формате ЧЧ:ММ:СС:МИЛ и заканчиваться на ЧЧ:ММ:СС:МИЛ), а также одну или две строки для фактического текста субтитров. отображаться.

Поскольку форматирование настолько жесткое, мы можем передать файл .srt в библиотеку Python pysrt, чтобы автоматически создавать объекты для каждого субтитра. Мы можем сохранить эти временные метки начала и окончания на потом, когда захотим связать диалог субтитров с реальным действием на экране, но сейчас нас интересует только фактический текст.

Разделение строк и объединение

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

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

Очистка текста

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

  • Курсив: вся строка выделена курсивом и обозначается тегами HTML «‹i›» и «‹/i›». Курсив часто используется для обозначения повествования или того, кто говорит по телефону за кадром. Мы отбросим теги HTML, но сохраним остальной текст.
  • Музыка: тексты песен начинаются и заканчиваются музыкальной нотой, независимо от того, являются ли они диегетичными (например, персонажи, поющие в караоке) или недиегетичными (например, музыка, наложенная на монтаж). Мы отбросим все это и не будем использовать в анализе НЛП.
  • Скобки: Полные скобки описывают как звуковые эффекты, так и недиалоговые звуки таких персонажей, как «(хрюканье)». Мы удалим эти строки из ввода НЛП.
  • Смех: смех персонажа часто включается в субтитры, например, «(смех)». К счастью, строк смеха достаточно для поиска, и мы можем просто создать список, содержащий такие фразы, как «(смеется)», «(смеется)» и «(смех)». Мы удалим их из текста субтитров, но сохраним все остальные диалоги.
  • Динамик: когда персонаж говорит за кадром, его имя будет отображаться вместе с текстом субтитров. При просмотре фильма мы можем распознать голос говорящего за кадром, но у слабослышащих нет такой роскоши. Имя закадрового персонажа мы удалим из текста, но это имя мы можем сохранить на потом, так как оно напрямую говорит нам, кто говорит.

Фрейм данных

С очищенным текстом и различной дополнительной информацией (например, флаг «да/н» для музыки или если он содержит смех, имена говорящих и т. д.) мы можем заполнить DataFrame, содержащий исходный текст, время начала/окончания, удобный для НЛП текст и более.

Хотите увидеть больше?