Algoritmo CYK
En informática, el algoritmo Cocke-Younger-Kasami (alternativamente llamado CYK, o CKY) es un algoritmo de análisis de contexto- gramáticas libres publicadas por Itiroo Sakai en 1961. El algoritmo lleva el nombre de algunos de sus redescubridores: John Cocke, Daniel Younger, Tadao Kasami y Jacob T. Schwartz. Emplea análisis de abajo hacia arriba y programación dinámica.
La versión estándar de CYK funciona solo en gramáticas libres de contexto dadas en la forma normal de Chomsky (CNF). Sin embargo, cualquier gramática libre de contexto puede transformarse (después de la convención) en una gramática CNF que exprese el mismo lenguaje (Sipser 1997).
La importancia del algoritmo de CYK deriva de su alta eficiencia en ciertas situaciones. Usando gran notación O, el peor caso en el tiempo de funcionamiento de CYK es , donde es la longitud de la cuerda perseguida y es el tamaño de la gramática CNF (Hopcroft " Ullman 1979, pág. 140). Esto lo convierte en uno de los algoritmos de parsing más eficientes en términos de la complejidad asintotica peor, aunque otros algoritmos existen con mejor tiempo de funcionamiento promedio en muchos escenarios prácticos.
Forma estándar
El algoritmo de programación dinámica requiere que la gramática sin contexto se convierta en la forma normal Chomsky (CNF), porque prueba las posibilidades de dividir la secuencia actual en dos secuencias más pequeñas. Cualquier gramática sin contexto que no genere la cadena vacía puede ser representada en la CNF usando sólo reglas de producción de las formas , , y Donde es el símbolo de inicio.
Algoritmo
Como pseudocódigo
El algoritmo en pseudocódigo es el siguiente:
Deja la entrada es una cuerda I consistente en n caracteres: a1... an. Deja la gramática contiene r símbolos no definitivos R1... Rr, con el símbolo de inicio R1. Deja P[n,n,rSé una gran variedad de booleanos. Inicializar todos los elementos P a falso. Deja atrás[n,n,rSer una serie de listas de triples de backpointing. Inicializar todos los elementos atrás a la lista vacía. para cada uno s = 1 a n para cada uno producción unitaria Rv → as set P[1,s,vEs verdad. para cada uno l = 2 a n - Duración del lapso para cada uno s = 1 a n-l+ 1 -- Comienzo del lapso para cada uno p = 1 a l-1 - Partición del lapso para cada uno producción Ra → Rb Rc si P[p,s,b] y P[l-p,s+p,c] entonces set P[l,s,aEs verdad. Apéndice atrás[l,s,a] si P[n,1,1Es verdad entonces I es miembro del idioma retorno atrás - Por retrazando los pasos a través de la espalda, se puede construir fácilmente todos los árboles pares posibles de la cuerda.más retorno "no miembro del lenguaje"
Probabilistic CYK (para encontrar el parse más probable)
Permite recuperar el parse más probable dadas las probabilidades de todas las producciones.
Deja la entrada es una cuerda I consistente en n caracteres: a1... an. Deja la gramática contiene r símbolos no definitivos R1... Rr, con el símbolo de inicio R1. Deja P[n,n,rSé un montón de números reales. Inicializar todos los elementos P a cero. Deja atrás[n,n,rSer una serie de triples de backpointing. para cada uno s = 1 a n para cada uno producción unitaria Rv →as set P[1,s,vPr.Rv →as) para cada uno l = 2 a n - Duración del lapso para cada uno s = 1 a n-l+ 1 -- Comienzo del lapso para cada uno p = 1 a l-1 - Partición del lapso para cada uno producción Ra → Rb Rcprob_splitting = Pr(Ra →Rb Rc* P[p,s,b* P[l-p,s+p,c] si prob_splitting P[l,s,a] entonces set P[l,s,a= Prob_splitting set atrás[l,s,a* = * * si P[n,1,1] 0 entoncesencontrar el árbol del parse retrazando a través atrás retorno el árbol del parse más retorno "no miembro del lenguaje"
Como prosa
En términos informales, este algoritmo considera cada subestring posible de la cadena de entrada y conjuntos ser cierto si la subestring de longitud desde puede ser generado por el no-terminal . Una vez que ha considerado subestrings de longitud 1, sigue a subestrings de longitud 2, y así sucesivamente. Para subestrings de longitud 2 y mayor, considera cada posible partición del substring en dos partes, y comprueba si hay alguna producción tales que coincide con la primera parte y coincide con la segunda parte. Si es así, registra que coincide con toda la subestring. Una vez completado este proceso, la cadena de entrada es generada por la gramática si el subestring que contiene toda la cadena de entrada es igualado por el símbolo de inicio.
Ejemplo
Este es un ejemplo de gramática:
Ahora la frase come un pez con un tenedor se analiza utilizando el algoritmo CYK. In the following table, in , i es el número de la fila (a partir de abajo a 1), y j es el número de la columna (a la izquierda a 1).
S | ||||||
VP | ||||||
S | ||||||
VP | PP | |||||
S | NP | NP | ||||
NP | V, VP | Det. | N | P | Det | N |
ella | come | a | peces | con | a | tenedor |
Para legibilidad, la tabla CYK para P está representado aquí como una matriz 2-dimensional M que contiene un conjunto de símbolos no-terminales, tal que Rk está dentro si, y sólo si, . En el ejemplo anterior, desde un símbolo de inicio S está dentro , la frase puede ser generada por la gramática.
Extensiones
Generando un árbol de análisis
El algoritmo anterior es un reconocedor que solo determinará si una oración está en el idioma. Es simple extenderlo a un analizador que también construye un árbol de análisis, al almacenar los nodos del árbol de análisis como elementos de la matriz, en lugar del booleano 1. El nodo está vinculado a los elementos de la matriz que se usaron para producirlo, así como para construir la estructura de á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 mantener todos los árboles de análisis de una oración ambigua, es necesario almacenar en el elemento de matriz una lista de todas las formas en que se puede obtener el nodo correspondiente en el proceso de análisis. Esto se hace a veces con una segunda tabla B[n,n,r] de los llamados backpointers. 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 diversos 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 cambio de nombre muy simple de no terminales, como lo muestra Lang (1994)..
Análisis de gramáticas libres de contexto no CNF
Como señaló Lange & Leiß (2009), el inconveniente de todas las transformaciones conocidas en la forma normal Chomsky es que pueden llevar a una rubia indeseable en tamaño de 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. Uso para denotar el tamaño de la gramática original, el tamaño de soplado en el peor caso puede variar desde a , dependiendo del algoritmo de transformación utilizado. Para el 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 o la simplicidad de las pruebas" (Lange & Leiß 2009).
Análisis 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. Luego, los pesos (probabilidades) se almacenan en la tabla P en lugar de valores booleanos, por lo que P[i,j,A] contendrá el peso mínimo (máxima probabilidad) de que la subcadena de i a j se puede derivar de A. Otras extensiones de la El algoritmo permite enumerar todos los análisis de una cadena de menor a mayor peso (de mayor a menor probabilidad).
Estabilidad numérica
Cuando el algoritmo probabilístico CYK se aplica a una cadena larga, la probabilidad de división puede volverse muy pequeña debido a la multiplicación de muchas probabilidades. Esto se puede solucionar sumando la probabilidad logarítmica en lugar de multiplicando las probabilidades.
Algoritmo de Valiant
El peor caso en el tiempo de ejecución de CYK es , donde n es la longitud de la cuerda perseguida y latitudGtención es el tamaño de la gramática CNF G. Esto lo convierte en uno de los algoritmos más eficientes para reconocer en la práctica los lenguajes sin contexto general. Valiant (1975) dio una extensión del algoritmo CYK. Su algoritmo calcula la misma tabla de pares como el algoritmo CYK; sin embargo, mostró que los algoritmos para la multiplicación eficiente de matrices con 0-1-entries se pueden utilizar para realizar este cálculo.
Utilizando el algoritmo Coppersmith-Winograd para multiplicar estas matrices, esto da un peor tiempo de funcionamiento asintotico . Sin embargo, el término constante oculto por el Big O Notation es tan grande que el algoritmo Coppersmith-Winograd sólo vale la pena para las matrices que son demasiado grandes para manejar en las computadoras actuales (Knuth 1997), y este enfoque requiere resta y así es sólo adecuado para el reconocimiento. La dependencia de la multiplicación eficiente de la matriz no puede evitarse por completo: Lee (2002) ha demostrado que cualquier parser para gramáticas libres de contexto que funcione a tiempo se puede convertir eficazmente en un algoritmo que computa el producto de -Matrices con 0-1-entries en el tiempo , y esto fue ampliado por Abboud et al. para aplicar a una gramática de tamaño constante.
Contenido relacionado
Algoritmo de Dekker
Máquina de Turing no determinista
Modelo OSI