2011. november 5.

Gépi fordítás -- a kétnyelvű korpusz feldolgozása 2

A számítógépes fordítás nagy kérdése, milyen szabályok alapján lehet átalakítani az egyik nyelven írt szöveget egy másik nyelvű szöveggé. A statisztikai alapú megközelítés ahelyett, hogy morfológiai és szintaktikai szabályok mentén dolgozná át a szöveget, a fordítás műveletére úgy tekint, mint egy fekete dobozra, amely működését meg kell jósolni. Minél jobban kiismerjük, annál jobban előrejelezhetjük, vagyis: magunk is tudunk fordításokat előállítani. A probléma az, hogy a nyelv annyira bonyolult rendszer, hogy nagyon nehéz egyértelmű, "hu=t(en)" szerű szabályokat megfogalmazni.

Az egyértelmű szabályok helyett sokall inkább valószínűségekkel találkozunk a fordításban, ami azt is jelenti, hogy minél több tanuló-adat áll rendelkezésünkre, annál jobban kiismerhetjük ezeket a valószínűségeket. Ez azt is jelenti, hogy sokat kell számolnunk -- ahogy az az előző posztban is láttuk már.

Nézzük meg a következő, kétnyelvű "korpuszt" (direkt egyforma hosszú minden mondat, hogy ez se okozzon fejfájást):

simon fekete kutya   simon black dog
szép fekete kutya    nice black dog
nagy kutya           big dog
a kutya okos         dog is clever
a fekete szép szín   black is nice color


Ha nem tudunk (és a számítógép nem tud) se magyarul, se angolul, egyáltalán nem egyértelmű, melyik szó melyiknek a megfelelője. Ezen az egyszerű, próba-szövegen a szórend általában (de nem mindig) megegyezik, de egy "valódi" szövegben ez szinte biztos, hogy nem így van. A kérdés tehát az, hogyan találjuk ki, melyik szó melyiknek a megfelelője. Egyből felmerül az is, hogy vannak olyan szavak, amelyeknek nincs is megfelelője: pl. az "a" névelőnek és az "is" létigének. A mi eszmefuttatásunk ezek felett most átsiklik, és a számítógépre bízza, mit kezdjen velük -- a statisztikai alapú megközelítésben ez nem is feltétlenül probléma, hiszen nem a tökéletes, hanem az elérhető és viszonylag valószínű megoldást keressük.

Az előző posztban már láttuk, hogyan lehet "kézzel" kiszámolni és megoldani egy ilyen problémát. Most ugyanezt úgy fogalmazzuk meg, hogy könnyen átírható legyen számítógépre is -- pszeudokód következik.

A fő program így fog kinézni:

t-mátrix: a szavak egymáshoz való viszonyát tartalmazza, l. előző poszt. Minden kezdeti értéke megegyezik.
csináld n-szer:
    t-mátrix=bootrstrap(t-mátrix)


A t-mátrix kezdeti értékei mind megegyeznek (mondjuk, 0.5), mivel semmi sem tudunk az angol-magyar szavak egymáshoz való viszonyáról, mindegyik lehet mindegyiknek a fordítása. A bootstrap függvény elkezd számolni, és reményeink szerint egy nem-homogén t-mátrixxal tér vissza. Ezekkel az adatokkal újra meghívjuk, és ezt megismételjük addig, amíg nem látunk szabályszerűséget.

A bootstrap függvény ezt csinálja:

végighalad soronként a mondatpárokon
    felírja az angol nyelvű mondatot az összes lehetséges sorrenden
    végighalad ezeken a változatokon
        kiszámolja, mennyire jó az elrendezés
        (a t-mátrix adatai alapján)
        elmenti ezeket az értékeket egy "pontszám" nevű listába
    normalizálja a "pontszám" listát
    végighalad az angol mondat változatain
        a normalizált pontszámokat visszaírja egy új-t-mátrixba (összeadás)
    soronként normalizálja az új-t-mátrixot
visszatérés az új-t-mátrix értékével


* * *

Lássuk, körülbelül mit várhatunk ettől az algoritmustól:



Miután háromszor lefutott a bootstrap függvény, a t-mátrxiban már jól látszik, mely szó melyiknek a megfelelője. A szavak után következő értékek azt mutatják, ez mennyire valószínű -- például szép-nice párosítás jó eséllyel helyes, de a nagy-big ennél is valószínűbb. Ebben az egyszerű kis korpuszban minden szó megtalálta a saját párját, és ha tovább folytatnánk a program futtatását, 1-hez tartana az összes érték -- vannak azonban olyan korpuszok (minden "igazi" korpusz ilyen), ahol nincs egyértelműség, egyes szavak egyszerűen nem találják meg a saját párjukat, vagy éppen rossz párt találnak (ezt már mindenki tapasztalhatta a google translate-tel).


* * *

Ez az algoritmus rendkívül számításigényes. Már a három, egymásba ágyazott ciklus sem túl bizalomgerjesztő, de az igazi probléma a "változatok", vagyis a mondatok permutációinak a felírása. Ilyen rövid mondatoknál ez természetesen nem probléma, de nagyon gyorsan azzá válik: egy hat szó hosszú mondat 720 féle (6!) változatban írható fel, egy 10 szót tartalmazó már 3,6 millió-féle módon, és hamarosan kifogyunk a memóriából, az algoritmus pedig elviselhetetlenül sokáig fut. A t-mátrix is okozhat gondokat, hiszen elméletileg angolszavak*magyarszavak számú eleme van, ami egy rendes korpusz esetében százmilliós nagyságrendet jelent.

A következő poszt arról fog szólni, hogyan lehet mégis rávenni a számítógépet, hogy valódi, vagyis nagy mennyiségű és bonyolult adattal is megbírkózzon. Terítékre kerülnek az olyan kellemetlen kérdések, mint az adatok tárolásának a mikéntje, a véletlenszerű mintavétel, és végre fog szerepelni futtatható kód is.



       

Nincsenek megjegyzések: