2011. július 13.

Nyelvi modellezés, házilag


Ismeretes, hogy a számítógépek alapvetően még mindig nem értik az emberi nyelveket, de ezt az apró hiányosságot azzal ellensúlyozzák, hogy nagyon gyorsan tudnak számolni. A gépi fordítás, az internetes keresés vagy éppen Watson sikere bizonyítja, hogy a statisztikai alapú megközelítés járható út, nem kell mindenáron “megértetni” a géppel a szövegek jelentését. Ebben a posztban arról lesz szó, hogyan dolgozza fel a gép a szöveget, és egy házi készítésű magyar nyelvi modellt is bemutatok.



A statisztikai alapú megközelítésről már szó esett Zoli posztjában, amelyben Peter Norwig helyesírás-ellenőrző programját szabta át a magyar nyelvhez.  Csak egy mondatban: a program nagy mennyiségű szöveg alapján egy adott karaktersorról valószínűségi alapon eldönti, mely szónak lehet a reprezentációja (vagyis: mely szót akartuk valóban begépelni)

Pontosan ugyanezt a módszert lehet használni akkor is, ha nem szavakról és elgépelésekről, hanem például internetes keresésről van szó: az elgépelt szó helyébe képzeljük a keresési kifejezést, a “nagy mennyiségű szöveg” helyébe pedig minden egyes dokumentumot. Ugyanúgy, mint Norwig helyesírás-ellenőrzőjénél, a legjobb keresési eredmény az a dokumentum lesz, amely “nyelvi modellje” a leginkább megfelel a keresési kifejezésünknek -- ez az ún. query likelihood model. (nagy különbség persze, hogy a helyesírás-ellenőrzőnél pontos eredményeket várunk, míg az internetes keresésnél nem kell lennie “tökéletes” dokumentumnak, csak “jóknak” és “kevésbé jóknak”, amelyek közül választhatunk)

Nyelvi modell alatt tehát azt az adathalmazt értjük, amely minden egyes dokumentum (vagy helyesírás-ellenőrzés esetében a teljes korpusz) egyes elemeinek előfordulási valószínűségeit tartalmazza.

A statisztikai alapú nyelvi modellezés arra is használható, hogy kitaláljuk: “mire gondolt a költő”, vagyis előrejelezzük a mondatban következő szavakat. Ez rendkívül hasznos lehet beszéd- vagy írásfelismerésnél, és a gépi fordítás első lépése is ez. A fentiek ismeretében ez elég egyszerű feladatnak tűnik, hiszen csak annyit kell tenni, hogy megkeressük az éppen adott szövegrészlet összes lehetséges változatát, majd kiválasztani közülök a legmagasabb pontszámot elérőt.

Az “Itt az idő, most vagy” mondat szinte biztos, hogy a “soha” szóval fog folytatódni. Ha rendelkezünk a teljes magyar nyelvet tartalmazó korpusszal (ilyen nincs és nem is lehet), akkor ezt nem lesz nehéz kitalálnunk. Ha azonban a korpuszunk véletlenül nem tartalmazza a Nemzeti dal szövegét, akkor bajban leszünk. Ezért a gyakorlatban a következő szót nem a megelőző teljes szövegből, hanem csak a megelőző néhány szóból, vagyis a megelőző n-gram-ból találjuk ki. Ehhez annyit kell tennünk, hogy a korpuszunkban található összes n-gramból kiválasztjuk azokat, amelyek illeszkednek az adott szövegrészlethez. Minnél hosszab n-gramokkal dolgozunk, annál szebben hangzó, realisztikusabb mondatokat kapunk – ennek azonban az az ára, hogy egyre hatalmasabb (a szó szoros értelmében) korpuszt kell használnunk. Intuitív módon az is belátható, hogy hogy a legtöbb szó csak a megelőző néhány szóval áll kapcsolatban, így nem is nagyon érdemes túl nagy n-gramokat használni.

