Скажи мне три фразы, и я скажу, кто ты
команда проекта: Мария Бурлак, Евгения Лепихина, Марина Севостьянова, Екатерина Федорищева, Людмила Шляхтина
Задача и исходная задумка
Мы хотели узнать, можно ли только по семантике реплик дать персонажу характеристику, является он положительным или отрицательным, главным или второстепенным. В качестве основы для работы был выбран датасет сценариев фильмов франшизы о «Гарри Поттере».
Этапы работы
  • Ручная разметка
Так как «положительность» и «важность» персонажа субъективны, мы оценивали каждого персонажа по этим двум параметрам вручную. Мы оценили каждого персонажа по двум шкалам: важность персонажа (0 — массовка, 1 — эпизодический, 2 — важный, 3 — главный) и положительность персонажа (Bad, Neutral, Good).

  • Векторизация
Фразы каждого персонажа мы разбили на группы по 3 реплики (чтобы тексты не были слишком короткие, и не целиком, чтобы определение параметров зависело не от количества участия персонажа, а только от самого содержания реплик). Эти кусочки мы векторизовали с помощью sentence-vectorizer (Bert). Затем мы обрезали вхождения одного персонажа до ста (случайным образом), чтобы немного сбалансировать датасет.

  • Обучение модели и оценка её эффективности (и основные результаты)
После получения векторов перед нами встала задача обучения модели и оценки её эффективности. Для векторизации были использованы векторы, полученные на предыдущем этапе работы. В качестве классификатора был выбран RandomForest со следующими метриками: max_features=10 000, min_df=5, max_df=0.4.
Итого точность модели по положительности персонажей составила 67%. Модель относительно хорошо справляется с положительными персонажами (F1-мера составила 80%), однако плохие и нейтральные персонажи вызывают у неё сильные затруднения (26% и 19% соответственно).


  • Другой способ векторизации
Мы решили, что векторизация через BERT не очень хороша, поскольку она создаёт близкие векторы для реплик, схожих по тематике, а злодеи и герои говорят на одни и те же темы, но по-разному. Поэтому мы решили выявлять отдельные леммы, свойственные категориям. Для этого мы сделали бинарное разбиение персонажей по каждому признаку (для goodness оставили только плохих и хороших, а в priority объединили 3−2 и 1−0), и для каждого слова посчитали меру, насколько они добрые/злые или важные/неважные. На основе этой меры для каждого слова реплики мы составили вектора.
В результате ухудшилось разделение злых и добрых персонажей и улучшилось различение важных и неважных, хотя мы ожидали наоборот. Скорее всего это связано с тем, что при создании словаря для goodness не использовалась лексика нейтральных персонажей. Ещё недочётом нашего нового метода является то, что словари собирались на основании датасета целиком, в то время как стоило уже на том этапе отделить тестовую выборку. Поэтому мы решили дополнительно проверить этот метод (с этими же словарями) на другом датасете.

  • Проверка на другом датасете («Звёздные войны»)
Снова обучались две модели: логистическая регрессия и случайный лес. Для каждого персонажа мы рассчитали доли реплик, определённых как положительные и как свойственные главным героям. Вполне ожидаемо, это не принесло больших успехов, поскольку лексика в фильмах очень разная, и, например, главный злодей Дарт Вейдер был отнесён к положительным персонажам.

  • UMAP
Ещё перед тем, как обучить модель, мы решили посмотреть на наши данные с помощью UMAP и узнать сразу, есть ли какие-то закономерности. Для начала мы взяли «goodness» персонажей и получили результат с левой диаграммы — хорошие и плохие персонажи не разделяются. Тогда мы и поняли, что персонажи с разными характеристиками говорят об одном и том же. И после того, как мы создали собственные векторы, результат был иной (правая диаграмма). Здесь уже есть какое-то различие.
Более подробно наш процесс работы и результаты представлены в нашем репозитории.
Made on
Tilda