Можно ли научить компьютер пересказывать дневники?
В течение полугода мы изучали разные методы автоматического реферирования текстов и попытались соединить лучшее из разных подходов
Что такое «Прожито» и зачем ему это нужно?
«Прожито» сегодня — это не только корпус дневников и воспоминаний. За 8 лет работы проекта накопилось более 10 тысяч электронных копий разных документов, преимущественно из семейных собраний, и эта коллекция постоянно пополняется.

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

Наша команда стремилась к созданию инструмента автоматического чернового аннотирования документов по их расшифровкам. Мы изучили литературу по теме, попробовали разные подходы к автореферированию и поняли, что даже современные GPT-нейронки не могут решить эту задачу эффективно.
Первые тесты
Для начала мы отобрали несколько эталонных текстов, чтобы использовать их для дальнейших экспериментов. Было решено, что для осуществления наших целей понадобятся тексты, отличающиеся по ряду характеристик
(возрасту автора, тематике, объему и т.д.):
1
TF-IDF
Мы начали углубленное знакомство с корпусом, проведя TF-IDF взвешивание эталонных дневников. Это позволило нам произвести статистическую оценку важности слов в текстах. Путем анализа весов TF-IDF мы смогли выявить ключевые темы дневниковых записей в различные периоды времени, что расширило наше понимание тематики текстов и ее изменения с течением лет.

На примере дневника М. Пришвина мы подготовили визуализацию TF-IDF взвешивания записей по годам:
2
Существующие решения
Далее, мы решили протестировать существующие модели нейросетей-суммаризаторов и разные сервисы на эталонных текстах, чтобы оценить, насколько хорошо они справляются с поставленной задачей.
Этот эксперимент показал, что готовые модели неэффективны для задачи суммаризации дневниковых записей. Сокращения получаются неполными, происходит постоянная путаница в фактах. Также рефераты часто составляются от лица автора дневника, что не подходит для нашей задачи.
3
Своя нейросеть
В качестве отправной точки мы решили использовать модель Т5 (text-to-text transfer transformer). Эта модель затачивалась на предсказывание пропущенных фраз, но её можно файн-тюнить под разные задачи, в т.ч. суммаризацию текстов.

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

Так выглядят первые результаты, полученные в процессе обучения модели ruT5-base от Сбера на датасете с пересказами эго-литературы:
***** Input Text *****

2 июня. Сегодня исторический день.
И[нна].Д[митриева]. и Н[аташа].П[люснина]., а также другие уехали в Москву. Стало так скучно. Погоды поршивые. Тоска, скука. В дневнике я пишу сухими казенными словами. А как хочется его забросить к чорту на рога. А все таки жаль. Ада подорила мне свою фотографию. Я прямо радуюсь «как ребенок». Я ехал на вокзал провожать ребят. Наташа много плакала, Ада немножко, плакала она из-за расставания с подругой и еще из-за какой-то тайны покрытой мраком.
***** Summary Text (Generated Text) *****

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


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

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

Также мы хотели немного изменить стратегию наполнения датасета, собрав его из дневниковых записей и кратких пересказов, сделанных пользователями Толоки. Мы запустили тестовую кампанию и выяснили, что получаемые в результате аннотации дневниковых записей наполовину непригодны, потому что являются результатом копипаста или некорректно передают содержание текста. Но мы не сдаёмся, и надеемся, что сможем когда-нибудь собрать этот датасет и помочь русскоязычному NLP-сообществу.
Хождения
по графам
Побороть один из недостатков нейронных сетей — искажение информации — мы решили с помощью графов. Одни из первых методов автоматического реферирования тоже использовали графовую структуру для выделения важных предложений из текста, которые шли в аннотацию, но в результате страдала связность итогового реферата.

