В этом посте я собрал все свои заметки, которые собрал при изучении лингвистических явлений, таких как когезия, когерентность и связь между ними, а также лексические цепи. В конце вас ждет пара интересных алгоритмов: вычисление этих самых лексических цепей и генерация саммари на их основе.  Я решил создать канал в телеге. Буду там постить выжимки из статей (может быть тогда очередь закончится), мысли, части вот таких статей и анонсы самих статей. Когезия как явление очень основательно описана в работе Халидая и Хасана 1976 года под названием "Cohesion in English". По определению авторов, когезия - это явление непрерывности между разными частями того, что мы называем текстом. Эта непрерывность образуется благодаря грамматическим и лексическим связям между отдельными смысловыми сущностями, которыми могут выступать предложения или простые части сложных предложений. Отношения смысловых сущностей в тексте выражаются как “предполагающий” и “предполагаемый”, например Слово "их" предполагает слово "яблок", создавая связь между двумя предложениями, т.е. образуя когезию. Без когезии текст бы просто разваливался на части. Видов когезии существует достаточно много: выделяют пять разных видов когезии с их подвидами. Диаграмма этих видов показана на рисунке ниже. Чтобы не нагружать пост, дам ссылку, где вы можете найти их описание в [3] или в статье на Вики. Я же остановлюсь подробнее только на лексической когезии. Лексическая когезия отличается от других видов тем, что она образуется при выборе определенного набора слов, а не с помощью грамматических конструкций. Давайте посмотрим детально на виды лексической когезии. Их существует два: повторительный - повторение лексического элемента, ссылки на него или использование какого-либо его синонима, словосочетательная - связь, которая возникает при частом совместном появлении слов вместе. Рассмотрим примеры каждого подтипа: Повторение с указанием ссылки. Он сел в машину. В машине было холодно. Холодно именно в той машине, в которую сел некий "он". Повторение без идентификации. Петр купил машину. Ему нравятся красные машины. Петру нравятся красные машины в принципе, а не только та машина, которую он купил. Повторение с родительскими по абстракции словами. Петр купил седан. Он давно хотел купить машину. Здесь слово "седан" - это подмножество машин. Систематические семантические отношения (систематически классифицируемые): Леше нравятся красные машины. Он не любит синие. Слова "красные" и "синие" обозначают цвета - то, что можно собрать в одну четкую группу. Несистематические семантические отношения (систематически не классифицируемые): Миша провел в гараже весь день. Он ремонтировал машину УАЗ. Гараж и машина семантически близкие слова, которые часто встречаются рядом. Последний вид особенно сложно определять, поскольку это отношение базируется на идущих рука об руку словах, но их нельзя строго систематизировать, как в четвертом случае. Теперь поговорим о когерентности и ее взаимосвязи с когезией. Если когезия определяет способ, благодаря которому текст связан, то когерентность отражает смысловое содержание текста в целом. Другими словами, когерентность отражает то, о чем нам хотел сказать автор текста. Именно это свойство когерентности тесно связывает ее с понятием дискурса - более общим понятием, которое описывает такие речевые явления, как текст, диалог или монолог.  Когерентность является носителем смысла дискурса. К дискурсу мы еще вернемся. Понятие когерентности играет важную роль в задачах генерации саммари, сегментации текста и оценки сложности текста. Если отношения когезии довольно хорошо определены, то вот с когерентностью все гораздо сложнее: на сегодняшний день существуют несколько теорий, которые описывают отношения когерентности. На базе этих теорий лингвисты старались придумать вычислительные методы определения этих отношений в тексте. Но оказывается, что иногда даже людям трудно определить эти отношения. Далее, я постараюсь это проиллюстрировать. Рассмотрим два вида отношений из одной теории: элаборация и объяснение. Элаборация, простыми словами, это когда второе предложение добавляет какую-то важную информацию о ранее упомянутой сущности. Объяснение, это когда второе предложение объясняет то, что написано в первом. Взглянем на такой пример. Автор относит этот пример к элаборации. Добавим теперь одно предложение Теперь то же самое отношение можно характеризовать как объяснение, но это не отменяет того, что это похоже на элаборацию. Когерентность очень сильно зависит от представленной информации и точки зрения читающего. Поговорим о взаимосвязи между когерентностью и когезией. Вообще говоря, когерентность может существовать даже если нет каких-то явно определенных локальных отношений, при условии, что в тексте говорится об одном и том же.  Поэтому можно было бы сказать, что именно когерентность определяет когезию. Текст примера выше, очевидно, когерентен, а  пара слов "сейф" и "комбинация" связаны по смыслу, образуя при этом словосочетательную когезию. Из этого следует, что когезия может служить индикатором наличия когерентности между предложениями. Однако наличие когерентности не является обязательным условием для существования когезии. Вот оригинальный пример текста из статьи с когезией, но без когерентности: А вот когерентный текст без когезии: Все же когерентность и когезия - ортогональные понятия и могут существовать друг без друга. Однако все-таки, большинство предложений, которые связаны когезией, являются когерентными. Обычно лексическая когезия не ограничена парой слов. Она может распространяться дальше через связанные по смыслу слова. Такую последовательность связных слов мы назовем лексической цепью. Такие цепи формируют смысловую (тематическую) единицу текста. Отмечу, что цепи не ограничены концом предложений. Для того, чтобы лично познакомиться с лексическими цепями, рассмотрим оригинальный пример из статьи: В данном случае лексическая цепь представляет собой набор слов {virgin, pine, bush, trees, trunks, trees}. Во-первых, т.к. значение слова определяется по его контексту, лексические цепи можно использовать для снятия лексической многозначности, ведь они задают тот самый контекст. Если мы рассмотрим цепь {море, ветер, коса, песок}, очевидно, что слово "коса" обозначает берег, а не ручной инструмент или прическу. Во-вторых, поскольку единица дискурса имеет тенденцию к использованию связанных по смыслу слов, они помогают определять структуру дискурса и, как следствие, когеренцию текста, а через нее и смысл. В статье авторы, опираясь на одну из теорий дискурса, показывают, как лексические цепи могут помочь в поиске структур в рамках этой теории. Сама теория была описана в работе [5]. Ее основное положение гласит, что любой дискурс представляет собой пирамиду из трех структур: Лингвистическая структура - фундамент пирамиды, который представляет собой разделение дискурса по группам предложений, каждая из которых играет определенную роль в дискурсе. Переход от одной группы к другой говорит об изменении темы или идеи разговора. Допускается, что границы могут быть нечеткими, однако для более точного их определения существуют ключевые слова. Структура намерений - показывает, как отдельные сегменты вносят вклад в общую цель дискурса. Цель дискурса отражает то, зачем автор пишет или говорит что-то: убедить в чем-то, рассказать, озадачить. Соответственно, каждый сегмент вносит свой вклад в достижение этой цели. Причем между сегментами возникает два типа взаимосвязи: Первый тип показывает, что завершение одного сегмента ведет к завершению другого. Второй тип показывает, что для завершения какого-то сегмента должно произойти завершение другого. Структура внимания - эта стековая структура наборов сущностей. На вершине стека находится сущность, которой уделено внимание в данные момент времени. По мере продвижение по тексту или речи, разные сегменты могут говорить о разных темах, для которых существуют отдельные наборы сущностей. Иногда фокус может сместиться к ранее упомянутым темам, как это было в этом посте выше. Когерентность является носителем смысла дискурса. К дискурсу мы еще вернемся. Идея в том, что если сегмент привносит новую тему, то соответсвующий набор помещается на вершину стека. Если же сегмент содержит уже имеющуюся тему, то со стека снимаются темы до той, о которой говорится в сегменте. Нужно заметить, что такие операции со стеком определяются отношениями намерений между сегментами, т.е благодаря предыдущей структуре. Так вот, в работе [1] говорится о том, что лексические цепи могут служить индикаторами лингвистических сегментов, а следовательно и соответствующей структуры: заканчивается цепь, заканчивается и лингвистический сегмент, а с началом новой цепи - новый сегмент. Далее в статье показывается, как использовать лексические цепи для определения структуры намерений, что странно, ведь речь шла лингвистическую структуру, но авторы написали "based on a theory", т.е. возможно есть несказанная импликация. Пример здесь я приводить не буду, см. 4.3 в статье. Мне попался один репозиторий с реализацией алгоритма построения лексических цепей, который довольно близок к оригинальному алгоритму. Там же показан алгоритм саммаризации, основанный на этих цепях. Хотя описание алгоритма есть в лежащем там pdf-файле, опишу его и здесь для целостности. Для работы нам понадобится питон и библиотека NLTK. Итак, на входе у нас есть англоязычный текст. Первым делом нужно извлечь из него все существительные. Затем при помощи WordNet нам нужно для каждого слова найти все синонимы, антонимы, гипонимы и гиперонимы. Затем мы готовы строить лексические цепи. Пробегаясь по всем существительным, мы смотрим в каждую цепь и увеличиваем ее, если текущее существительное уже есть в цепи если Wu-Palmer похожесть между любым словом из цепи, которое входит в список связанных слов для рассматриваемого существительного, и самим существительным превышает 0.5 если Wu-Palmer похожесть между рассматриваемым существительным, которое входит в список связанных слов для слова из цепи, и самим словом из цепи превышает 0.5  Вот как это выглядит в коде: Заключительным шагом является отбрасывание т.н. слабых цепей. В этом варианте алгоритма они определяются, как цепи с одним словом. Как я сказал выше, репозиторий содержит код, демонстрирующий использование лексических цепей для задачи саммаризации. Сам алгоритм базируется на очень простой идее извлечения предложений, значимость который считается, как сумма частот отдельных слов. Однако в вычислении частоты есть трюк - если слово входит в лексическую цепь, счетчик увеличивается на количество слов в этой цепи. У алгоритма есть гиперпараметры в виде верхней и нижней границ для частот. Все это организовано в небольшой класс(я удалил комментарии). Все, что нужно, это подать в метод summarize лист листов - предложений, разбитых на токены. Если запустить скрипт на тексте, который есть в репе, то получится следующие результаты   На этом у меня всё. В ближайшем будущем планирую также рассказать о моделях когеренции, которые я нашел. UPD: Огромное спасибо @berez за кропотливую вычитку поста и указание ошибок. Lexical Cohesion Computed by Thesaural Relations as an Indicator of the Structure of Text Lexical cohesion Cohesion in Texts: A Discourse Analysis of a News Article in a Magazine Coherence relations in discourse and cognition. Comparing approaches, annotations, and interpretations Attention, Intentions, and the Structure of Discourse  NLP-разработчик (MTS AI)