En informática , el algoritmo Cocke-Younger-Kasami (también llamado CYK o CKY ) es un algoritmo de análisis sintáctico para gramáticas libres de contexto publicado por Itiroo Sakai en 1961. [ 1 ] [ 2 ] El algoritmo recibe su nombre de algunos de sus redescubridores: John Cocke , Daniel Younger, Tadao Kasami y Jacob T. Schwartz . Emplea análisis sintáctico ascendente y programación dinámica .
La versión estándar de CYK opera únicamente sobre gramáticas libres de contexto dadas en forma normal de Chomsky (FNC). Sin embargo, cualquier gramática libre de contexto puede transformarse algorítmicamente en una gramática FNC que exprese el mismo lenguaje ( Sipser 1997 ) .
La importancia del algoritmo CYK radica en su alta eficiencia en ciertas situaciones. Utilizando la notación O grande , el tiempo de ejecución en el peor de los casos de CYK es, dóndees la longitud de la cadena analizada yes el tamaño de la gramática CNF( Hopcroft y Ullman, 1979 , p. 140) . Esto lo convierte en uno de los algoritmos de análisis sintáctico más eficientes en términos de complejidad asintótica en el peor de los casos , aunque existen otros algoritmos con un mejor tiempo de ejecución promedio en muchos escenarios prácticos.
Formato estándar
El algoritmo de programación dinámica requiere que la gramática libre de contexto se convierta a la forma normal de Chomsky (FNC), porque comprueba las posibilidades de dividir la secuencia actual en dos secuencias más pequeñas. Cualquier gramática libre de contexto que no genere la cadena vacía puede representarse en FNC utilizando únicamente reglas de producción de las formasy; para permitir la cadena vacía, se puede permitir explícitamente, dóndees el símbolo de inicio. [ 3 ]
Algoritmo
Como pseudocódigo
El algoritmo en pseudocódigo es el siguiente:
Sea la entrada una cadena I que consta de n caracteres: a 1 ... a n . Sea la gramática que contiene r símbolos no terminales R 1 ... R r , con símbolo inicial R 1 . Sea P [ n , n , r ] un arreglo de booleanos. Inicialice todos los elementos de P a falso. Sea back [ n , n , r ] un arreglo de listas de triples de backpointing. Inicialice todos los elementos de back a la lista vacía. para cada s = 1 a n para cada unidad de producción R v → a s establecer P [ 1 , s , v ] = verdadero para cada l = 2 a n -- Longitud del intervalo para cada s = 1 a n - l +1 -- Inicio del intervalo para cada p = 1 a l -1 -- Partición del intervalo para cada producción R a → R b R c si P [ p , s , b ] y P [ l - p , s + p , c ] entonces establecer P [ l , s , a ] = verdadero, agregar <p,b,c> al reverso [ l , s , a ] Si P [n, 1 , 1 ] es verdadero, entonces I es miembro del lenguaje. Devuelve el resultado anterior ; al recorrer los pasos anteriores, se pueden construir fácilmente todos los árboles de análisis sintáctico posibles de la cadena. De lo contrario, devuelve "no es miembro del lenguaje".
CYK probabilístico (para encontrar el análisis sintáctico más probable)
Permite recuperar el análisis sintáctico más probable dadas las probabilidades de todas las producciones.
Sea la entrada una cadena I que consta de n caracteres: a 1 ... a n . Sea la gramática que contiene r símbolos no terminales R 1 ... R r , con símbolo inicial R 1 . Sea P [ n , n , r ] un arreglo de números reales. Inicialice todos los elementos de P a cero. Sea back [ n , n , r ] un arreglo de triples de backpointing. para cada s = 1 a n para cada unidad de producción R v → a s establecer P [ 1 , s , v ] = Pr( R v → a s ) para cada l = 2 a n -- Longitud del intervalo para cada s = 1 a n - l +1 -- Inicio del intervalo para cada p = 1 a l -1 -- Partición del intervalo para cada producción R a → R b R c prob_splitting = Pr( R a → R b R c ) * P [ p , s , b ] * P [ l - p , s + p , c ] si prob_splitting > P [ l , s , a ] entonces establecer P [ l , s , a ] = prob_splitting establecer de nuevo [ l , s , a ] = <p,b,c> Si P [n, 1 , 1 ] > 0, entonces encuentra el árbol de análisis retrocediendo a través de y devuelve el árbol de análisis ; de lo contrario, devuelve "no es miembro del lenguaje".
Como prosa
En términos informales, este algoritmo considera cada subcadena posible de la cadena de entrada y estableceser cierto si la subcadena de longituda partir depuede generarse desde el no terminalUna vez que ha considerado las subcadenas de longitud 1, pasa a las subcadenas de longitud 2, y así sucesivamente. Para las subcadenas de longitud 2 o mayor, considera cada partición posible de la subcadena en dos partes y comprueba si hay alguna producción.de tal manera quecoincide con la primera parte ycoincide con la segunda parte. Si es así, registracomo coincidencia de toda la subcadena. Una vez completado este proceso, la gramática genera la cadena de entrada si la subcadena que contiene toda la cadena de entrada coincide con el símbolo de inicio.
Ejemplo