Kipróbáltam, hogy a fenti elképzelés mennyire működik a gyakorlatban. A következő program a korpuszban található szöveg alapján létrehozza a két megadott szóval kezdődő összes mondatot (pontosabban, adott hosszúságú szósorozatokat), majd ezeket valószínűség alapján rangsorba állítja. A mondatokat a program úgy generálja, hogy az összes lehetséges kombinációban egymás mögé fűzi az egymáshoz illeszkedő trigrammokat.

Először lássunk néhány eredményt:

.
.
.
az ember azt hitte hogy az asszony még mindig a 2480544000
az ember azt hitte hogy nem is volt az oka 2543616000
az ember azt hitte hogy az ember még mindig nem 2778624000
az ember azt hitte hogy nem is volt az öreg 2826240000
az ember azt hitte hogy nem is volt ez az 2826240000
az ember azt hitte hogy nem is volt és a 2882764800
az ember azt hitte hogy még nem volt az a 3187296000
az ember azt hitte hogy nem is látta hogy a 3290112000
az ember azt hitte hogy az már nem is volt 3306700800
az ember azt hitte hogy nem is volt az utolsó 4521984000
az ember azt hitte hogy az ember azt hitte hogy 4976640000
az ember azt hitte hogy nem tudta hogy ez a 5419008000
az ember azt hitte hogy az asszony még mindig nem 5730912000
az ember azt hitte hogy nem is volt az egyetlen 7065600000
az ember azt hitte hogy nem is olyan volt mint 7122124800
az ember azt hitte hogy nem is volt ez a 8761344000
az ember azt hitte hogy nem is volt az első 9043968000
az ember azt hitte hogy nem is volt az egész 9043968000
az ember azt hitte hogy nem is volt az a 12718080000

.
.
.
azt gondolta hogy a legrosszabb az volt hogy a poroszok 244325760
azt gondolta hogy a költő most már nem is a 265224960
azt gondolta hogy a költő most már nem is olyan 265224960
azt gondolta hogy a költő most már nem is igen 299819520
azt gondolta hogy a költő most már nem is tudom 322882560
azt gondolta hogy a háború ez a gondolat hogy a két 323243200
azt gondolta hogy a háború ez a gondolat hogy a császár 323243200
azt gondolta hogy a legrosszabb az volt hogy a két 325767680
azt gondolta hogy a legrosszabb az volt hogy a császár 325767680
azt gondolta hogy a költő most már nem is volt 530449920

Ezek tehát azok a mondatok, melyeket a program az “az ember” illetve “azt gondolta” kezdet után a legvalószínűbbnek tart. Fontos még egyszer kiemelni: ezek a mondatok ebben a formában nem szerepelnek a szövegben, ezek a szöveg alapján létrejövő lehetséges és legvalószínűbb kombinációk. Látható, hogy nyelvtanilag többnyire rendben vannak – ha bigram-modellel dolgoznánk, sokkal rosszabb lenne a helyzet. Ebben a formában természetesen a program használhatatlan, hiszen nehezen lehet elképzelni olyan szituációt, ahol két szó alapján kellene tíz szóig előrejelezni egy mondatot. A valóságban a következő két-három szó előrejelzése lehet hasznos (vö. pl. Google javaslatok), amihez ez a modell már használható, ugyanis a rangsorolás a teljes mondat valószínűsége alapján történik: minden egyes trigram előfordulásának gyakorisága beleszámít a pontszámba.

A módszerünknek azonban van néhány nagyon gyenge pontja: először is, a korpusz mérete. A fenti eredmények egy 8 megabájtos szöveg alapján készültek. Ez kb. egymillió szó, de csak kb. 10.000 különféle trigramm – ez rettenetesen kevés, ennél több nagyságrenddel többre volna szükség. Ami ennél is bántóbb: az elosztlás természetesen a már máshonnan is ismert Zipf-törvényt követi, így néhány nagyon gyakori elem mellett a többség csak néhányszor fordul elő. Harmadszor pedig, már a 8 megabájtos korpuszon való számolgatás is sok időt igényel, az átlagos futási idő fél-egy perc. Egyszóval, a statisztikai alapú nyelvfeldolgozás számítási igénye ÓRIÁSI.

(folyt.köv., és egy következő posztban a kód részletesebb bemutatására is sor fog kerülni)




Nincsenek megjegyzések: