2012. január 2.

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

Miután elméletben felvázoltunk egy lehetőséget arra, hogyan lehet párhuzamos, kétnyelvű korpuszban egymásnak megfelelő nyelvi elemeket találni, ideje kipróbálni, hogyan működik az elképzelés a valóságban: egyfajta automatizált szótár-írásra szeretnénk a számítógépet rábírni.


Bemutattunk egy módszert, amely elméletileg képes megkeresni a kétnyelvű szövegben az egymásnak megfelelő szópárokat: a bootstrapping lényege az, hogy sokszor ismételve az algoritmust kialakul a teljes korpusz szintjén egy egyensúlyi állapot, amelyben minden szó a neki leginkább megfelelőhöz illeszkedik. Az algoritmusnak természetesen fogalma sincsen a jelentésekről, abból a naív feltételezésből indul ki, hogy ha egy szó sok angol nyelvű mondatban szerepel, akkor annak a magyar párja valószínűleg sok, azzal párhuzamos magyar mondatban is megjelenik.

A módszer viszonylag hibatűrő, mivel nem teljes bizonyosságra törekszik, csak valószínűségeket állapít meg: rossz minőségő bemeneti adat is adhat olyan eredményeket, amelyek alapján megkereshető a legkevésbbé rossz megoldás.

A nyelvi adat pedig nagyon is rossz minőségű: sok szó az egyik vagy a másik nyelvben eltűnik vagy megjelenik (segédszavak, kötőszavak, stb), sok szónak vannak szinonímái, és ugyanannak a szónak több alakja is létezik. A magyar esetében ez különösen így van, hiszen ragozó nyelvről van szó.

Ezért először is a bemenő adatokon érdemes elvégezni egy szótövezést (egy stemming-et). Érdekes megfigyelni, hogy míg enélkül egy magyar nyelvű szöveg 2-3 szor annyi szóformát tartalmaz, mint egy angol, a stemming után a szóformák száma nagyságrendileg megegyezik. Én ehhez az NLTK-ba beépített snowball stemmer-t használom (se magyarul, se angolul nem tökéletes)

A program és az eredmények előtt néhány szót kell ejteni az adatokról is: a próba a BME MOKK által létrehozott (és itt szabadon hozzáférhető: ftp://ftp.mokk.bme.hu/Hunglish2/ ) Hunglish korpusz egy kis részén történt, nevezetesen a számítógépes programok üzeneteit tartalmazó adatokkal, körülbelül 6 MB szöveggel. Ebben a szövegben nagyon gyakoriak a visszatérő szavak, így ez viszonylag hálás teszt-anyag. A programunk egy sqlite adatbázist generál, amely az egymásnak valamely mértékben megfelelő szópárokat, illetve a megfelelés valószínűségét tartalmazza (ez utóbbi a negyedik oszlopban szereplő tört).




Ezen kívül kapunk még két táblát arról is, hogy melyik szó összesen hányszor fordul elő a korpuszban -- ezek is fontos adatok:




A táblákba kicsit belelapozva látható, hogy az eredmények messze nem tökéletesek, de valamiféle rend felfedezhető bennük. Tapasztalat, hogy egy bizonyos korpuszméret alatt teljesen használhatatlanok az eredmények; 6MB körül már kezd bizony rend mutatkozni. Kérdés, vajon tízszer ekkora korpusz mit mutatna -- sajnos, a korpuszméret szűk keresztmetszet: 6 MB bemenő adatot feldolgozni körülbelül 3 órába tellik.

Most pedig lássuk magát a programot. Ez a fő ciklus, amely a lényegi munkát végző függvényt meghívja:


Ez pedig a bootstrap() függvény, amely működését az előző posztban már bemutattuk. Gyakorlatilag az ott szereplő pszeudokód megvalósítása python nyelven.

A teljes, működő program ezen a linken tekinthető meg -- a kódot többnyire kommentáltam.


(működni nem fog, mert bemenetként egy másik program által generált sqlite fájlt kér -- ha valaki nagyon szeretné otthon futtatni, kérésre elküldök mindent)

Már megjegyeztük, hogy az egyik szűk keresztmetszet a futási idő; a másik a mondatok hossza. Belátható, hogy egy bizonyos mondathossz után a lehetséges permutációk száma használhatatlanul nagyra nő. Ezért nem írjuk fel az összeset, csak egy részüket -- ily módon egy mintát veszünk az összes lehetséges változat halmazából, és reménykedünk, hogy az elég reprezentatív lesz. A harmadik problémás rész a szavak egymásnak való megfeleléseit tartalmazó mátrix mérete -- ennek nagy része amúgy is nullákat tartalmaz, amit egyszerűen felesleges tárolni. Jelenleg egy elég csúnya, barkács-megoldás szerepel a kódban, ennél elegánsabb módszernek is kell léteznie.

Nincsenek megjegyzések: