Как машины понимают структуру предложения: комбинаторная категориальная грамматика
Делиться

Я хочу обсудить никогда не упоминаемую тему, а именно, как мы можем понять грамматику нестатистическим способом. Многие модели ИИ, такие как GEM DeepMind и PARSEVAL Google, не полагаются исключительно на статистическое обучение, чтобы понять грамматику. Вместо этого эти гибридные модели заново вводят формальные грамматики, такие как комбинаторная категориальная грамматика (CCG) , в свою архитектуру. Это позволяет этим моделям использовать десятилетия лингвистического анализа всего в нескольких строках кода. Теоретически, позволяя им достичь того же уровня компетентности за меньшее время и с меньшими затратами. Но как мы можем превратить грамматику в то, с чем сможет работать компьютер?
Чтобы понять это, мы поговорим о том, как слова превращаются в функции, об алгебре, стоящей за их комбинированием, и о том, что программа, возвращающая TypeError, во многих отношениях эквивалентна предложению с плохой грамматикой.
Послушайте, undefined может вызвать неприятные воспоминания — слова, перечеркнутые красным, линейку у запястья или пустой взгляд в лицо « предлогу ».
Грамматику это помогает с помощью набора предписывающих правил. Команды типа:
- Не используй «кого» в качестве подлежащего.
- В предложении должно быть подлежащее и дополнение .
- Не заканчивайте предложения предлогами (в, по, в,…).
Как писатель, я всегда считал заповеди немного ограничивающими — отчасти болью, отчасти лекарством. И хотя я могу признать, что эта грамматика может прояснить ваш текст, она не помогает машинам понимать структуру предложения. Для этого нам нужно будет обсудить комбинаторную категориальную грамматику (CCG), если вы с ней знакомы. Однако мы не можем отказаться от предписывающей грамматики. И в этой статье мы будем использовать 2-ю заповедь : Каждое предложение должно содержать четкое подлежащее и сказуемое .
От НЛП к сетям доказательств
В начале 2000-х годов статистические парсеры CCG были лидерами в предоставлении широкого охвата и высокоточного синтаксического анализа, фиксируя дальние зависимости и сложную координацию. Хотя это и не является актуальной темой в LLM, это помогло сформировать системы вопросов и ответов, логического вывода и машинного перевода, где желательна структурная прозрачность.
Хотя грамматику теперь можно вывести только из одних данных, нет необходимости в вручную закодированных правилах, тем не менее, многие современные модели повторно вводят синтаксические сигналы, потому что:
- Неявное обучение само по себе может упустить феномены углового случая. Анализатор можно настроить на обработку тройных отрицаний в юридическом языке или переносов в поэзии, но только если вы явно закодируете эти шаблоны.
- Обеспечить более быстрое обучение с меньшим объемом данных. Изучение грамматики только на основе данных требует миллиардов записей и является вычислительно затратным.
- Интерпретируемость и контроль. При анализе синтаксических ошибок проще смотреть на основанные на синтаксическом анализе признаки, чем на непрозрачные веса внимания.
- Последовательность в генерации. Чисто эмерджентные модели могут дрейфовать, меняя времена глаголов в середине предложения, не сопоставляя местоимения и антецеденты. Синтаксически-распознающий парсер или грамматический модуль может явно это реализовать.
- Ограничения языка с низкими ресурсами. Суахили или валлийский могут иметь меньше доступных данных для обычного крупномасштабного обучения. Рукописные правила грамматики компенсируют это.

