Введение

Алгоритм разбора для контекстно-свободных грамматик

В информатике алгоритм Кокке — Янгер — Касами (также называемый CYK или CKY) — это алгоритм разбора для контекстно-свободных грамматик, опубликованный Итиро Сакаи в 1961 году. Алгоритм назван в честь некоторых из тех, кто его заново открыл: Джона Кокка, Дэниела Янгер, Тадао Касами и Джейкоба Т. Шварца. Он использует восходящий разбор и динамическое программирование. Стандартная версия CYK работает только с контекстно-свободными грамматиками, представленными в нормальной форме Чомского (CNF). Однако любая контекстно-свободная грамматика может быть алгоритмически преобразована в грамматику CNF, выражающую тот же язык.

Важность алгоритма CYK обусловлена его высокой эффективностью в определенных ситуациях. Используя нотацию «большое O», наихудшее время выполнения CYK составляет , где — длина разбираемой строки, а — размер грамматики CNF. Это делает его одним из наиболее эффективных алгоритмов разбора с точки зрения асимптотической сложности в наихудшем случае, хотя существуют и другие алгоритмы с лучшим средним временем выполнения во многих практических сценариях.

Стандартная форма

Алгоритм динамического программирования требует приведения контекстно-свободной грамматики к нормальной форме Чомски (CNF), поскольку он проверяет возможность разбиения текущей последовательности на две подпоследовательности. Любая контекстно-свободная грамматика, не порождающая пустую строку, может быть представлена в CNF, используя только правила вывода вида , , и , где – стартовый символ.

В прозе

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

Создание дерева анализа

Вышеописанный алгоритм является распознавателем, который определяет лишь принадлежность предложения к данному языку. Его можно легко расширить до парсера, строящего дерево разбора, сохраняя узлы дерева разбора в качестве элементов массива вместо логической единицы (1). Узел связывается с элементами массива, которые использовались для его построения, таким образом формируя древовидную структуру. Если требуется построить только одно дерево разбора, в каждом элементе массива достаточно одного такого узла. Однако, если необходимо сохранить все деревья разбора для неоднозначного предложения, в элементе массива следует хранить список всех возможных способов получения соответствующего узла в процессе парсинга. Для этого иногда используется дополнительная таблица B[n,n,r], содержащая так называемые обратные указатели. В результате получается общий лес возможных деревьев разбора, где общие части деревьев используются повторно для различных вариантов разбора. Этот общий лес можно рассматривать как неоднозначную грамматику, генерирующую только разобранное предложение, но с той же неоднозначностью, что и исходная грамматика, и с теми же деревьями разбора, за исключением простого переименования нетерминалов, как показано в .

Анализ неконтекстных грамматических систем

Как отмечает , недостатком всех известных преобразований в нормальную форму Чомского является то, что они могут привести к нежелательному увеличению размера грамматики. Размер грамматики определяется как сумма размеров её правил вывода, где размер правила равен единице плюс длина его правой части. Обозначая размер исходной грамматики как , увеличение размера в худшем случае может варьироваться от до , в зависимости от используемого алгоритма преобразования. Для использования в обучении Ланге и Лейс предлагают незначительное обобщение алгоритма CYK, "не снижая при этом эффективность алгоритма, ясность его изложения или простоту доказательств".

Анализ взвешенных грамматических знаков без контекста

Также можно расширить алгоритм CYK для разбора строк, использующих взвешенные и стохастические контекстно-свободные грамматики. Веса (вероятности) в этом случае хранятся в таблице P вместо булевых значений, поэтому P[i,j,A] будет содержать минимальный вес (максимальную вероятность) того, что подстрока от i до j может быть выведена из нетерминала A. Дальнейшие расширения алгоритма позволяют перечислять все варианты разбора строки в порядке возрастания веса (убывания вероятности).

Численная стабильность

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

Алгоритм Валианта

В худшем случае время работы алгоритма CYK составляет , где n — длина разбираемой строки, а |G| — размер грамматики в форме нормального представления (CNF) G. Это делает его одним из наиболее эффективных алгоритмов для распознавания общих контекстно-свободных языков на практике. предложил расширение алгоритма CYK. Его алгоритм вычисляет ту же таблицу разбора, что и алгоритм CYK, однако он показал, что для выполнения этого вычисления можно использовать алгоритмы эффективного умножения матриц, состоящих из 0 и 1. Применение алгоритма Копперсмита — Винограда для умножения этих матриц дает асимптотическое время работы в худшем случае . Однако скрытая в нотации «Большое О» константа настолько велика, что алгоритм Копперсмита — Винограда целесообразен только для матриц, которые слишком велики для обработки на современных компьютерах, и этот подход требует вычитания, поэтому он подходит только для задачи распознавания. Зависимость от эффективного умножения матриц нельзя полностью избежать: доказал, что любой анализатор для контекстно-свободных грамматик, работающий за время , может быть эффективно преобразован в алгоритм вычисления произведения матриц с элементами 0 и 1 за время , а Abboud и др. расширили это утверждение на грамматики постоянного размера.