SFST

A Programozás Wiki wikiből

Sfst a Stuttgart finite state transducer (véges állapotú átalakító), transzduktor angol kifejezésből képzett rövidített név. Egy véges állapotú transzduktor egy nyelv szavait képezi le, például a ragozott szavakat alapszóra (analízis) és fordítva, azaz alapszó+ragok -> ragozott szó (szintézis).

Az SFST-PL morfológiai programozási nyelv. Segítségével emberi nyelvekre lehet morfológiai elemzőket írni, melyeket aztán sokféle célra például

  • Helyesírásellenőrzés
  • Helyesírás-helyesbítő-eszköz
  • Fordítás
  • Szövegelemzés
  • Lemmatizáló (szógyök találás szótározáshoz)
  • Szófajelemző (POS tagger)
  • Ige és főnévragozó
  • Nyelvfelismerés és elemzés
  • Beszédfelismerés
  • Kiejtés-modellezés
  • Elektronikus szótárak segédeszköze

és sok más célra lehet fölhasználni.

Az SFST alapvetően reguláris kifejezések analizátora, hasonlóan a perl vagy awk programozási nyelvekhez, azonban azoktól eltérően emberi nyelvek analízisére szakosodott nyelv. Minden SFST program egy vagy több úgynevezett transzduktort állít elő.

Használatának előnye és hátránya[szerkesztés]

Előnye a dedikált programokkal szemben, hogy a szabályok megírása és tesztelés után az eszköz automatikusan elvégzi az analízist és a szintézist is. Dedikált program esetén mind az analizátort, mind a szintetizátort meg kell írni és tesztelni kell. A hátrány abban van, hogy meg kell tanulni a(z egyszerű) nyelvet és a hibakeresést, annak furcsaságaival és váratlan reakcióival egyetemben.

Tipp[szerkesztés]

SFST használható szószedet nélkül is. Példa inflekció implementálásra szószedettel:

$noun-stems$ = "noun.lex"
$noun-inflection$ = ...
$inflected-nouns$ = $noun-stems$ $noun-inflection$

Ez viszont szószedet nélkül működik; nagybetűvel kezdődő szavakat ragoz:

$noun-inflection$ = ...
$inflected-nouns$ = [A-Z][a-z]* $noun-inflection$

Például lehet két verziót kompilálni, egyet szószedettel, egyet anélkül. Ha nem megy a szószedetes, a szószedet nélkülit is meg lehet próbálni.

Az fst-infl2 "-t" opciójával lehet különféle transzduktorokat kombinálni.

Példa használatára: Német utcanevek analízise, melyek gyakran "...gasse" vagy "...straße"-ra végződnek.

Fordítás és memóriafelhasználás[szerkesztés]

A fordítási idő lerövidítésére érdemes a fonetikát kezelő fájlokat külön fordítani. Ehhez:

  • A Makefile-ban meg kell adni, hogy az eredmény egy .a fájltól függ, pl.: tobbrag.a: tobbrag.fst ninfl1.fst phon1.a phon2.a
  • a phon fájlok bekötése így történik:
$morph42$ = "noun-reg42.lex" <Noun42>$CASEP$ || "<phon42.a>"
$morph43$ = "noun-reg43.lex" <Noun43>$CASEP$ || "<phon43.a>"
$morph$ = $morph41$ | $morph43$
ahol *.lex a szótárfájlok, $CASEP$ a ragozási transzduktor.
  • A phon fájlokban a végső transzduktor előállítását bontsuk le több lépésre:

Minden szabályhoz tartozik egy ALPHABET =, amely a beillesztendő értékeket adja meg

ALPHABET = ... <Nev1>:[ae<>] <Nev2> <Nev3>
$reg1$ = (feltétel1) <Nev1> <=> a
$reg2$ = (feltétel2) <Nev1> <=> e
$reg10$ = $reg1$ & $reg2$
ALPHABET = ... <Nev1> <Nev2>:[oö<>] <Nev3>
$reg3$ = (feltétel3) <Nev2> <=> o
$reg4$ = (feltétel4) <Nev2> <=> ö
$reg11$ = $reg3$ & $reg4$
Majd ehelyett:
$phon4$ = $reg10$ || ||$reg11$ || $duplicate1$ || $duplicate2$ || $a-to-aa$ || $e-to-ee$ || $delete-POS$
Így:
$phon4$ = $reg10$
$phon4$ = $phon4$ || $reg11$
$phon4$ = $phon4$ || $duplicate1$
$phon4$ = $phon4$ || $duplicate1$
$phon4$ = $phon4$ || $duplicate2$
$phon4$ = $phon4$ || $a-to-aa$
$phon4$ = $phon4$ || $e-to-ee$
$phon4$ = $phon4$ || $delete-POS$
$phon4$

Mindez korlátozza a memóriafelhasználást és függetleníti az egyes fonetika modulokat egymástól, és ezzel megkönnyíti a tesztelést.

Hivatkozás[szerkesztés]

Hasonló és rokon termékek[szerkesztés]

Alkalmazások[szerkesztés]