Este es un ejemplo de gramática:
Ahora se analiza la oración " ella come un pescado con un tenedor" utilizando el algoritmo CYK. En la siguiente tabla, en, i es el número de la fila (empezando por abajo en 1), y j es el número de la columna (empezando por la izquierda en 1).
Para facilitar la lectura, la tabla CYK para P se representa aquí como una matriz bidimensional M que contiene un conjunto de símbolos no terminales, de modo que R k está en si, y solo si, . En el ejemplo anterior, dado que un símbolo inicial S está en , la oración puede ser generada por la gramática.
Extensiones
Generación de un árbol de análisis sintáctico
El algoritmo anterior es un reconocedor que solo determina si una oración pertenece al idioma. Es sencillo extenderlo a un analizador sintáctico que también construya un árbol de análisis , almacenando los nodos del árbol como elementos de la matriz, en lugar del valor booleano 1. El nodo se vincula a los elementos de la matriz que se utilizaron para producirlo, de modo que se construye la estructura del árbol. Solo se necesita un nodo de este tipo en cada elemento de la matriz si solo se va a producir un árbol de análisis. Sin embargo, si se van a conservar todos los árboles de análisis de una oración ambigua, es necesario almacenar en el elemento de la matriz una lista de todas las formas en que se puede obtener el nodo correspondiente en el proceso de análisis. Esto a veces se hace con una segunda tabla B[n,n,r] de los llamados punteros inversos . El resultado final es entonces un bosque compartido de posibles árboles de análisis, donde las partes comunes de los árboles se factorizan entre los distintos análisis. Este bosque compartido puede leerse convenientemente como una gramática ambigua que genera solo la oración analizada, pero con la misma ambigüedad que la gramática original y los mismos árboles de análisis hasta un simple cambio de nombre de los no terminales, como lo muestra Lang (1994) .
Análisis sintáctico de gramáticas libres de contexto que no son CNF
Como señalan Lange y Leiß (2009) , el inconveniente de todas las transformaciones conocidas a la forma normal de Chomsky es que pueden provocar un aumento indeseable del tamaño de la gramática. El tamaño de una gramática es la suma de los tamaños de sus reglas de producción, donde el tamaño de una regla es uno más la longitud de su lado derecho.para denotar el tamaño de la gramática original, el aumento de tamaño en el peor de los casos puede variar desdea, dependiendo del algoritmo de transformación utilizado. Para su uso en la enseñanza, Lange y Leiß proponen una ligera generalización del algoritmo CYK, "sin comprometer la eficiencia del algoritmo, la claridad de su presentación ni la simplicidad de las demostraciones" ( Lange y Leiß 2009 ) .
Análisis sintáctico de gramáticas libres de contexto ponderadas
También es posible extender el algoritmo CYK para analizar cadenas utilizando gramáticas libres de contexto ponderadas y estocásticas . En lugar de valores booleanos, los pesos (probabilidades) se almacenan en la tabla P, de modo que P[i,j,A] contendrá el peso mínimo (probabilidad máxima) con el que se puede derivar la subcadena de i a j a partir de A. Otras extensiones del algoritmo permiten enumerar todos los análisis de una cadena desde el peso más bajo hasta el más alto (de la probabilidad más alta a la más baja).
Estabilidad numérica
Cuando se aplica el algoritmo probabilístico CYK a una cadena larga, la probabilidad de división puede ser muy pequeña debido a la multiplicación de múltiples probabilidades. Esto se puede solucionar sumando los logaritmos de las probabilidades en lugar de multiplicarlas.
El algoritmo de Valiant
El tiempo de ejecución en el peor de los casos de CYK esdonde n es la longitud de la cadena analizada y | G | es el tamaño de la gramática CNF G. Esto lo convierte en uno de los algoritmos más eficientes para el reconocimiento de lenguajes libres de contexto generales en la práctica. Valiant (1975) presentó una extensión del algoritmo CYK. Su algoritmo calcula la misma tabla de análisis que el algoritmo CYK; sin embargo, demostró que se pueden utilizar algoritmos para la multiplicación eficiente de matrices con entradas binarias (0-1) para realizar este cálculo.
Utilizando el algoritmo de Coppersmith-Winograd para multiplicar estas matrices, se obtiene un tiempo de ejecución asintótico en el peor de los casos deSin embargo, el término constante oculto por la notación Big O es tan grande que el algoritmo Coppersmith-Winograd solo vale la pena para matrices demasiado grandes para manejar en las computadoras actuales ( Knuth 1997 ) , y este enfoque requiere resta y, por lo tanto, solo es adecuado para el reconocimiento. La dependencia de la multiplicación eficiente de matrices no se puede evitar por completo: Lee (2002) ha demostrado que cualquier analizador sintáctico para gramáticas libres de contexto que funcione en tiempopuede convertirse eficazmente en un algoritmo que calcule el producto de-matrices con entradas 0-1 en el tiempo, y esto fue extendido por Abboud et al. [ 4 ] para aplicarse a una gramática de tamaño constante.
Véase también
Referencias
- ↑ Grune, Dick (2008). Técnicas de análisis sintáctico : una guía práctica (2.ª ed.). Nueva York: Springer. pág. 579. ISBN 978-0-387-20248-8.
- ↑ Itiroo Sakai, “Sintaxis en la traducción universal”. En Actas de la Conferencia Internacional de 1961 sobre Traducción Automática de Idiomas y Análisis Lingüístico Aplicado, Her Majesty's Stationery Office, Londres, págs. 593-608, 1962.
- ↑ Sipser, Michael (2006). Introducción a la teoría de la computación (2.ª ed.). Boston: Thomson Course Technology. Definición 2.8. ISBN 0-534-95097-3OCLC 58544333
- ↑ Abboud, Amir; Backurs, Arturs; Williams, Virginia Vassilevska (2015-11-05). "Si los algoritmos de clique actuales son óptimos, también lo es el analizador sintáctico de Valiant". arXiv : 1504.01431 [ cs.CC ].
Fuentes
- Sakai, Itiroo (1962). Sintaxis en la traducción universal . Conferencia Internacional de 1961 sobre Traducción Automática de Idiomas y Análisis Lingüístico Aplicado, Teddington, Inglaterra. Vol. II. Londres: Her Majesty's Stationery Office. págs. 593–608 .
- Cocke, John ; Schwartz, Jacob T. (abril de 1970). Lenguajes de programación y sus compiladores: notas preliminares (PDF) (Informe técnico) (2.ª ed. revisada). CIMS , NYU .
- Hopcroft, John E.; Ullman , Jeffrey D. (1979). Introducción a la teoría de autómatas, lenguajes y computación . Reading/MA: Addison-Wesley. ISBN 0-201-02988-X.
- Kasami, T. (1965). Un algoritmo eficiente de reconocimiento y análisis sintáctico para lenguajes libres de contexto (Informe técnico). AFCRL . 65-758.
- Knuth, Donald E. (14 de noviembre de 1997). El arte de la programación informática, volumen 2: algoritmos seminuméricos (3.ª ed.). Addison-Wesley Professional. pág. 501. ISBN 0-201-89684-2.
- Lang, Bernard (1994). "El reconocimiento puede ser más difícil que el análisis sintáctico". Comput. Intell. 10 (4): 486– 494. CiteSeerX 10.1.1.50.6982 . doi : 10.1111/j.1467-8640.1994.tb00011.x . S2CID 5873640 .
- Lange, Martin; Leiß, Hans (2009). "¿CNF o no CNF? Una versión eficiente pero presentable del algoritmo CYK" . Informatica Didactica . 8 .
- Lee, Lillian (2002). "El análisis sintáctico rápido de gramáticas libres de contexto requiere una multiplicación rápida de matrices booleanas". J. ACM . 49 (1): 1– 15. arXiv : cs/0112018 . doi : 10.1145/505241.505242 . S2CID 1243491 .
- Sipser, Michael (1997). Introducción a la teoría de la computación (1.ª ed.). IPS. pág . 99. ISBN 0-534-94728-X.
- Valiant, Leslie G. (1975). "Reconocimiento general libre de contexto en menos de tiempo cúbico" . J. Comput. Syst. Sci. 10 (2): 308– 314. doi : 10.1016/s0022-0000(75)80046-8 .
- Younger, Daniel H. (febrero de 1967). "Reconocimiento y análisis de lenguajes libres de contexto en tiempo n 3 " . Inform. Control . 10 (2): 189– 208. doi : 10.1016/s0019-9958(67)80007-x .
Enlaces externos
- Visualización interactiva del algoritmo CYK
- Demostración de análisis de CYK en JavaScript
- Exorciser es una aplicación Java para generar ejercicios en el algoritmo CYK, así como en máquinas de estados finitos, algoritmos de Markov, etc.
- Algoritmos de análisis sintáctico