Сетки для проверки
Другая причина, по которой CCG продолжает иметь значение, заключается в его глубокой связи с сетями доказательств (Girard 1987). Сети доказательств — это основанный на графах способ представления доказательств в линейной логике, который отбрасывает бюрократические детали, чтобы раскрыть основную логическую структуру. Morrill (1994) и Moot & Retoré (2012) доказали, что каждый разбор CCG может быть переведен в один из этих канонических графов сетей доказательств, что дает прямой формальный мост между синтаксическими выводами CCG и доказательствами линейной логики. Дальние зависимости возникают как явные пути, избыточность вывода устраняется, а семантическая композиция следует сокращениям графа. Когда мы говорим линейная логика , каждая формула должна использоваться ровно один раз в выводе.
Подумайте об этом так: когда вы строите синтаксический анализ CCG (или его сеть доказательств), каждая синтаксическая комбинация (например, глагольная фраза, объединяющаяся с ее субъектом ) точно сообщает вам, какую семантическую операцию выполнить (функция-применение, функция-композиция и т. д.). Эта последовательность шагов, управляемых синтаксисом, затем объединяет значения отдельных слов в значение всего предложения формально точным образом.
C&C parser и EasyCCG (Lewis & Steedman, 2014) являются известными инструментами в области анализа CCG. Хотя оба широко используются, EasyCCG обычно признается за свою скорость, часто достигая более быстрого времени анализа, тогда как C&C parser часто отмечается за свою точность, особенно в сложных предложениях.
Где именно мы находимся?
Формально Тип-1 в иерархии Хомского, прямо под Машинами Тьюринга, прямо над Магазинными Автоматами. Тип-1 является Контекстно-чувствительным . Чем глубже язык в иерархии Хомского, тем выше генеративная мощность, структурная сложность и вычислительные ресурсы, необходимые для его разбора.
- Синтаксический анализ: определение возможности построения строки с учетом правил грамматики.
- Язык (𝑳) — это конечный набор слов, составленный из элементов набора Алфавит (𝚺), который содержит все символы данного языка.
При более широком определении «слова» не обязательно должны быть словами. Например, наши «слова» могут быть адресами электронной почты, а наш алфавит может состоять из цифр, букв и символов.
В английском языке, если мы хотим говорить о целых предложениях, мы можем позволить нашему алфавиту Σ быть множеством всех слов (нашим словарным запасом). Тогда предложение — это любая конечная строка в Σ*, а язык L⊆Σ* — это просто множество «правильно сформированных» предложений, которые нас интересуют.

Учитывая это абстрактное определение языка, мы можем говорить об эзотерических конструкциях, таких как языки, где все слова представляют собой нечто вроде (ab, aab, aaabbb, abb и т. д.). Формально это описывается следующим образом:

Здесь возведение в степень больше похоже на добавление чего-либо в конец строки, поэтому 3² = 33 ≠ 9
Этот язык относится к типу 3 в иерархии, регулярному выражению . Хотя может быть трудно найти практическое применение для вышеуказанного языка, наиболее распространенными примерами использования регулярных выражений в реальном мире являются проверка адреса электронной почты в веб-формах: за кулисами форма использует регулярное выражение, например…
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$
этот@[email protected]@😡grammar.in_the_email_language.ca
Здесь единственная цель нашей грамматики — убедиться, что вы вводите действительный адрес электронной почты. В CCG наша грамматика имеет более лингвистическую цель, она проверяет, сочетаются ли слова грамматически.
Иерархия Хомского в НЛП
При переходе от Type-3 к Type-0 вы уменьшаете ограничения на то, что вы можете произвести. Это увеличивает выразительную силу за счет дополнительных вычислений.
Тип 0 (рекурсивно перечислимые грамматики): полный семантический разбор или генерация в Тьюринг-полном формализме (например, Prolog DCG с произвольными дополнительными аргументами или нейронные модели seq2seq, которые в принципе могут имитировать любую машину Тьюринга).
Тип 1 (Контекстно-зависимые грамматики): Swiss-German использует кросс-серийную зависимость, где вам нужно больше информации о соседних словах перед переписыванием. Это потребовало бы больше вычислительных шагов для разбора.

