Végy egy vagon összetett szót, és próbáld meg egy programmal felszeletelni őket!

Egy korábbi írásomban, amiben a gyakoriságok jelentőségéről szóltama magyar magánhangzó-illeszkedésre kerestem statisztikai bizonyítékot. Azt találtam, hogy a magánhangzó-illeszkedés létezése még úgy is kimutatható, hogy az összetett szavakat nem bontjuk fel tagjaikra. Ez azért érdekes, mert az összetett szavak bármikor megsérthetik a magánhangzó-illeszkedést, nem tudunk olyan tendenciáról, hogy a magyar nyelv kerülné a mély hangrendű és magas hangrendű szótövekből álló összetételeket. Például nem áll az, hogy a lő- kezdetű összetételek utótagjai inkább magas hangrendűek lennének, vagy hogy a -por utótag inkább mély hangrendűeket követne. Abban az írásban azt írtam, hogy az összetett szavak automatikus felismerése nem egyszerű dolog, ezért nem is tettem rá kísérletet, és nem tudok olyan adatbázisról, amiben elég megbízható módon feltüntetik, hogy melyik szavak összetettek, és hogy azok milyen szótövekből állnak.

De persze maga a probléma engem is régóta érdekel, ezért nekiestem, és megpróbáltam legalább részben megoldani. Hogyan lehetne automatikusan felszeletelni a szavakat? Lehet, hogy éppen a magánhangzó-illeszkedést is számításba vehetnénk? Vagyis feltételezhetjük azt, hogy ha egy egybeírt szó elejének más a hangrendje, mint a végének, akkor összetett szóról van szó? És milyen más szempontokat lehetne felhasználni?

Amikor automatikusan akarunk valamilyen szabályszerűséget felfedezni vagy adatokat elemezni, akkor az az általános módszertani elv, hogy próbáljunk meg minél kevesebb előzetes tudást belevinni, minél kevesebb feltételezést használni. Nemcsak a sport kedvéért tartom ezt fontosnak, hanem azért is, mert az előzetes feltételezésekbe becsúszott hibák megsokszorozhatják annak az elemzésnek a hibáit, amihez felhasználjuk őket. Például ha mindenfélét feltételezünk az összetett szavak tagjainak szófaji hovatartozásáról, akkor a korábbi szófaji elemzésünk hibái sokszorosan jelenhetnek meg az összetett szavak elemzésében. Néha persze a fordítottja is előfordulhat, vagyis ebben az esetben az, hogy az összetett szavak elemzése rávilágít korábbi szófaji besorolások hibás voltára. Ennek ellenére én megpróbáltam minél kevesebb feltételezéssel élni az összetett szavak megtalálásánál. A hangrendet sem használtam, mert az amúgy is csak kb. az esetek felénél segíthet (a kéttagú összetételeknél a „magas + mély” és a „mély + magas” felépítésűeknél).

Az összetett szavak több szóból állnak

Nagyjából ennyit tételezhetünk fel első nekifutásból az összetett szavakról, hogy több szó egymásutánjának tekinthetők. Ezért először is vettem nagyon-nagyon sok szóalakot (kb. másfél milliót) – kb. 24 ezer szónak az alakjait. Ezeket úgy kaptam, hogy a majdnem másfél milliárd szavas Szószablya nevű webkorpuszból kikerestem a legalább 1000-szer előforduló szóalakokat, és kézzel még meg is szűrtem őket, hogy tényleg csak szavak maradjanak köztük (például kidobtam minden olyan szót, aminek a leírásában számjegy szerepelt). Kiszámoltam ezeknek a szóalakoknak az összes lehetséges két részre bontását, és ezeket jól eltároltam, de csak akkor, ha mind a két rész önálló szóként is előfordult a listában.

Megjegyzés: a két részre bontás bevezet egy hibalehetőséget (amit kiküszöbölnék, ha komoly célra kellene használnom ezt a módszert). Lehetnek ugyanis olyan három- vagy többtagú összetett szavak, aminek az első valahány vagy az utolsó valahány tagja nem fordul elő önálló (összetett) szóként, és így ezeket nem találtam meg. Például a háztűznéző szó esetében sem a háztűz, sem a tűznéző nem fordul elő önálló szóként, ezért ennek az összetettszó-voltát az algoritmusom nem ismerte volna fel. (Sovány vigasz, hogy ez a szó nem szerepelt az 1000 leggyakoribb között.)

A kapott felbontások még messze nem adnak értékelhető eredményt. Rengeteg olyan szó van, amit „véletlenül” fel lehetne bontani értelmes szavakra, mégsem összetett. Például a sok szó felbontható a s (mint kötőszó) és az ok szóra, pedig nem ezeknek az összetétele. De hogyan derülhetne ez ki az adatokból? Extra feltételezések nélkül sajnos sehogy, ezért kénytelen voltam valami kevés külső tudást mégis belevinni az elemzésbe, mert anélkül nem lehetett továbblépni.

Az elő- és utótagok több összetett szóban szerepelnek

Az talán nem túl merész feltevés, hogy az olyan nyelvekben, amik a szóösszetétel eszközével élnek, ugyanaz az előtag sok utótaggal előfordul, és ennek a fordítottja is igaz. És könnyű kimutatni, hogy a sok azért nem lehet az s szó és az ok szó összetétele, mert bár -ok utótagú összetételeket találunk (az eddig elvégzett, „vak” felbontások között), s- előtagúakat nemigen. Ennek megfelelően tehát meg lehet szűrni az eddig talált felbontásokat.

Ehhez a szűréshez a korábbi, magánhangzó-illeszkedésnél már használt fogalmat, a típusgyakoriságot használtam: az „igazi” előtagok sokféle utótaggal állnak, az „igazi” utótagok pedig sokféle előtaggal, ami azt jelenti, hogy azok a felbontások a legjobbak, amikben a szó első felével sokféle utótag jár együtt, és megfordítva. Mindkét tényezőt egy-egy számmal kellene jellemezni, és mivel mindkét számnak minél nagyobbnak kéne lennie, a kettő szorzatát használtam annak mérésére, hogy mennyire valószínű, hogy összetett szóról van-e szó.

Csakhogy a típusgyakoriságok igen nagy változatosságot mutathatnak, és félő, hogy ha a kettő közül az egyik nagyon nagy, akkor annak ellenére nagy értéket kapunk, hogy a másik nagyon kicsi. Például ha rengetegféle -ok utótagú öszetételt találunk, akkor hiába van nagyon kevés olyan, amiben mintha az s- lenne az előtag, a két szám szorzata túl nagy lesz, és azt fogjuk hinni, hogy a sok összetett szó. Ezért megpróbáltam elérni, hogy a típusgyakoriságokat egymással összemérhető számokkal jellemezzem. Ezt szakszóval úgy nevezik, hogy normalizált értékekre volt szükségem. Például ilyen normalizált érték lenne, ha biztosítani tudnánk, hogy 0 és 1 közé essen minden mérőszám.

A normalizálás nem nehéz feladat, ha tudjuk, hogy mi a minimális és a maximális lehetséges értéke egy számnak. Például a típusgyakoriság minimuma 0 (a mi esetünkben persze 1, mert legalább egyféle felbontásnak léteznie kell ahhoz, hogy egyáltalán foglalkozzunk egy feltételezett összetételi taggal), a maximuma pedig az előfordulási gyakoriság. Ha ugyanis minden típus pontosan egyszer fordul elő, akkor a típus- és az előfordulási gyakoriság megegyezik. Így tehát ha azt a számot, hogy egy előtag hányféle utótaggal fordul elő (vagy hogy egy utótag hányféle előtaggal), elosztjuk azzal, hogy egyáltalán hányszor fordul elő, egy 0 és 1 közötti számot kapunk. De – ahogy az előző, a magánhangzó-illeszkedéssel foglalkozó írásban elmagyaráztam – a gyakoriságokat általában logaritmikus skálán szoktuk mérni, én a típusgyakoriságnak a logaritmusát osztottam el az előfordulási gyakoriság logaritmusával. (Házi feladat: Iskolai tanulmányaink alapján lássuk be, hogy mindegy, milyen alapú logaritmust használunk, ha mindenütt ugyanaz a logaritmus alapja.)

Így tehát kaptam egy 0 és 1 közötti számot, ami azt jellemzi, hogy mennyire sokféle utótag fordul elő egy előtaggal, és egy másikat, ami a fordítottját méri. Ezt a két számot egymással megszoroztam, és azt vettem észre, hogy ha a szorzat meghaladja a kb. egy századot, akkor már nagyon valószínű, hogy tényleg összetett szóról van szó (így például a sok felbontása s-re és ok-ra már kihullik a lehetséges felbontások közül).

De sajnos még így is sok olyan felbontás marad, ami nem lehetne összetett szó a magyarban. Például vannak olyan toldalékok, amik véletlenül önálló szóként is léteznek, és ezek az eddig felbontásaink alapján lehetséges utótagnak minősülnek. Például a hatás vagy a vetés felbontható lenne („hat + ás”, „vet + és”), hiszen az ás is meg az és is létező szavak. Hogyan lehetne kiszűrni ezeket a felbontásokat? Sajnos csak úgy, hogy további előzetes tudást vetünk be.

Büntető szóvicc csak úgy, ajándékbaFotó: Tóth Róbert Jónás / qubit.hu

A magyarban szóvégi toldalékok vannak

Az a plusz tudás, amit felhasználtam, két részből áll. Az első, hogy a magyar toldalékoló nyelv, méghozzá a toldalékok (a leg- kivételével) a szavak végén vannak. A második pedig az, hogy az összetett szavak végén ugyanolyan toldalékok lehetnek, mint az utótagjuk végén. Ezzel ki lehet szűrni az olyan felbontásokat, mint a „hat + ás”, mert az ás-nak mint igének egész más toldalékai vannak, mint a hatás-nak, ami főnév; vagy mint a „vet + és”, mert az éskötőszónak egyáltalán nem szoktak toldalékai lenni, míg a vetés-nek főnévre jellemző toldalékai vannak. Sőt, még az olyan eseteket is kiszűrhetjük ennek alapján, mint a „fél + elem”, mert az elem szót mint főnevet másképpen toldalékoljuk, mint az -elem képzőt (pl. elemet, de félelmet).

Hogyan lehet számszerűsíteni azt, hogy hasonló toldalékok állhatnak-e egy szó (az egész feltételezett összetett szó) és egy másik (a feltételezett utótag) után? Ha a sport kedvéért nem használunk szóalak-elemző programot (bár létezik ilyen, például az e-magyar oldalon hozzáférhető az egyik legjobb), akkor egyszerűen megnézhetjük, hogy milyen szóalakok kezdődnek az egyikkel, és milyenek a másikkal, és ezeket összevethetjük. Én elég jó eredményeket értem el ezzel az egyszerű módszerrel.

Nincs más hátra, mint számszerűsíteni a lehetséges végződések hasonlóságát. Gyakorlatilag arról van szó, hogy két számsorozatot kell öszehasonlítanunk. A számsorozatok azt fejezik ki, hogy milyen végződés hányszor követheti az illető szótőt (minden egyes szám egy-egy végződésnek felel meg, tehát olyan hosszúak a számsorozatok, ahány végződést egyáltalán találunk valamelyik szó után). Két számsorozat hasonlóságát többféleképpen is mérhetjük, az egyik mérőszám az ún. korrelációs együttható, a másik pedig az ún. koszinusz-hasonlóság. (Ráadásul ez a két mérőszám össze is függ egymással.) Én az utóbbit használtam, mert egyszerűbb számolni.

Arról van szó, hogy minden számsorozatot egy vektornak tekintünk. Ezek pont olyan vektorok, mint amilyenekről az iskolában tanultunk, de az iskolában csak kétdimenziós vektorokkal foglalkoztunk, míg itt annyi dimenzió van, ahány lehetséges végződés. Úgy képzeljük el, hogy minden vektorunk a koordináta-rendszerünk origójából indul, és azt a pontot írja le a számsorozatunk, ahova a vektor mutat (annyi dimenzióban, vagyis koordinátával, ahányféle végződés van). És akkor két ilyen vektor hasonlóságát nagyon jól jellemzi, hogy milyen szöget zárnak be egymással: Ha kicsi a szög, akkor nagy a hasonlóság, a derékszög annak felel meg, hogy teljesen függetlenek egymástól, és minél nagyobb tompaszöget zárnak be, annál inkább éppen ellenkező irányba mutatnak. Ha azonos vektorokról van szó, akkor a szög nagysága 0, ennek koszinusza 1, ez a maximális hasonlóság. Ha 180 fokot zárnak be, vagyis pont ellenkező irányba mutatnak, akkor a koszinusz –1, ez a minimális hasonlóság. Minden egyes felbontásnál wzzel a koszinusz-értékkel szoroztam meg azt a számot, amit a korábbi szempontok alapján kiszámoltam.

Illusztráció: Kálmán László / qubit.hu

Az így kapott felbontások már nagyon meggyőzőek, nagyon kevés hibát eredményeznek. A kb. 24 ezer kiinduló szótőből 6386 minősült összetett szónak. Ezekből gyorsan kiválasztottam véletlenszerűen harmincat, közülük csak kettő volt téves felbontás: füst + öl és fon + tol. Ez típushiba, amivel egyelőre nem tudok mit kezdeni: ha az egész szó ige, és fel lehet bontani úgy, hogy a második fele is ige legyen, akkor az algoritmus összetettnek fogja „gondolni”, hiszen nem tudhatja, hogy a magyarban (az igekötős igéktől és hasonlóktól eltekintve) nincsenek összetett igék.

Ilyen gyors ellenőrzést a másik oldalról is elvégeztem: találomra kiválasztottam harminc összetett szót, és megnéztem, hogy az algoritmus megtalálta-e őket. Itt már sokkal rosszabb lett az eredmény, tíz meg nem talált összetett szót találtam közöttük. Ezek néhány típusba sorolhatók, tehát ha javítani kellene az algoritmust, akkor nyilván ezeket kellene külön „megtámadni”. Az egyik jellegzetes hiba az, amikor az elő- vagy az utótag nem igazán önálló szó, pl. bel + terület vagy kormány + köziidő + köziember + öltő. A másik típus nagyon érdekes, olyan szavak tartoznak ide, amik összetett szóból vannak képezve (és a hagyományos szabályok szerint ők maguk is összetettek), pl. szerződés + kötésiállat + orvosi. Ezeknek a képző nélküli változatát megtalálta az algoritmus, de az -i képzőst nem tudta felbontani. Végül van olyan is (a harminc találomra kiválasztottból kettő), ami igazi, érthetetlen hibának minősül (hely + ismeret és státusz + törvény). Egyelőre nem sikerült rájönnöm, hogy ezeket miért nem bontotta fel az algoritmus, de amint rájövök, értesíteni fogom az olvasókat.

A szerző nyelvész, az MTA Nyelvtudományi Intézetének főmunkatársa. További írásai a Qubiten itt olvashatók