Мы же пошли по пути построения графа знания из фактов и атрибутов, которые мы вычленили из текста, чтобы на их основе генерировать связный текст аннотации.
Идеологически мы опирались на опыт, к сожалению, не взлетевшей технологии ABBYY Compreno, которая разрабатывалась накануне «нейросетевого бума» 2018 года. Принцип его работы был в следующем:
1
Разбор текста
На вход системе извлечения информации поступают деревья разбора, полученные семантико-синтаксическим парсером.
2
Создание словаря и правил
Чтобы понять, что нужно из этого текста, разрабатывается модель предметной области (онтология) и правила извлечения информации.
3
Создание «графа знаний»
Система применяет правила к разным фрагментам дерева разбора: если фрагмент удовлетворяет шаблону, то правило генерирует утверждения. В конце эти утверждения формируются в граф знаний.

1

Разбор текста

Деление текста дневника на дневниковые записи и определение их датировки

На первый взгляд, задача кажется тривиальной — нужно найти в начале абзаца дату и вычленить её с помощью регулярных выражений выражений или библиотек (dateparser или Natasha). Но авторы дневников используют широкий спектр форматов и способов записи дат, иногда датируя дневниковые записи интервалом дат или используя сочетание римских и арабских цифр со словами.
На основе библиотеки yargy мы прописали разные правила оформления дат в тексте, в т.ч. и интервалов дат. Поскольку авторы дневников не всегда указывают год ведения записей, мы «запоминаем» год из прошлых записей и добавляем его в дату автоматически.
Получение дерева разбора
Для работы с синтаксическими связями внутри предложений мы выбрали библиотеку Natasha. Она позволила нам анализировать синтаксис и семантику предложений и, опираясь на обнаруженные связи, перестраивать предложения в графы.

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

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

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

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

2
Создание словаря и правил
Популярные инструменты по извлечению именованных сущностей, например, Natasha, заточены под определенные типы информации: имена, топонимы, названия организаций. Но этих сущностей недостаточно, чтобы по-настоящему глубокого понять содержание текста. Даже с определением локаций (с чем, казалось бы, NER-парсеры справляются хорошо) часто возникают сложности, потому что автор может не упоминать конкретные топонимы, а довольствоваться названиями заведений (магазин, столовая, детсад), зданий (церковь, высотка, ратуша), природных объектов (лес, озеро, горы) или абстрактными понятиями (дома, в гостях, на природе).

Таким образом, мы решили создать словарь слов по каждой интересующей нас области: локации, игры, эмоции.

Первоначально для создания тезауруса мы использовали ruWordNet и рекурсивно собирали синсеты. Но так в итоговую выборку попадало слишком много «мусора» из-за омонимии некоторых слов. В итоге мы остановились на парсинге Викисловаря — мы автоматически собирали синонимы и гиперонимы интересующих нас понятий в списки, чтобы в дальнейшем скомпилировать их в один тематический мега-словарь. Пока наши словари ограничены униграммами из-за особенности поиска совпадений, но в перспективе мы сможем отдельно обрабатывать n-граммы.
Чтобы успешно определять в тексте эмоции и сентимент, мы составили несколько словарей.
Во-первых, пользуясь алгоритмом парсинга Викисловаря, мы собрали словарь эмоций+сентимента.
Пример строки из словаря: "боль": ["negative"]

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

Мы решили обойти эту проблему, дополнив словари эмоций глаголами действия, и сформировали нужный датасет, пользуясь книгой "Тезаурус эмоций. Руководство для писателей и сценаристов" А. Акерман и Б. Пульизи. Так получился словарь глаголы+эмоции+сентимент:
"поникнуть": [["безысходность", "negative"]], ["разочарование", "negative"]]
Разработав алгоритм определения сентимента в тексте с опорой на составленные словари, мы решили посмотреть на его эффективность в сравнении с популярной библиотекой для сентимент-анализа dostoevsky.

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

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

3
Создание «графа знаний» и сбор аннотации
В итоге у нас получился набор фактов: сентимент, локации, слова, обозначающие досуг, и выделенные факты, — которые мы связали с датами дневниковых записей, где они встречаются. В результате у нас получился «граф знаний», по которому можно ходить и собирать факты для аннотации. Вот результат обработки одной тетради дневника Марии Германовой:

