Algorithme de Cocke-Younger-Kasami

En informatique théorique et en théorie des langages, l’algorithme de Cocke-Younger-Kasami (CYK) est un algorithme d’analyse syntaxique pour les grammaires non contextuelles. Il permet de déterminer si un mot est engendré par une grammaire, et si oui, d’en donner un arbre syntaxique. L’algorithme est nommé d’après les trois personnes qui l’ont trouvé indépendamment, J. Cocke, dont l’article n’a jamais été publié, D. H. Younger et T. Kasami qui a publié un rapport interne aux US-AirForce.

L’algorithme opère par analyse ascendante et emploie la programmation dynamique. L’algorithme suppose que la grammaire est en forme normale de Chomsky. Cette restriction n’est pas gênante dans la mesure où toute grammaire non contextuelle admet une grammaire en forme normale de Chomsky équivalente. Le temps de calcul de cet algorithme est en





O


(



|



m




|




3









|



G



|



)




{\displaystyle O(|m|^{3}\cdot |G|)}


, où






|



m



|





{\displaystyle |m|}


est la longueur du mot





m




{\displaystyle m}


à analyser et






|



G



|





{\displaystyle |G|}


est la taille de la grammaire.

Sans perte de généralité, on suppose que la grammaire





G




{\displaystyle G}


n’engendre pas le mot vide





ϵ





{\displaystyle \epsilon }


. Ainsi, on peut supposer que la grammaire





G




{\displaystyle G}


est sous forme normale de Chomsky et qu’elle ne contient pas de règles de la forme





N






ϵ





{\displaystyle N\rightarrow \epsilon }


(on parle de grammaire propre, voir grammaire non contextuelle).

Soit





m




{\displaystyle m}


un mot non vide à analyser. L’algorithme emploie la programmation dynamique. Les sous-problèmes sont les suivants :





P


[


i


,


j


]




{\displaystyle P[i,j]}


est l’ensemble des non-terminaux qui engendrent le mot





m


[


i


.


.


j


]




{\displaystyle m[i..j]}


pour tout





i


,


j




{\displaystyle i,j}


tels que





1






i






j







|



m



|





{\displaystyle 1\leq i\leq j\leq |m|}







|



m



|





{\displaystyle |m|}


est la longueur du mot





m




{\displaystyle m}


.

On peut calculer les ensembles





P


[


i


,


j


]




{\displaystyle P[i,j]}







|



j






i



|





{\displaystyle |j-i|}


.

La figure à droite montre le cas de base et le cas récursif.

On en déduit un algorithme de programmation dynamique qui calcule tous les ensembles





P


[


i


,


j


]




{\displaystyle P[i,j]}


. Le mot





m




{\displaystyle m}


est engendré par la grammaire si et seulement si




S




{\displaystyle S}


est dans





P


[


1


,



|



m



|



]




{\displaystyle P[1,|m|]}






S




{\displaystyle S}


est l’axiome de la grammaire et






|



m



|





{\displaystyle |m|}


est la longueur du mot





m




{\displaystyle m}


.

Considérons la grammaire suivante en forme normale de Chomsky :

où l’ensemble des non-terminaux est





{


S


,


G


V


,


C


,


G


N


,


V


tenderizing marinade for steak,


P


,


N


,


D


e


t


}




{\displaystyle \{S,GV,C,GN,V,P,N,Det\}}


et l’ensemble des terminaux (lettres) est





{


e


l


l


e


,


p


o


i


s


s


o


n


,


f


o


u


r


c


h


e


t


t


e


,


m


a


n


g


e


,


d


u


,


u


n


e


}




{\displaystyle \{elle,poisson,fourchette,mange,du,une\}}


. Ici, « elle » s’appelle une lettre (bien que c’est un mot) et une phrase comme « elle mange du poisson avec une fourchette » s’appelle un mot.

Maintenant, analysons le mot





m




{\displaystyle m}


qui est la phrase « elle mange du poisson avec une fourchette » avec l’algorithme CYK. Dans la table suivante, on indique les valeurs de





P


[


i


,


j


]




{\displaystyle P[i,j]}


 :

Le mot « elle mange du poisson avec une fourchette » est reconnu car l’axiome





S




{\displaystyle S}


est dans





P


[


1


,


7


]




{\displaystyle P[1,7]}


.

Voici un pseudo-code inspiré de l’analyse de la section précédente :

On peut donner un pseudo-code qui montre la complexité cubique en






|



m



|





{\displaystyle |m|}


 :

Si la grammaire est pondérée, l’algorithme de CYK permet de générer l’arbre le plus lourd qui engendre la phrase.

La restriction qui consiste à avoir une grammaire en forme normale de Chomsky est essentiellement esthétique et Lange et Leiß discutent une variante de l’algorithme CYK avec des restrictions plus faibles.

L’algorithme CYK est en





Θ



(



|



m




|




3









|



G



|



)




{\displaystyle \Theta (|m|^{3}\cdot |G|)}


, où






|



m



|





{\displaystyle |m|}


est la longueur du mot à analyser et






|



G



|





{\displaystyle |G|}


est la taille de la grammaire en forme normale de Chomsky. Valiant donne une extension de l’algorithme CYK en





O


(



|



m




|




2.81









|



G



|



)




{\displaystyle O(|m|^{2.81}\cdot |G|)}


en adaptant l’algorithme de Strassen sur les matrices.

En utilisant l’algorithme de Coppersmith-Winograd pour multiplier les matrices, on atteint une complexité asymptotique de





O


(



|



m




|




2.38









|



G



|



)




{\displaystyle O(|m|^{2.38}\cdot |G|)}


. Mais la constante cachée dans la notation grand O fait que l’algorithme n’a pas d’intérêt en pratique. La dépendance sur un algorithme efficace pour multiplier des matrices ne peut pas être évitée dans le sens suivant : Lee a montré que l’on peut construire un algorithme pour multiplier des matrices 0-1 de taille





(


n


×



n


)




{\displaystyle (n\times n)}


en temps





O


(



n



3






ε




/



3




)




{\displaystyle O(n^{3-\varepsilon /3})}


à partir d’un analyseur pour des grammaires algébriques en





O


(



|



m




|




3






ε










|



G



|



)




{\displaystyle O(|m|^{3-\varepsilon }\cdot |G|)}


.

L’algorithme est exposé dans les ouvrages théoriques sur les langages formels.