2011. július 25.

Nyelvi modell a gépi fordításban

A nyelvi modell fogalma kapcsán elkezdtünk betévedni a statisztikai alapú gépi fordítás sűrű sötét erdejébe. Most tovább folytatjuk a matematikai formulákkal és irdatlan méretű korpuszokkal kikövezett utat.


Az előző posztban már felmerült, hogy a fordítás nem egyértelmű művelet, ezért van értelme jó és “nem annyira jó”, valószínű és kevésbé valószínű fordításokról beszélni. Egy orosz mondat lehetséges  magyar fordításai közül az összeshez lehet rendelni egy értéket, aszerint, mennyire ítéljük jónak az adott fordítást.


Példa: Tolsztoj mondatának melyik fordítása fog több pontot kapni?

A boldog családok mind hasonlók egymáshoz, minden boldogtalan család a maga módján az.

A rendbenlévő családok kábé mind ugyanolyanok, de ha gáz van, akkor az mindenhol más.

Minden egyes pontszámot jelöljünk a következőképpen:

P (HU | RU)

Ez a feltételes valószínűség egyezményes jele (a valószínűségszámításba érdekes és játékos bevezető olvasható a Head First Statistics könyvben!). Az jelenti, hogy egy adott RU esemény mellet adott HU esemény bekövetkezésének mekkora esélye van. Emberi nyelven: mennyi esélyt adunk az adott fordításnak, mennyire ítéljük azt jónak. Világos, hogy az lesz a legjobb magyar mondat, amire ez az érték a legmagasabb, azt kell kiválasztani. Az előző posztokban már láttuk, hogy létezik olyan algoritmus, amivel többé-kevésbé el tudjuk választani a teljesen értelmetlen mondatokat az értelmesektől, ugyanezt itt is lehet alkalmazni.

Az igazán érdekes az, hogy annak az elgondolásnak, miszerint “sok rossz fordításból kiválogatjuk a jól hangzókat”, gyönyörű matematikai igazolása van. A Bayes-szabály megmondja egy feltételhez kötött esemény és annak az inverze közti összefüggését:



(levezetését szintén olvashatjuk a Head First Statistics-ben, igazán egyszerű!)

Ugyanezt felírhatjuk a mi esetünkre:

P(HU | RU) = P(RU | HU) x P(HU) / P(RU)

Világos, hogy ha a bal oldalt maximalizálni akarjuk, az ugyanaz, mintha a jobb oldalt maximalizálnánk. A nevezőben szereplő P(RU) érték nem fog szerepet játszani ebben, mert ez fix (ugyanis az orosz mondatunkat előre adott), így tőle eltekintünk. A formulánk, amit maximalizálni akarunk tehát:

P(HU | RU) = P(HU) x P(RU | HU)

Ez annyit tesz, hogy az a magyar fordítás jóságában (ez a bal oldal) két faktor fog szerepet játszani:

- a magyar mondat valószínűsége, “jólhangzósága” [P(HU)]. Ez a nyelvi modell. Ez felel azért, hogy a lehető legjobb mondatot válasszuk ki.

- a P(RU | HU) érték, amit fordítási modellnek hívunk. Ő felel a sok “nem annyira jó” fordításért. (Kissé értelmetlennek tűnhet első látásra, hogy visszafordítsuk a magyar mondatot oroszra és ezt értékeljük, mondhatnánk, hogy semmivel sem vagyunk előrébb. Pedig igen, de erről majd később.)
A fenti formula ugyanazt jelenti, mint az a mondat, hogy: “sok rossz fordításból kiválogatjuk a jól hangzókat”
Egy példa: legyen egy olyan fordítási algoritmusunk, ami semmi mást nem csinál, csak kicseréli az összes orosz szót azoknak a magyar megfelelőire (egyszerűen megnézi a szótárban). Világos, hogy ez így nem jó, mert a szórend nem feltétlenül ugyanaz a két nyelvben. Olyan lesz, mintha valaki nagyon tört magyart beszélne. Az összes lehetséges fordítást úgy kapjuk meg, ha ezeket rossz fordításokat felírjuk az összes lehetséges sorrendben (permutációban). Melyiket válasszuk? Azt, amelyik a legnagyobb P(HU) értéket kapja. A P(HU) pedig az a nyelvi modell, amivel osztályozhatjuk egy adott mondat jólhangzóságát. Mint már korábban írtuk, a modell az alapján osztályoz, hogy a mondatban előforduló szókombinációk mennyire jellemzők a magyar nyelvre (ehhez egy jó nagy tanulókorpuszt használ).

