Алгоритм CYK - CYK algorithm

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

Стандартная версия CYK работает только с контекстно-свободными грамматиками, заданными в нормальной форме Хомского (CNF). Однако любая контекстно-свободная грамматика может быть преобразована (после соглашения) в грамматику CNF, выражающую тот же язык ( Sipser 1997 ).

Важность алгоритма CYK проистекает из его высокой эффективности в определенных ситуациях. Используя Big O обозначение , то в худшем случае время работы от CYK это , где это длина анализируемой строки и имеет размер грамматики CNF ( Хопкрофт & Ульман 1979 , стр. 140). Это делает его одним из наиболее эффективных алгоритмов синтаксического анализа с точки зрения асимптотической сложности наихудшего случая , хотя существуют другие алгоритмы с лучшим средним временем выполнения во многих практических сценариях.

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

Динамического программирования алгоритм требует контекстно-свободной грамматики , чтобы быть вынесено в нормальной форме Хомского (УТС), потому что он испытывает для возможности разделить текущую последовательность на два меньших последовательностей. Любая контекстно-свободная грамматика, которая не генерирует пустую строку, может быть представлена ​​в CNF с использованием только производственных правил форм и .

Алгоритм

Как псевдокод

Алгоритм в псевдокоде следующий:

let the input be a string I consisting of n characters: a1 ... an.
let the grammar contain r nonterminal symbols R1 ... Rr, with start symbol R1.
let P[n,n,r] be an array of booleans. Initialize all elements of P to false.

for each s = 1 to n
    for each unit production Rvas
        set P[1,s,v] = true

for each l = 2 to n -- Length of span
    for each s = 1 to n-l+1 -- Start of span
        for each p = 1 to l-1 -- Partition of span
            for each production RaRb Rc
                if P[p,s,b] and P[l-p,s+p,c] then set P[l,s,a] = true

if P[n,1,1] is true then
    I is member of language
else
    I is not member of language

Вероятностный CYK (для поиска наиболее вероятного синтаксического анализа)

Позволяет восстановить наиболее вероятный синтаксический анализ с учетом вероятностей всех производств.

let the input be a string I consisting of n characters: a1 ... an.
let the grammar contain r nonterminal symbols R1 ... Rr, with start symbol R1.
let P[n,n,r] be an array of real numbers. Initialize all elements of P to zero.
let back[n,n,r] be an array of backpointing triples.
for each s = 1 to n
  for each unit production Rvas
    set P[1,s,v] = Pr(Rvas)
for each l = 2 to n -- Length of span
  for each s = 1 to n-l+1 -- Start of span
    for each p = 1 to l-1 -- Partition of span       
      for each production RaRb Rc
        prob_splitting = Pr(RaRb Rc) * P[p,s,b] * P[l-p,s+p,c]
        if P[p,s,b] > 0 and P[l-p,s+p,c] > 0 and P[l,s,a] <  prob_splitting then 
          set P[l,s,a] = prob_splitting
          set back[l,s,a] = <p,b,c>

Как проза

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

Пример

Разбор предложений с использованием алгоритма CYK

Это пример грамматики:

Теперь предложение, которое она ест вилкой , анализируется с помощью алгоритма CYK. В следующей таблице in , i - номер строки (начиная с 1 снизу), а j - номер столбца (начиная с 1 слева).

Таблица CYK
S
Вице-президент
 
S
Вице-президент ПП
S НП НП
НП В, ВП Дет. N п Det N
она ест а рыба с участием а вилка

Для удобства чтения таблица CYK для P представлена ​​здесь как 2-мерная матрица M, содержащая набор нетерминальных символов, так что R k находится в том и только в том случае, если ,. В приведенном выше примере, поскольку начальный символ S находится внутри , предложение может быть сгенерировано грамматикой.

Расширения

Создание дерева синтаксического анализа

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

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

Как указали Lange & Leiß (2009) , недостатком всех известных преобразований в нормальную форму Хомского является то, что они могут привести к нежелательному увеличению размера грамматики. Размер грамматики - это сумма размеров ее производственных правил, где размер правила равен единице плюс длина его правой части. Используется для обозначения размера исходной грамматики, увеличение размера в худшем случае может варьироваться от до , в зависимости от используемого алгоритма преобразования. Для использования в обучении Ланге и Лайсс предлагают небольшое обобщение алгоритма CYK, «без ущерба для эффективности алгоритма, ясности его представления или простоты доказательств» ( Lange & Leiß 2009 ).

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

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

Алгоритм Valiant

Худшем случае время работы от CYK является , где п есть длина анализируемой строки и | G | является размер УТС грамматики G . Это делает его одним из наиболее эффективных алгоритмов распознавания общих контекстно-свободных языков на практике. Valiant (1975) дал расширение алгоритма CYK. Его алгоритм вычисляет ту же таблицу синтаксического анализа, что и алгоритм CYK; но он показал , что алгоритмы для эффективного умножения из матриц с 0-1-записями могут быть использованы для выполнения этого вычисления.

Используя алгоритм Копперсмита – Винограда для умножения этих матриц, это дает асимптотическое время работы в худшем случае, равное . Однако постоянный член, скрытый нотацией Big O, настолько велик, что алгоритм Копперсмита – Винограда имеет смысл только для матриц, которые слишком велики для обработки на современных компьютерах ( Knuth 1997 ), и этот подход требует вычитания, и поэтому только подходит для узнавания. Нельзя полностью избежать зависимости от эффективного умножения матриц: Ли (2002) доказал, что любой синтаксический анализатор для контекстно-свободных грамматик, работающий во времени, может быть эффективно преобразован в алгоритм, вычисляющий произведение -матриц с 0-1 элементами во времени .

Смотрите также

использованная литература

Источники

внешние ссылки