0%
Дальше остаётся только собрать из этих фактов аннотацию. Поскольку простое перечисление фактов — это скучно, мы первоначально хотели «оживить» пересказ с помощью нейросетей, которые могут «додумать» и заполнить пропущенное содержание в промежутках между словами. Для этой задачи мы тестировали модель FRED-T5-large от Сбера. Иногда ей удавалось связать факты в однообразный, хотя и связный текст, но чаще всего на нашем наборе фактов нейросеть сочиняла что-то невразумительное или додумывала факты, что ярче всего видно на этом примере:
Аннотация дневника Марии Германовой по ручному шаблону:

Авторка этого дневника вела его с 1938-08-24 по 1938-09-15. Наиболее часто она описывала школу, столовую и дом.
В записях с преимущественно положительной тональностью авторка писала как она побежала в кооператив (1938-08-25), подходила во дворе (1938-09-05), снесла письмо на почту (1938-09-05), на почту (1938-09-13).
Также в дневнике описывается, как она сходила в главное здание (1938-08-24), пошла на станцию (1938-08-24), купила в буфете (1938-08-24), вошла в избу (1938-08-24), ходила в город (1938-08-31), была в городе (1938-08-31), сидела в двор (1938-08-31), бегала в канцелярию (1938-08-01), рисовала вид деревни (1938-09-09), построила целую улицу деревни (1938-09-11), не пошла в кино (1938-09-11), сходила с печки (1938-09-12), пошла в магазин (1938-09-14), зашла в главное здание (1938-09-15).

Вариант аннотации от модели FRED-T5-large:

Дневник колхозницы
Писал по дням недели колхозницы. Делал дневник ежедневно в течении года,
с 1938-08-24 по 1938-09-15. В нём часто записывала все важные жизненные события. В записи указывали название колхозного правления, сов школу, столовую и дом.
Дневник: побежала в кооператив (1938-08-25), подходила во дворе (1938-09-05), снесла письмо на почту (1938-09-05), на почту (1938-09-13).
Дневник: сходила в главное здание (1938-08-24), пошла на станцию (1938-08-24), купила в буфете (1938-08-24), вошла в избу (1938-08-24), ходила в город (1938-08-31), была в городе (1938-08-31), сидела в двор (1938-08-31), бегала в канцелярию (1938-08-01), рисовала вид деревни (1938-09-09), построила целую улицу деревни (1938-09-11), не пошла в кино (1938-09-11), сходила с печки (1938-09-12), пошла в магазин (1938-09-14), зашла в главное здание (1938-09-15).
Результаты нас не сильно впечатлили — даже удачные варианты можно было бы воспроизвести с помощью вручную составленных шаблонов. Именно этим мы и решили заняться на заключительном этапе.

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

Мы стремились сделать механизм подготовки аннотации максимально простым, чтобы при использовании не приходилось подавать аннотатору дополнительные вводные данные. Так, например, мы сделали автоматическим определение гендера автора дневника, чтобы под него так же элегантно подстраивался шаблон аннотации.
~
Наши эксперименты по извлечению фактов мы выполняли на языке Python и решили собрать все наши наработки в одной библиотеке с возможностью добавления собственных онтологических словарей и инструкций.
Перспективы проекта
1
Улучшение экстрактора фактов
Можно улучшить имеющиеся словари понятий, добавлять новые по мере необходимости, совершенствовать инструкции
2
Расширение применения
Мы концентрировали внимание только на дневниках, но используемые методы можно использовать и на письмах, воспоминаниях, а также на совокупностях документов
3
Улучшение нейросетевых моделей
Для заполнения «пустот» между фактами в аннотациях можно использовать нейросети, например, FRED-T5-large от Сбера, но её необходимо дотренировать на текстах реальных аннотаций документов
Команда проекта
  • Иван Бибилов
    Руководитель проекта
    Директор Прикладного центра машинного обучения, анализа данных и статистики (ПЦ МАСТ); Со-руководитель программы прикладного анализа данных (ПАНДАН)
  • Вероника Михайлова
    Участник проекта
    Студентка программы ДПО ПАНДАН
    2022-2023 года
  • Алексей Сенюхин
    Участник проекта
    Студент программы ДПО ПАНДАН 2022-2023 года, сотрудник Центра изучения эго-документов «Прожито»
Made on
Tilda