Когда мы позже рассмотрим алгебру CCG, вернитесь и посмотрите, как использование только одного прямого и обратного приложения может привести к возникновению проблемы со швейцарско-немецким (подсказка: вам нужно объединить смежные категории)
Тип 2 (контекстно-свободные грамматики): CCG становится чистой грамматикой типа II (контекстно-свободной) именно тогда, когда вы допускаете только два правила применения и не допускаете комбинаторов более высокого порядка (повышение типа или композиция).
Тип 3 (регулярные грамматики): токенизация, простая маркировка на основе шаблонов (например, распознавание дат, адресов электронной почты или тегов частей речи с использованием регулярных выражений или конечных преобразователей)
Алгебра CCG
Допустим, у нас есть категории A и B, тогда прямое и обратное применение работают следующим образом:
- A/B говорит, что если справа от A/B находится B, то полученный продукт равен A.
- AB говорит, что если слева от AB стоит B, то результирующим произведением будет A.

на практике А и В становятся частями шейха
Алгебра CCG очень похожа на умножение дробей; обратите внимание, как «числители» сокращаются со «знаменателями». Однако, в отличие от умножения, порядок имеет значение. Эта алгебра не коммутативна . Не запоминайте это как правило, но это прямое следствие порядка слов. Это отсутствие коммутативности необходимо, чтобы различать «We go there.» как предложение и «Go we there.» как бессмыслицу.
Объединение двух атомарных категорий с помощью или / (например: NP/N) создает сложную категорию , которая классифицирует слово и описывает, как его можно объединить.
На следующем рисунке «The» сочетается с «Dog» (существительное (N)), образуя существительное (NP) «The dog». Аналогично существительное «Собака» может сочетаться с «ран» (глагол (SNP)), образуя предложение (S) «Собака побежала».


Построение полных предложений
Возьмем, к примеру, слово «a» — оно явно не является существительным, именной группой или предложением, но мы могли бы описать его в таких терминах, сказав, что «a» — это слово, которое ожидает существительного справа, чтобы стать именной группой:
«а» = НП/Н
Вот как «мяч» (NP/NN → NP) становится именной группой.
Видите ли вы, как мы можем ловко описать артикли (a, an, the) в терминах NP и N, чтобы создать категорию, которая описывает, как они функционируют, как они взаимодействуют со словами вокруг них? Зачем называть «the» артиклем, когда мы можем назвать его функцией, которая ожидает, что существительное станет именной группой?
То же самое мы можем сделать с глаголами. Чтобы составить предложение S , нам нужны подлежащее и сказуемое.
- Субъект (КРАСНЫЙ) выполняет действие.
- Действие — это глагол.
- Предикат (СИНИЙ) получает действие.

