2011. december 4.

Számítógépes nyelvfelismerés

A számítógépes nyelvfelismerés problémája abból adódik, hogy rendelkezésünkre áll egy bizonyos számú karaktersorozat, amelyről el kell tudnunk dönteni, hogy vajon, milyen nyelvű szöveget takarhat. - Ez a feladat egy olyan környezetben, ahol több nyelvű szöveget is fel kell tudnunk dolgozni, nagyon lényeges. Hiszen ez az első lépés meghatározhatja azt, hogy megfelelő nyelvű elemzőket kezdjük-e használni vagy sem. Ez pedig meghatározhatja a végeredményt, az eredményes szövegfeldolgozást.


Problémák

Első felvetendő probléma a kapott szöveg mennyiségével kapcsolatos. Például egy szóról nehéz eldönteni, hogy milyen nyelvű. Az nyelvfelismerő rendszerek 90%-a biztosan hibás eredményt adhat, ha a szöveg mennyisége nagyon alacsony, hiszen a mennyiség nem teszi lehetővé több vizsgálat elvégzését, hogy az eredményességet biztosíthassuk.

A másik probléma az a feladat típusából következik. Csupán karakterek állnak a rendelkezésünkre ahhoz, hogy egy adott szövegről eldönthessük, hogy milyen nyelvű a szöveg.

A harmadik megemlítendő probléma, hogy természetesen, ezek a rendszerek is kijátszhatóak. Természetesen egy ilyen rendszer, amely eldönteni, hogy a tárgyszöveg milyen nyelvű, nem állítja ezzel párhuzamosan azt is, hogy ez valóban az adott nyelvű szöveg-e. Csupán arra szorítkozik, hogy a szöveg külső tulajdonságai arra a feltevésre engednek következtetni, hogy ez egy bizonyos nyelven íródott. Hogy az adott nyelven ez helyes-e, van-e értelme, ez kívül esik a vizsgálat tárgyán.

Módszerek

A problémát sok módon próbálták és próbálják megoldani. Mindegyik megoldási javaslat eredményes egy bizonyos szintig. De mindig az adott esetben kell tudnunk eldönteni, hogy a célunk elérése érdekében mekkora pontosságot kívánunk.

Speciális karakterek vizsgálata

Az egyik legegyszerűbb módszer, ha elkezdjük figyelni a karaktereket. Például vegyük a magyar nyelvet. Vegyük a magyar nyelv ábécéjének halmazát és vonjuk ki belőle a latin karaktereket. Ha kész vagyunk, rendelkezésünkre állnak azok a speciális karaktereket, amelyek elkülöníthetik a magyar a többi nyelvtől. - Ha ezek után a bejövő adatra, arra szövegre, aminek a nyelvét kívánjuk megállapítani megvizsgáljuk, hogy tartalmazza-e a magyar speciális karaktereket, akkor ebből az eredményből azt még nem fogjuk tudni kiolvasni, hogy ez egy magyar nyelvű szöveg. De azt biztosan állíthatjuk, hogy például nem angol vagy német szövegről van szó.

Ez a módszer természetesen csak nagyobb szövegen működik és a módszer valójában inkább kizáró módszer. A kizárásos módszer valódi hátránya pedig abból áll, hogy ezeket az ismeretek, pl. a speciális karaktereket nekünk kell összegyűjteni. Illetve, ha össze is gyűjtjük az összeset, akkor is lesznek teljes egyezések, ahol nem tudunk majd dönteni. Továbbá, talán a leglényegesebb ellenérv, hogy az eredményt befolyásolni fogja a feladat megvalósítása, a kódolás is. Akarva-akaratlanul lesznek olyan döntések, amelyek egy nyelv felismerését valószínűbbé teszik egy másikhoz képest. Ezzel elferdítve az eredményt.

Karakterek tartománya

Egy fokkal jobb megoldás. A módszer itt már nem a speciális karaktereket kikeresgetésével kezdődik. Ehelyett inkább veszünk egy adott nyelvű szöveget, amiről biztosan tudjuk, hogy az adott nyelven íródott. (Hogy ezt honnan tudjuk... itt már lehet egy buktató.) A vizsgált szövegre ráeresztünk egy programot, ami semmi egyebet nem csinál, mint megvizsgálja az összes karakter Unicode értékét. Ha rendelkezésünkre áll az összes karakter unicode éréke, akkor megvizsgálhatjuk ennek minimum és maximális értékét, ezzel megkapjuk az adott nyelvre jellemző Unicode-tartományt.

A tartomány ismeretében a módszer azonos a speciális karakterek vizsgálatával. A különbség csak az, hogy itt azt vizsgáljuk, hogy a karakterek melyik tartományban vannak benne. - Ez a módszer lényegében tényleg megegyezik az előzővel. Előnye csupán az, hogy valamivel pontosabb eredményt adhat. Főleg, ha jobban beleássuk magunkat a Unicode kódolásba. Bár nem minden nyelvhez ad támpontot, de a tartományok szabályosak. Például az arab és kínai nyelvet így nagyon könnyen megkülönböztethetjük. Ahogy egyből tudunk szűkíteni a kelet-európai nyelvekre is csupán a tartományok ismeretével. - Ha mi magunk nem szeretnénk tartományokat gyűjteni, akkor itt megleshetjük, hogy mely tartomány melyik nyelveknek felel meg. (Unicode Codepoint Chart)

N-gram-ok

Ez a módszer tűnik a legeredményesebbnek. Viszont ahelyett, hogy én próbálnám összeszedni, inkább Vázsonyi Miklós Nyelvdetekció Rejtett Markov Modell Alkalmazásávalcímű munkáját javaslom olvasásra. Tizenegy oldalon keresztül nagyon érthetően és kimerítően mutatja be a témát.

Egy-két működő megoldás

A továbbiakban inkább néhány működő megoldásra szeretnék koncentrálni.

NLTK és nyelvfelismerés

Ez a rövid leírás és kód azt mutatja be, hogy hogyan lehet felhasználni az NLTK trigramm modulját arra, hogy bizonyos nyelveket fel tudjunk ismerni. A példában öt nyelv felismerését mutatja be a szerző.

Google's Compact Language Detector

A cikk és a forráskód a Chrome böngésző nyelvdetekciós eljárást mutatja be. Ez a modul fut a Chrome böngészőkben, hogy felismerje az éppen böngészett oldal nyelvét. Természetesen van itt egy nagy segítség. Egy honlapon, a honlap fejlécében az esetek zömében megtalálható az oldal nyelve is. - De természetesen nem lehet minden ilyen egyszerű! - Úgyhogy a fejléc vizsgálatán túl a szöveget is meg kell vizsgálni. A vizsgálat pedig lehetővé teszi, hogy böngészőnk felkínálja, hogy szeretnénk-e lefordítani az aktuálisan böngészett oldal tartalmát.

Language-detection

Ez a Java-ban implementált programkönyvtárat beépíthetjük saját programunkba, vagy használhatjuk egyből a konzolból. A program nagy előnye, hogy nyíltforráskódú és könnyen bővíthető. A language-detection jó választás lehet a számunkra, ha csak szeretnénk kipróbálni vagy saját projektünket szeretnénk bővíteni.

1 megjegyzés:

ocs írta...

ebben a Vázsonyi Miklós-féle leírásban sajnos vannak bizonyos pontatlanságok... egyrészt ebben a formában ez a Markov-modell egyáltalán nem rejtett, másrészt az alkalmazásakor az input sorozat valószínűségét kell kiszámítani, ami egy (vagyis több) sima szorzás, itt nincs szükség viterbire. itt elég jól le van írva, plusz néhány más hasonló módszer is.