A CYK algoritmusról tényleg nagyon röviden
Az algoritmus egy alulról felfele történő elemzést valósít meg. Ahhoz, hogy működjön az kell, hogy a nyelvtan Chomsky normál alakban (CNF) legyen, azaz a nyelvtanban csak illetve szabályok vannak (meg esetleg az , de az most úgysem játszik). Ha egy n hosszú (ahol xi-k a betűk) szót szeretnénk elemezni, akkor egy nxn-es alsó háromszög mátrix alakú táblázatot fogunk kitölteni a következő módon. A sorokat alulról felfele számozzuk, az oszlopokat balról jobbra. Az i. sor j. kockájába akkor kerül a A nemterminálisa a nyelvtannak, ha az A-ból levezethető az elemzendő input szó azon darabkája, ami a j. betűnél kezdődik és i hosszan tart, vagyis levezethető az részszó. Ha kitöltjük a táblázatot és a legfelső mezőben szerepel a mondatszimbólum S az azt jelenti, hogy S-ből levezethető a szó az első betűtől az n.-ig, vagyis végig. Ha az S nem jelenik meg a legfelső kockában, akkor a szó nem eleme a nyelvnek. A táblázat kitöltése: Az első sor egyértelmű: azok a nemterminálisok kerülnek a k. mezőbe, akik egy lépésben a k. terminálist generálják egy alakú szabállyal. Későbbi sorok: egy A akkor lesz az i. sor j. oszlopában, ha belőle levezethető az szó. Mivel csak alakú szabályok vannak ezért ez csak úgy lehet, hogy a B megcsinálja -t (az elejét, valameddig), a C pedig -et (a maradékot). De ezt már le lehet ellenőrizni, mert ezek az információk a táblázat már kitöltött részében benne vannak. Tehát egy A-t akkor írunk be az i. sor j. kockájába, ha van olyan szabály, hogy B benne van a j. oszlop k. sorában valami k-ra, a C meg benne van a k+1. oszlop i-k. sorában. Ha nem csak arra vagyunk kíváncsiak, hogy generálni lehet-e a szót, hanem arra is, hogy hogyan, akkor nem csak a megfelelő nemterminálist írjuk be a táblázatba, hanem ellátjuk két indexszel is: az első mutatja, hogy milyen felbontásban generálja a BC sorozat a szórészletet (azaz, hogy a B hány darab betű generál, ez a fenti jelölésekkel a k), a második meg annak a szabálynak a száma, amit használunk (vagyis az szabály sorszáma, a szabályokat még az elején megszámoztuk, hogy lehessen rájuk hivatkozni). Az első index tulajdonképpen azt mutatja, hogy az így beírt A oszlopában hányadik sorban kell keresnünk a B-t, a szabály száma meg azt mutatja, hogy mit is kell keresnünk. Így a levezetési fa felépíthető. Ha ezen visszakeresés során elágazást tapasztalunk (azaz van olyan kocka, ahol két ugyanolyan, de más indexű nemterminális áll), akkor a szó nem egyértelműen áll elő. Ekkor a visszakeresős eljárás mindkét levezetési fát megadja. Egy példa végigszámolva, magyarázatokkal itt.
|