Példa:

szerzője cikk A áll hadilábon helyesírással a.


Valószínűleg egy nem túl nagy korpusz is elég lenne a fenti szókupac újrarendezéséhez, mivel mind “a cikk szerzője”, mind a “hadilábon áll” elég gyakori szókapcsolatok a magyar nyelvben.

Problémák az n-gram modell körül

Az előző írásokban már szó esett arról, hogy a nyelvi modellt érdemes legalább 2-gram, de inkább 3-gram alapon felépíteni; és persze minél hosszabbak az n-gramok, annál jobb.

De számoljunk egy kicsit: képzeljünk el egy csupán 2000 szóból álló nyelvet (nem túl realisztikus, igaz?). Az összes lehetséges 2-gram száma 2000x2000, vagyis 4 millió,  az összes lehetséges 3-gram száma 8 milliárd... természetesen a szavak nem fordulnak elő az összes lehetséges kombinációban, ami kicsit csökkent a számokon, másfelől viszont az n-gramok eloszlása is a Zipf-törvényt követi. Ez azt jelenti, hogy bizonyos kombinációk extrém gyakran fordulnak elő, mások szinte sose. Hatalmas méretű korpuszokra van szükség, és még ezekben sem fog minden lehetséges kombináció előfordulni.

Ez nagyon nagy baj. Az előző posztunkban szereplő nyelvi modell úgy adott értéket egy mondatnak, hogy az őt alkotó n-gramok valószínűségeit összeszorozta. Ha egy mondatban egy olyan n-gramot talál, amely nem szerepel a korpuszban, 0-val szoroz, vagyis automatikusan a kukába küldi az adott fordítást, legyen az akármilyen jó is. És ilyen eset előfordulhat, hiszen ki tiltja meg nekem, hogy kitaláljak olyan nyelvtanilag helyes mondatot, amit azelőtt még senki nem mondott?

A megoldások sokfélék lehetnek, itt most Kevin Knight kiváló bevezetőjében olvashatót ismertetem (ezt értettem meg:) Ún. smoothing-ot, vagyis simítást kell alkalmaznunk. Ez azt jelenti, hogy a meglévő, hiányos elemeink tulajdonságai alapján próbálunk következtetni egy nem létező elem tulajdonságára. Knight ezt javasolja:

b(z | x y) = 0.95 * number-of-occurrences(“xyz”) / number-of-occurrences(“xy”) +
                 0.04 * number-of-occurrences (“yz”) / number-of-occurrences (“z”) +
                 0.008 * number-of-occurrences(“z”) / total-words-seen +
                 0.002

Az x,y,z itt az adott trigram szavait jelentik. Ha egy adott trigram létezik, akkor nagyon jó, de ha nem, akkor is kap pontszámot: az utolsó két szavából készített bigramm előfordulási valószínűségét. Ha bigrammot sem találunk, akkor megnézzük az utolsó szó előfordulási valószínűségét a teljes korpuszon. És most következik a legjobb: ha a szó egyáltalán nem fordul elő, akkor is kap egy nagyon kis értéket, azért, hogy egy eddig nem látott szó miatt nem dobjunk ki egy adott esetben akár nagyon is jó fordítást. A szorzók természetesen változhatnak, sőt, kell is változniuk, további részletek a Knight írásában.

 
Források és részletesebb olvasnivaló:

Keving Knight élvezetes stílusú, de komoly bevezető workbook-ja:
http://www.isi.edu/natural-language/mt/wkbk.rtf

Michael Nilsen: Introduction to Statistical Machine Translation
Rövidebb és érthető áttekintés a témáról
http://michaelnielsen.org/blog/introduction-to-statistical-machine-translation/

Franz Och, a Google Translate vezető kutatója mesél a Google Translate-ről (YouTube videó)
http://www.youtube.com/watch?v=y_PzPDRPwlA

 

Nincsenek megjegyzések: