Számítógépes mondatalkotás
avagy:
Hogyan tanítsuk meg a számítógépet angolul?
Jött egy ötletem, hogy írok egy olyan programot kedvenc Enterprise 128 számítógépemre, mely magától értelmes angol mondatokat alkot. Pontosabban, megadok sok angol szót, és ezeket felhasználva véletlenszerű, egyszerűbb mondatokat rak össze. Ennek látszólag semmi értelme. Viszont akiknek ilyen régi számítógépük van, azoknak érdekes lehet, hogy megnyomnak rajta egy gombot, és a gép csak ontja magából az angol mondatokat, amíg le nem lőjük. Az ötletet a fordítóprogramok (pl. Google Translate) adták. Abba nem is mertem belevágni, hogy olyan programot írjak, amely egyik nyelvről lefordít mondatokat egy másik nyelvre. Egy fordítóprogram részfeladata, hogy egyetlen nyelven alkot nyelvtanilag helyes mondatokat. Erre gondoltam tehát, amikor a számítógépes mondatalkotás felmerült bennem. Később még ezt is tovább lehet fejleszteni, hogy a mondatokat két nyelven is kiírja, esetleg azt a feladatot adja a felhasználónak, hogy az adott mondatot fordítsa le a másik nyelvre, majd a gép ellenőrzi, hogy helyesen fordította-e le. Ezt nyelvtanításhoz felhasználni nem rossz. Az viszont elsőre nagyon bonyolultnak tűnik, hogy egy beírt mondatot értelmezni tudjon a gép mondattanilag, és utána lefordítsa más nyelvre. Igaz, az angolban elég kötött a szórend, így még lehetne esélyünk, hogy a gépet rávegyük, hogy beazonosítsa az egyes mondatrészeket.
Érdekes kihívás tehát azt is megcsinálni, hogy csak angolul alkosson a gép véletlenszerű mondatokat adott szavak felhasználásával. Abból érdemes kiindulni, hogy minden mondatban van egy alany és egy ige. Így hát meg kell adni lehetséges alanyokat a gépnek, és lehetséges igéket, amiket véletlenszerűen egymás mellé tesz egy mondattá, közben figyelve a mondattani szabályokra.
Elsőre megadtam néhány lehetséges alanyt a gépnek: I, you, we, they, he, she, it, nobody, somebody, everybody, man, woman, girl, boy, engineer, stb. Ezeket egy tömbben letároltam, a gép majd véletlenszerűen elő tudja hívni a tömbből bármelyik szót, és elkezdhet vele mondatot alkotni.
Másodjára megadtam néhány igét a gépnek. Nyilván olyan igéket kellett keresnem, melyek értelmileg az előbb említett alanyok mellett állhatnak. Nem véletlen adtam meg lehetséges alanynak kizárólag személyeket jelölő szavakat. Ugyanis sok ige van, mely személyek mellett állhat, de tárgyak, fogalmak mellett nem igazán, például a sit, come, go tipikusan személyekre jellemző cselekvéseket jelöl. Elsőre sok lett volna a gépet arra is felkészíteni, hogy az alanyról felismerje, hogy az személyt, fogalmat vagy tárgyat jelöl-e. Hiszen pl. a peace, apple szóhoz nem kerülhet a sit, a like vagy a go ige (Nem mondjuk, hogy az alma ül vagy a béke szeret). A lényeg tehát, személyeket adtam meg lehetséges alanyként, igeként pedig olyan szavakat, melyek személyek mellett, mint állítmány, biztosan előfordulhatnak. Egyelőre elég, ha csak ezekből alkot mondatokat a gép. Később még lehet bővíteni a programot. A bővítés úgy történne, hogy a program rögtön az elején véletlenszerűen eldönti, személy, tárgy vagy fogalom legyen-e az alany, és ennek megfelelően átugorja a személyekkel kapcsolatos részt, és rögtön a table, chair, room, stb. szavak közül választ, és az azok mellé rendelhető igék közül. De itt még nem tartok, tehát személyekhez rendelhető igéket adtam meg: go, come, sit, walk, read, write, travel, eat, drink, be, have. Ezek közül a be és a have után még valami másnak (pl. melléknévnek) is jönnie kell, hogy értelmes legyen a mondat. A többi ige után nem kell feltétlen újabb bővítmény, hogy értelmes mondatot kapjunk. Például az I go, I write már önmagában értelmes mondat, bár lehetne bővíteni ezzel-azzal, az adott igétől függ, hogy mivel. A go után állhat a home, a write után the letter, a letter, a newspaper, viszont a go után nem állhat a the letter, és a write után a home sem. Nem lehetetlen azt sem megadni a gépnek, hogy egyes igékhez még milyen szavakat rakhat hozzá, de első körben ennél egyszerűbb programot akartam.
Nézzük meg, mit lehet kezdeni a fentebb megadott alanyokkal és igékkel egy programban! Legegyszerűbb lenne egymás mellé pakolni ezeket, pl.
I go.
You come.
We write.
They eat.
He drink.*
Girl be.*
Ezeket a program véletlenszerűen összeválogatja egymás mellé. Nem is rossz, viszont ha he, she, it, somebody vagy valamelyik főnév az alany, kell az igék végére s is! A lehetséges alanyok listája úgy kezdődik direkt, hogy I, you, we, they, ezek után nem kell az ige végére -s. Az összes többi, ez után következő alany után kell -s az ige végére. Gyakorlatilag csak annyit kell beprogramozni, hogy ha az alany az első négy valamelyike, akkor ne csináljon semmit az igével, de ha valamelyik következő, akkor az ige végére tegyen egy s betűt. Arra is figyelni kell, hogy a go végére es-t tegyen. A legegyszerűbb azt nézni meg, hogy az ige o-ra végződik-e, és ha igen, akkor ne s, hanem es legyen, amit a program a végére odatesz. Így ha később esetleg a do-val is bővítjük a programot, ott is es fog a végére kerülni. Problémás még a be és a have ige: ezeknél először is meg kell vizsgálni, melyik szó az alany. Ha az alany nem az első négy közül valamelyik a listában (I you, we they), akkor legegyszerűbb a be igét i-re írni át, melynek végére a többi igéhez hasonlóan úgyis odateszi a gép az s végződés. A have ige tövének pedig a ha szót kell megadni, ennek végére is odakerül az s. Ha az alany a listában az első szó (I), akkor a létigét am-ra kell átírni. Ha pedig a 2., 3. vagy 4. szavak egyike (we, you, they), akkor are lesz belőle. Így már az angolos mondatszerkezet felé közelít az eredmény:
He drinks.
Somebody eats.
Nobody goes.
Girl travels.*
Girl is.*
Boy has.*
They are.*
A főnevekkel még gond van, hiszen nem állhatnak valamiféle névelőszerűség nélkül. (Vannak olyan főnevek az angolban, melyek névelő nélkül is állhatnak, de most nem ilyenekkel van dolgunk.) Kéne itt a girl elé the, a, each, this, that vagy every, hogy a mondat helyes legyen. Ezen ne múljon! Az alanyok listájában elöl vannak a személyes névmások, ezek elé nem kell névelő vagy egyéb determináns. A listában ezután jönnek az egyéb névmások (somebody, nobody, everybody), ezek előtt sem kell névelő. A listában a 10. helytől kezdődően jönnek a főnevek, ezek elé névelő kell. Így a program csak megvizsgálja, hogy a 9. helynél feljebb van-e a kiválasztott alany, és ha igen, akkor véletlenszerűen elé teszi a the, a, each, this, that, every szavak egyikét. Az a névelőnél figyelni kell arra is, magánhangzóval kezdődik-e a szó, mert akkor an lesz helyette. Gyakorlatilag meg kell vizsgálni az alany első betűjét, és ha az a, e, i, o, u betűk egyike, akkor az a-t átírni an-re. Ez persze még nem bombabiztos módszer, hiszen pl. a unit szó csak írásban kezdődik magánhangzóval, és az hour szó elején a mássalhangzó néma, de egyelőre ezzel még ne foglalkozzunk. (Legegyszerűbb lenne magukat a kivételeket adni meg a program számára, tehát hogy ha magát a unit vagy az hour szót érzékeli, fordítva járjon el. Valószínű ezen a két szón kívül több kivétel is van, de nem lehet túl sok, így nem lehet nehéz mindet megadni a gépnek.) Így már több mondat lesz helyes, vagy kezd alakulni:
Each girl travels.
Every engineer eats.
An engineer comes.
The boy is.*
This woman has.*
Az utóbbi két mondat így ebben a formában önállóan nem fordul elő. (Bár szövegen belül előfordulhatnak, pl. The girl is not happy. The boy is. Vagy: That man hasn’t got a car. This woman has.) Így a programnak meg kell vizsgálnia, hogy a be vagy a have ige áll-e ott, és ha igen, akkor újabb programrésznél folytatni a mondatalkotást. Ha a létigét észleli, akkor lényegében választhat például a következő szavak közül, mint a mondat folytatása: happy, unhappy, sad, here. Ha pedig a have igét érzékeli, a következő folytatások közül választhat: a cat, a dog, a car, a house:
This boy is happy.
That girl is here.
Every engineer has a cat.
Each woman has a car.
I have a house.
Úgy gondoltam, kicsit még bővítem a programot. Ha az alany főnév, kerülhet elé jelző. Így gyűjtöttem néhány olyan melléknevet, melyek személyekre jellemzők lehetnek: pl. young, old, lazy, rich, poor, honest, forgetful, tired, intelligent. A gép véletlenszerűen dönt, hogy ha minimum 10. sorszámú az alany, akkor ezen jelzők valamelyikét az alany elé tegye. Vagy, ha „olyan kedve van”, egyiket se tegye oda, így még változatosabb mondatok készülhetnek. Az alany előtti névelőt csak azután választja ki a gép, miután a jelzőt már odatette, így az a, an alakja valóban a következő szóhoz fog igazodni. Külön meg kell adni, hogy a honest olyan, mintha magánhangzó lenne az elején, hogy ne az a, hanem az an kerüljön eléje. Így ilyen mondatokat kaphatunk:
This rich woman is happy.
Each tired engineer goes.
Every young boy has a car.
We eat.
He travels.
This man walks.
You have a dog.
Ezzel gyakorlatilag meg is valósítottunk egy programot, mely képes egyszerűbb mondatokat önállóan megalkotni a megadott szavakból. A megadott szavak listáját természetesen lehet bővíteni, de csak addig, amíg azokat véletlenszerűen összeválogatva szemantikailag is értelmes mondatot kapunk. Nem célszerű például a computer szót betenni az alanyok közé, mert pl. az Every computer has a dog mondat is kerekedhet belőle, ami nyelvtanilag helyes ugyan, de jelen valóságunk alapján értelmezhetetlen. Természetesen létezhetnek más valóságok, pl. mesében akár a számítógépeknek is lehet kutyájuk, de talán a programot nem kéne ebbe az irányba elvinni. Azonban foglalkozásokat jelölő főnevekkel (pl. teacher, hairdresser, policeman, director) bővíthetjük a lehetséges alanyok listáját, és az igék közé is tehetünk olyanokat, melyek személyekkel összepasszíthatók (pl. talk, speak, walk, stand, play, ask).
A programot lehet bővíteni, hogy az angollal párhuzamosan egy másik nyelven (pl. németül vagy olaszul) is megalkossa ugyanazt a mondatot. A másik nyelven is ugyanebben a sorrendben kell listázni az alanyokat és az igéket, de természetesen a program azokon már más szabályokat fog alkalmazni, mint amiket fent láthattunk. Problémát jelenthet még a főnév neme, amit valamilyen módon szintén meg kell adni a listában, hiszen a gép a természetes nemű főnevekről sem tud semmit. Előfordulhat, hogy egyes névelőként használt szavak (every, each stb.) nem angol megfelelője mellett nem egyes, hanem többes számot kell használni. Ilyenkor legegyszerűbb ezeket a névmásokat kivenni a listából, vagy pedig beprogramozni a gépet, hogy a többes számot is tudja képezni és a mondatban megfelelően kezelni. Ilyen egyszerű mondatoknál ez még nem akkora probléma.
Folyt. köv.!
Linkek:
Z80 Múzeum – Az Enterprise 128 számítógéppel foglalkozó oldal
Enterprise Forever – Internetes fórum az Enterprise 128 felhasználóinak
Tanítsuk meg a számítógépet zenét szerezni! – Zenéléssel kapcsolatos blogomon arról írtam, hogyan lehetne a számítógépet rávenni, hogy önállóan dallamot „találjon ki”.