Разделив предложение таким образом, мы увидим, что глагол выступает в качестве точки опоры между двумя необходимыми частями конструкции предложения, поэтому вас не должно удивлять, что глагол и наречие играют особую роль в CCG, поскольку они являются категориями, содержащими атомарную категорию S.
Мы можем описать Глагол как нечто, что переносит Фразу Существительного влево и Фразу Существительного вправо, чтобы стать предложением. (SNP)/NP. Дополнительные атомарные категории не нужны.
«После отладки в течение часов» — придаточное (зависимое) обстоятельственное предложение. Анализируется C&C или EasyCCG
Как это относится к программированию
Самое элегантное, что я нахожу в CCG, это то, как он превращает глагол «писать» в функцию (SNP)/NP , которая принимает Noun Phrase слева и справа в качестве входных данных для вывода предложения. Обрабатывая слова как функции, парсер CCG проверяет типы предложения так же, как компилятор проверяет типы программы.
Ужасная ошибка TypeError будет последует, если вы попытаетесь сделать предложение типа «бежать писать гулять». Это не будет компилироваться так же, как не будет компилироваться sum(«слово») . В первом случае вы вводите глагол там, где ожидалась именной фразы, а во втором вы вводите строку там, где ожидалось число. TypeError
В лямбда-исчислении мы могли бы записать:
λo. λs. пишем так — ждем объект o, затем субъект s
В CCG каждый лексический элемент несет в себе не только синтаксическую категорию, но и небольшой лямбда-терм, кодирующий его значение — например, write может быть назначено (S(SNP)/NP с семантикой λo. λs.write(s, o) для указания того, что сначала принимается объект (o), а затем субъект (s). Применяя комбинаторные правила CCG (например, применение функций), вы одновременно применяете эти лямбда-термины, шаг за шагом составляя значения слов в полную логическую форму для всего предложения.
Лямбда-исчисление — это очень маленький формальный язык, который делает одну вещь: он описывает, как строить функции и как их запускать. Все остальное — числа, булевы значения, структуры данных, даже целые программы — может быть закодировано в терминах этих функций. В результате лямбда-исчисление служит точной математической моделью самого вычисления.
Заключение
Сила CCG заключается в его способности преобразовывать язык в алгебраическую систему, предоставляя четкий набор композиционных инструкций. Это невероятно полезно для выявления связей между человеческим языком и формальными вычислениями. По общему признанию, CCG, описанная здесь, недостаточно всеобъемлюща для разбора предложений типа:
CCG — это не просто эффективный способ для компьютеров понимать структуру предложений; по-видимому, он также отражает то, как наш мозг обрабатывает язык.
Разбор этих предложений требует гораздо большего. Когда вы пытаетесь построить всеобъемлющую систему CCG для обработки реального английского языка в масштабе, вам нужно более 1200 различных грамматических категорий, что показывает, сколько скрытой сложности существует в том, что кажется «обычным» использованием языка.
Даже следующая конструкция представляет собой упрощенную модель:
S ├── S │ ├── NP CCG │ └── SNP │ ├── (SNP)/NP не │ └── NP │ ├── NP/NP просто │ └── NP │ ├── NP/N a │ └── N │ ├── N/N мощный │ └── N │ ├── N способом │ └── NN │ ├── (NN)/NP для │ └── NP │ ├── NP компьютеры │ └── NPNP │ ├── (NPNP)/(SNP) для │ └── SNP │ ├── (SNP)/NP понимают │ └── NP │ ├── N/N предложение │ └── N структура ├── (SS)/S ; (пунктуация) └── S ├── NP это └── SNP ├── (SNP)(SNP) также └── SNP ├── (SNP)/(S[TO]NP) появляется └── S[TO]NP ├── (S[TO]NP)/(SNP) к └── SNP ├── (SNP)/NP зеркало └── NP ├── NP/(SNP) как └── N ├── N/N наш └── N ├── N мозги └── NN ├── (NN)/NP процесс └── NP язык
По своей сути CCG обеспечивает методичный и строгий подход к разделению предложений, их повторной сборке и обеспечению грамматической последовательности. При этом избегая неполных предложений, таких как:

Ссылки
Ван, С., … и др. (2024). Вычислительные модели для изучения обработки языка в мозге человека: обзор. Препринт arXiv arXiv:2403.13368. https://arxiv.org/abs/2403.13368
Льюис, М. и Стидман, М. (2014). Анализ A* CCG с супертеггером и практическое динамическое программирование. В трудах конференции 2014 года по эмпирическим методам обработки естественного языка (EMNLP) (стр. 1787–1798).
Жирар, Ж.-И. (1987). Линейная логика. Теоретическая информатика, 50(1), 1–102.
Моррилл, Г. (1994). Категориальный вывод. Журнал логики, языка и информации, 3(3), 287–321.
Moot, R., & Retoré, C. (2012). Логика категориальных грамматик: дедуктивное описание синтаксиса и семантики естественного языка. Springer.
Джурафски, Д. и Мартин, Дж. Х. (2023). Обработка речи и языка (3-е изд.) [Приложение E: Комбинаторная категориальная грамматика]. Получено 29 мая 2025 г. с https://web.stanford.edu/~jurafsky/slp3/E.pdf
Источник: towardsdatascience.com



























