
\chapter{Fejlesztői dokumentáció}

\section{Helyesírás-ellenőrzők ismertetése}

Számos helyesírás-ellenőrzésre szolgáló program,
illetve függvénykönyvtár áll a szabadszoftver-fejlesztők
rendelkezésére.

\subsection{Aspell}

Angol nyelvterületen a legkedveltebb helyesírás-ellenőrző
szabad szoftver az \emph{Aspell}, Kevin Atkinson munkája. Az Aspell
az angol nyelv fonetikai információinak
ismeretében egy speciális algoritmussal képes nagymértékű
alaki eltérések esetén is helyes javaslatot tenni.

Sajnos a programból hiányzik a nagy mennyiségű ragozási
szabály hatékonyan kezelésének képessége,
ezért nem megfelelő a magyar
és sok egyéb nyelv számára sem.

\subsection{Ispell}

Az Ispell egyenes ági leszármazottja  R. E. Gorin 1971-ben,
PDP-10-re assemblyben írt \emph{Spell} programjának.
A Spellt Pace Williamson írta át C nyelvre 1983-ban.
Geoff Kuenning 1987 és 1988 között nagyobb változtatásokat
eszközölt a kódon, amelynek számunkra legjelentősebb
lépése az affixum tömörítési technika bevezetése volt,
az affixum tömörítéssel ugyanis lehetővé vált
nagyszámú ragozási szabály futásidejű hatékony
kezelése is. Gyakorlatilag ennek köszönhető,
hogy az Ispellhez több tucat nyelv helyesírási szótármodulja
készülhetett el, köztük olyan agglutináló nyelveké, mint a finn
és a magyar.

A magyar nyelv vonatkozásában az is
kiemelhető, hogy az Ispell szabályozott szóösszetétel-képzési lehetőséggel
rendelkezik, vagyis a szóösszetétel-képzést korlátozhatjuk
a szavak egy bizonyos részhalmazára.

Az Ispell egyéb kiemelhető tulajdonságai:

\begin{itemize}
\item De facto szabvány a szabad szoftverek világában. 
A Free Software Foundation GNU fejlesztésének alapértelmezett
helyesírás-ellenőrzője, és a legtöbb Linux
terjesztésben is megtalálható.

\item A csőben használható felületének köszönhetően számos
programba ,,beágyazható'' (pl. Emacs, Kword, LyX).
\end{itemize}

\subsection{Pspell}

A Pspell függvénykönyvtár Kevin Atkinson kezdeményezése, ami
az Aspell és az Ispell előnyeit hivatott a forráskód
egybefogásával biztosítani.

\subsection{Myspell}

A Myspell az OpenOffice.org irodai programcsomaghoz
készült BSD licencű helyesírás-ellenőrző függvénykönyvtár.

2001-ben kezdte fejleszteni Kevin Hendricks azzal a
szándékkal, hogy a GPL licenc alatt is elérhetővé tett,
de a licencelt szoftverkomponensektől (mint a nyelvi
modulok) is megszabadított StarOffice -- új
nevén OpenOffice.org -- helyesírás-ellenőrzővel
rendelkezhessék.

A Myspell egy kicsi, C++-ban megvalósított program, amely
az Ispell tömörítési algoritmusán
alapszik és kis változtatással képes
az Ispell szótármodulok használatára is.

A Myspellnek az Ispell-lel szemben több határozott előnye van:

\begin{itemize}
\item Kicsi és áttekinthető: mivel csak a lényeget
tartalmazza, kiváló kiindulási alapot jelent egy
professzionális magyar helyesírás-ellenőrző
program elkészítéséhez.

\item A C++ nyelv megkönnyíti a keresztplatformos
C++-alapú fejlesztésekhez való integrációját.

\item Nagy mértékben hordozható, mivel
eleve Unix/Linuxra és Windowsra fejlesztik
egyidejűleg.

\item Szintén a hordozhatósággal kapcsolatos,
hogy a Myspell futásidőben állítja elő két egyszerű
szöveges állományból --
a ragozási szabálygyűjteményből (affixum állomány),
és a szótárállományból -- a működése során használt
speciális adatszerkezeteket. Ezzel szemben az Ispell
bináris adatállományokat használ, 
sőt az Ispell program fordítási idejű beállításaitól
függ, hogy futásidőben képes-e feldolgozni ezt
a bináris adatállományt, vagy sem.

\item Egy Unix/Linux, és Windows operációs
rendszerek alá készült professzionális irodai
programcsomag, az OpenOffice.org része, amely
szabad szoftverként minden felhasználó számára
elérhető ingyenesen, jogtisztán és korlátozások
nélkül.

\item Az említett vonzó tulajdonságok miatt
több közreműködő is folyamatosan fejleszti
a Myspellt. Így került bele a Myspell kódjába
egy jelentős sebességoptimalizáció, egy a javaslattevés
minőségét nagy mértékben növelő megoldás (javítási
cseretáblázat), valamint a hiányzó szóösszetétel-képzési lehetőség
és több kisebb hiba javítása.

\item Az említett szóösszetétel-képzési kiegészítés
javítja az Ispell egy bosszantó (bár kevésbé feltűnő) hibáját:
az Ispell egy szó ragozott alakját akkor is elfogadja
egy szóösszetételben, ha amúgy a tőszót nem
(pl. kutyaokos hibás, de kutyaokosnak elfogadott szóösszetétel).
\end{itemize}

\subsection{Mozilla Spell Checker}

A Myspell forráskódján alapuló ellenőrző.
David Einstein munkája. A Mozilla Spell Checker
jelentős sebességoptimalizációja visszakerült
a Myspellbe, és a tervek szerint a két
ellenőrző egyesülni fog a közeljövőben.

\subsection{Magyar Myspell}

A Myspell forráskódján alapuló GPL licencű ellenőrző,
amit 2002-ben kezdtem fejleszteni.

Először kisebb hibajelentések illetve foltok
készültek a Myspellhez, de később rákényszerültem
az idő és a támogatni kívánt nyelvek sajátosságai
ismeretének hiányában egy külön ág létrehozására.

A Magyar Myspell fejlesztés eredményeként került az eredeti
Myspell ágba, és az így az OpenOffice.org-ba is
a szóösszetétel-képzési lehetőség,
valamint a javaslattevés minőségét jelentős
mértékben emelő javítási cseretáblázat-kezelés.

A külön Magyar Myspell ág a következő fontosabb
tulajdonságokkal rendelkezik:

\begin{itemize}
\item A magyar helyesírás szabályai 138. számú
kötőjellel írási szabályához (3-6-os szabály) igazított
szóösszetétel-ellenőrzés.

\item Javaslattevés a szótárban nem szereplő
szóösszetételek esetén is.

\item A szókincs futásidejű bővítésének lehetősége.

\item Az újonnan felvett szavak továbbragozása egy
mintaként megadott tőszó alapján.

\item Javított javaslattevés nagybetűt tartalmazó szavakra.

\item A mássalhangzó-triplázások letiltása (sakkkör).

\item Cső felület a beágyazáshoz.

\item Ékezet nélküli szavak esetén helyes javaslattevés.

\item Hibásan írt szavak helyes szóösszetételként
való elfogadásának megakadályozása. Az egyes tőszavak
szóösszetételben való megjelenésének (és ezzel teljes
szóbokrok) letiltása helyett a javítási cseretáblázat
(esetleg a teljes javaslattevő modul)
felhasználásával megvizsgálható, hogy nem tipikus
hibáról van-e szó ritka szóösszetétel helyett.
(Ilyen hibás összetételek, amelyek korábban csak az egyik
tőszó teljes letiltásával vagy sehogy nem voltak
lekezelve: szervíz, vizitorma, birság, elitélt, vasárú,
tejles, szívéjes, karvaj, stb.)

\end{itemize}

Számos egyéb tulajdonság megjelenése a közeljövőben
várható:

\begin{itemize}

\item Kötőjeles és nagykötőjeles alakok ellenőrzése
a kötőjellel kapcsolt toldalékok, ikerszók, a
mozgószabály alapján egybeírt szóösszetételek,
földrajzi nevek, számnevek és nagykötőjelet tartalmazó
összetételek esetében.

\item Szóismétlések kiszűrése (esetleg opcionálisan).

\item Kötelező egybeírásra való figyelmeztetés (pl.
legalábbis, véghezvisz).
\end{itemize}

\subsection{OpenOffice.org}

Nem kifejezett helyesírás-ellenőrző, de a Magyar Myspell
fejlesztésének egyik kiemelt célpontja.

Az OpenOffice.org alapját képező StarOffice
a német StarDivision cég kereskedelmi terméke volt a
90-es években. A Sun Microsystems a céget és termékét felvásárolta
üzleti megfontolásokból. A cég 2000-ben GPL licenc mellett 
szabad szoftverré tette a StarOffice
nagy (a StarDivision által fejlesztett) részét.
A licencelt nyelvi eszközöktől, és adatbázis-technológiától megfosztott
program az OpenOffice.org nevet kapta (az OpenOffice védett név volt,
ezért a furcsa, a nyitott fejlesztés honlapjának címét hordozó
elnevezés). A Sun jelenleg kereskedelmi támogatással vállalati
ügyfelek számára az OpenOffice.org-on alapuló StarOffice-t
is biztosítja.

Az OpenOffice.org jellemzői:

\begin{itemize}
\item Professzionális irodai programcsomag
\item Kiváló Microsoft Office export, import szűrők
\item Nagy méretű, sok képet tartalmazó dokumentumok gyors kezelése.
\item GPL-es: ingyenes, módosítható, terjeszthető (illetve kettős licencelésű).
\item XML alapú saját fájlformátum (Java jar formátumú állományokban).
\item UNICODE támogatás, még ázsiai nyelvekhez is (mindkettő Sun fejlesztés)
\item A GPL licenc alá nem helyezhető licencelt részek fokozatos kiváltása
(\emph{lingucomponent} kísérleti fejlesztés: Myspell helyesírás-ellenőrző,
ALTLinux elválasztó modul, szinonimaszótár, nyelvhelyességi ellenőrzés).
\item Honosított: magyar helyesírás-ellenőrzés a Magyar Myspell
helyesírás-ellenőrző, és -javító programmal, és a Magyar Ispell
szótármodullal. Magyar elválasztás Mayer Gyula és Miklós Dezső
\texttt{huhyph.tex} \TeX\ elválasztási moduljával. Mintegy 20\,000 programfelirat
és -üzenet magyar fordítása.
\end{itemize}

A számos új funkció miatt is az OpenOffice.org sokáig
fejlesztői stádiumban volt. Mivel azonban a program meglepően
üzembiztos és jól használható, 2002-ben (marketing okokból is)
kibocsátásra került az 1.0-s elnevezésű változat.

A fejlesztői változat jelenleg
még az eredeti számozást használja (641D), de ez a számozás
várhatóan a közeljövőben megszűnik.

A Magyar OpenOffice.org változatai a \url{http://office.fsf.hu}
oldalon jelennek meg, a fejlesztői változatok a
\url{http://office.fsf.hu/work} könyvtárban találhatók. A Magyar
OpenOffice.org windowsos és linuxos változatai a OOo változatszám
mellett egy csomagszámot is kapnak (egymástól függetlenül).
Tehát pl. a legfrissebb linuxos Magyar OpenOffice.org
teljes ,,neve'': Magyar OpenOffice.org 1.0, 
43-as számú linuxos csomag.

\section{Az Ispell felépítése és működése}

Az Ispell adatállományai \texttt{.hash} kiterjesztéssel rendelkeznek, és
Unix/Linux alatt a \texttt{/usr/lib/ispell/} vagy \texttt{/usr/local/lib/ispell/}
könyvtárban kerülnek elhelyezésre.

Egy ilyen hash állomány (pl.\ a \texttt{magyar.hash}) két
fő részből áll: tartalmazza a (ragozási) osztályokba sorolt
ragozási szabályokat, és tartalmazza a tényleges hasítótáblát
is. A~hasítótábla tárolja a tőszavakat és minden egyes tőszónál
még az azon alkalmazni kívánt ragozási osztály vagy osztályok
kapcsolóit.

Egy Ispell hash-állomány a \texttt{buildhash} paranccsal állítható
elő, amely két állományt vár bemenetként: egy
ragozási szabályokat (és egyéb beállításokat) tartalmazó
affixum állományt és egy szótárállományt, amely a tőszavakat
és kapcsolóikat tartalmazza.

\subsection{Ragozási szabályok}

Az Ispell affixum állomány formátumát egy kézikönyvoldal (man 4
ispell) ismerteti részletesen. Itt most csak a ragozási szabályokat,
és az affixum tömörítés módszerét vizsgáljuk meg közelebbről.

Egy ragozási szabály nem más, mint egy feltételes
kifejezés, amely leírja, hogy milyen feltételek között
milyen módon helyezhetünk toldalékot egy alapszóhoz.

Az Ispell ragozási szabályainak leírása emlékeztet
a szabványos regex reguláris kifejezésekre, és
a következő fő jellemvonásokkal rendelkezik:

\begin{itemize}
\item A feltétel a tőszó utolsó (prefixum esetén első) legföljebb nyolc
karakterére vonatkozik.

\item A feltételben erre a legföljebb nyolc karakterre
vonatkozóan szerepelhetnek karaktertartományok is.

\item A toldalékolásnál a toldalék hozzáillesztése előtt
lehetőség van a tőszó végének leválasztására.
Itt viszont már nem használhatunk karaktertartományokat
(pontosan ismerni kell a leválasztandó karaktert vagy
karaktersorozatot).
\end{itemize}

Példák, amelyek bemutatják a ragozási szabályok szintaxisát.
(A kettős kereszt után sor végéig tartó megjegyzés
következik, amely már nem része a ragozási szabálynak.)

\begin{verbatim}
Z         >  Z        # ráz -> rázz
Z         >  ZÁL      # ráz -> rázzál
E D Z     >  ENEK     # edz -> edzenek, pedz -> pedzenek
[ÓUÚ]     >  VAL      # ló -> lóval, apu -> apuval, bú -> búval
[^AE]     >  NAK      # okos -> okosnak
.         >  KÉNT     # kutya -> kutyaként, okos -> okosként
A         >  -A,ÁNAK  # macska -> macskának
[^SD] Z I K >  -IK,Z  # barátkozik -> barátkozz
\end{verbatim}

Az első két példa jelentése, hogy Z betűre végződő tőszó
Z, és ZÁL toldalékkal rendelkező alakja is helyes (ez 
a kisbetűs alakokra is vonatkozik).

A harmadik példa szerint az EDZ betűsorozatra végződő
szavak ENEK toldalékot is kaphatnak.

A negyedik példában karaktertartományt adunk meg az utolsó
karakterre vonatkozóan: minden Ó, U, és Ú-ra végződő szó
VAL toldalékot kaphat.

Az ötödik példa komplementer karaktertartományt ad meg:
ha a szó nem A vagy E betűre végződik, megkaphatja a
NAK toldalékot.

A hatodik példa a tetszőleges karakter jelét, a pontot
mutatja be: bármely szó megkaphatja a KÉNT ragot.

A hetedik példa a tőszó végének levágását mutatja be:
az A-ra végződő szavak ÁNAK toldalékot kaphatnak a
szóvégi A levágásával.

Az utolsó egy kombinált példa: A nem SZIK, vagy DZIK végű,
de ZIK-re végződő szavak Z toldalékot kaphatnak
a szó végi IK levágásával. Így pl. a barátkozik$\rightarrow$barátkozz
helyes átalakítás, de a vakaródzik$\rightarrow$vakaródzz, illetve
mászik$\rightarrow$mászz már nem.

\subsection{Ragozási osztályok}

Az előző példák meglehetősen keverve tartalmaztak
különböző szófajú szavakra vonatkozó (és részben hibás)
szabályokat. Az Ispell ragozási osztályok kialakításának
lehetőségével biztosítja, hogy a tőszavakat a kategóriájuknak
megfelelő ragokkal láthassuk el. A ragozási osztályok
egy betűs (vagy egy karakteres) névvel rendelkeznek, amit
a továbbiakban kapcsolóknak nevezünk.

Példa két ragozási osztály definiálására:

\begin{verbatim}
flag A:

[^L] L  >  LAL  # pedál -> pedállal
[^L] L  >  LÁ   # pedál -> pedállá
L L     >  AL   # szakáll -> szakállal
L L     >  Á    # szakáll -> szakállá

flag B:

L       >  NAK  # szaval -> szavalnak
L L     >  ANAK # javall -> javallanak
\end{verbatim}

Az első osztály a mély hangrendű főnevek ragozásának
egy részletét mutatja, az L betűre végződő szavak -val
toldalékolását, míg a másik osztály a mély hangrendű
alanyi igeragozás egy részletét.

\subsection{Szótárállomány}

Az Ispell szótárállományban (.dict fájl)
egyszerűen felsoroljuk a tőszavakat, a megfelelő kapcsolókkal
ellátva:

\begin{verbatim}
macska/A/E/G
pedál/A/F
akar/B/C
szaval/B
legalábbis
\end{verbatim}

Látható, hogy egy tőszó tetszőleges számú
ragozási osztályba sorolható, de akár
ragozási osztályt sem kötelező megadni.

\subsection{Affixum tömörítés}

Minden ragozási szabályhoz egy 256 byte-ból álló
tömb kerül a hash állományba. A tömb szerepe, hogy
gyorsan eldönthető legyen egy ragozott szóról, hogy
az adott ragozási szabály alkalmazásával állt-e elő,
vagy sem. A tömb az ASCII karaktertábla elemeivel
indexelhető, és visszaad egy byte-ot, ami a már említett
8 karakterpozícióra vonatkozó előfordulási információkat
tartalmazza: pl. ha a tömb['A'] elem értéke binárisan
11111010, akkor a tőszóra nem alkalmazható
a ragozási szabály, ha a tőszó ,,A'' betűre végződik,
vagy a kettővel előtti pozíción is ,,A'' betű található.

A Myspell forráskódja részletesen dokumentálva tartalmazza
az affixum tömörítési algoritmust. Amiért itt említésre került,
az az, hogy az affixum tömörítés elnevezés nem
az affixum állomány kisebb méretre való tömörítésére utal,
hanem arra, hogy a lehetséges gyors adatszerkezetek
közül talán a legtömörebbet sikerült Geoff Kuenningnek
megtalálnia, gyakorlatilag a ragozási szabályokban szereplő
karaktertartományok hatékony tárolásával és kezelésével.

\section{Magyar Ispell}

A Magyar Ispell egy keretrendszer, amely magyar
affixum és szótárállományt állít elő az Ispell számára.
Az \texttt{i2myspell} program segítségével ezekből
az állományokból hozható létre a megfelelő Myspell affixum
és szótárállomány is.

\subsection{Történet}

A Magyar Ispell kialakítását 1998-ban kezdtem. 1999-re
a tárgyas igeragozás, néhány képzős toldalékolás, sok
határozószó és névutó kivételével a helyesírási-modul
hibákkal ugyan, de alapjaiban elkészült. A félkész
helyesírás-ellenőrzővel 1999-ben a Közművelődésügyi
Minisztérium és a Matáv által közösen
meghirdetett ,,A Magyarországi digitális kultúráért''
pályázaton is részt vettem, de sikertelenül.

1999 őszén a helyesírás-ellenőrzővel való munkát befejeztem,
az eredmények 2000 nyaráig, azonosítóm megszűntéig elérhetőek
voltak a \url{http://sol.cc.u-szeged.hu/~nemethl/} címen.

2001 őszén Szántó Tamás, a KDE grafikus felület magyar
honosítója felajánlotta a segítségét az ellenőrző
fejlesztésének folytatásához. Tamás folyamatosan tesztelte
az ellenőrzőt, számos (ragozási) típushibát megtalálva.
A tesztelések eredménye volt a szókincs jelentős bővítése is.

Tamás munkáját Bíró Árpád folytatta, elsősorban további
típus- és egészen különleges rejtett hibák feltárásával,
a matematikai és egyéb nyelvi modulok összeállításával
és a forrásállományok ellenőrzésével. 

Godó Ferenc hatalmas szólistáival az ellenőrző alkalmassá vált
a mindennapos munkára.

A Magyar Ispell fejlesztése 2002 januárjáig ,,titokban''
folyt, ekkor jelent meg az első nyilvános változat.

A nyilvánosságra hozatalt követően csatlakozott
hozzánk Trón Viktor, aki további
hibák, illetve hiányosságok feltárása mellett internetes
forrásokból összegyűjtötte, és a Magyar Ispell számára feldolgozta
a mai és történelmi magyar helységneveket, illetve --
aminek külön örülök -- elsőként vállalkozott
az alul dokumentált Magyar Ispell keretrendszer
működésének megismerésére, és ennek eredményeképp
a szótőgenerálás egyes részeinek javítására.

A Magyar Ispellből Koblinger Egmont -- aki
számos hasznos észrevétellel, és szólistával
is hozzájárult a Magyar Ispellhez -- készített folyamatosan
(SuSE) RPM csomagokat, illetve Pásztor György Debian 
karbantartó DEB csomagokat.

Talán a Magyar Ispell hatására a megalakulófélben
lévő FSF.hu Alapítvány az OpenOffice.org
honosítása mellett döntött, és szervezésükben
egy hétvége alatt a programcsomag tízezres nagyságrendű
feliratai, és üzenetei kerültek lefordításra.
Jelenleg a magyar OpenOffice.org linuxos változatának
Noll János, windowsos változatának Bencsáth Boldizsár a karbantartója
(\url{http://office.fsf.hu/}).

\subsection{Alapvető problémák}

Az agglutináló nyelvekhez nem magától értetődő az
Ispell szótármodulok elkészítése. A legjelentősebb megoldandó
problémák a következőek voltak a
Magyar Ispell kidolgozása során:

\begin{enumerate}
\item Az Ispellben nincs többszörös toldalékolási
lehetőség. Míg a magyar nyelv gazdag a képzőkben, jelekben,
és ragokban, addig az Ispell csak a tágabb értelemben
vett ragok kezelésére képes. A lehetséges szó végi hasonulások,
képzők, jelek és ragok
kombinációi miatt igen nagy számú ragozási szabály megadása szükséges,
amit ,,kézzel'' helyesen és belátható idő alatt megadni lehetetlen.

\item A szótárállományra ugyanez vonatkozik: közvetlen
elkészítése nagy nehézségekbe ütközik, és az eredmény nehezen
módosítható a későbbiekben.

\item Az
egyes képzők olyan számú képző+jel+rag kombinációt állítanak elő,
és ennek megfelelő számú ragozási szabályt igényelnek,
amelyet már nem lehet elfogadható méretű állományban tárolni.

A magyar Ispell hash állomány jelentős részét (több, mint 60\%),
a jelenlegi 10000 ragozási szabályt tároló affixum tömörítést
használó adatszerkezet (tehát nem a tényleges szótári hasítótábla)
teszi ki, mintegy 5-7 MB-on. Ha az összes lehetséges képző kombinációt
ragozási szabályokkal próbálnánk tárolni, nagy valószínűséggel
nagyságrendi növekedésre lehetne számolni a fájlméretben
és a helyesírás-ellenőrzés időigényében is.

\item Az Ispellben nincs lehetőség nem szótári tövek
felvételére. A morfofonológiai alternációk egy része, mint a szó végi
,,a'', ,,e'' változása (macska$\rightarrow$macskát) jól kezelhető a
ragozási szabályokkal, de a hangkivetős főnevek
(eper$\rightarrow$epret)\label{hangkiveto}, a nyitótövek
(kéz$\rightarrow$kezek), a hangugratós igék
(bérel$\rightarrow$bérlem)\footnote{Lásd pl.\
\cite[832 skk.]{smny3}.} már nem,
ráadásul ezek igen változatos formát mutatnak a magyar nyelvben.

\item Nemcsak a ragozási szabályok
számát sem növelhetjük az égig, hanem a ragozási osztályok száma
sem haladhatta meg pusztán gyakorlati megfontolásból a 26-ot
(a legtöbb Linux terjesztés ugyanis pár éve ilyen
korlátozásokkal fordított bináris Ispellt tartalmazott).
\end{enumerate}

Megoldás szerencsére mindegyik pontra akadt:

\begin{enumerate}
\item Az affixum állomány, és a szótárállomány is automatikusan
van előállítva a Magyar Ispell keretrendszerben.
Az affixum állományokban az \texttt{m4} makrófeldolgozó segítségével
gyakorlatilag többszörös toldalékolással vannak leírva
a ragozási szabályok. A~\texttt{magyar.aff} névre hallgató
Ispell affixum állomány a végleges
ragozási szabályokkal fordítási időben jön létre.

\item A szótárállomány forrása jelenleg az alapmodulból és külön kezelhető
szaknyelvi modulokból áll.  A szavak osztályozása egyszerű
szólistákkal (,,egymezős'' adattáblákkal) történik, ami rendkívül
leegyszerűsíti a szókincs bővítését a Magyar Ispellben. A
szólistákból héj- és awk programok segítségével áll elő az Ispell
buildhash programja számára szükséges magyar.dict szótárállomány.

\item A Magyar Ispell kombinált módszert használ a képzett
szóalakok kezelésére: a ragozási szabályok mellett
a főnevekhez képest viszonylag kis elemszámú szófajok -- mint a
melléknevek és az igék -- esetében automatikusan állítja elő
a képzett alakokat, és ezek külön kerülnek a szótárba
más szófajú szavakként. Ezzel a módszerrel a szükséges
ragozási szabályok számát jelentős mértékben csökkenteni
lehetett, a szótárállomány növekedésének rovására.
A szótárba külön felvett szóalakok számának
növekedése mintegy kétszeres, de a hash állomány speciális
felépítéséből fakadóan a végleges Ispell adatállomány
mérete kevesebb, mint ötven százalékkal nő csak. 
(A ragozási szabályok számának nagyságrendi növelése ennél
sokkal nagyobb problémát jelentene).

\item A nem szótári tövek kezelésére kényszerűségből
szokatlan megoldást sikerült találni: a nem szótári tőhöz kapcsolódó
alakok levezetése nem valódi tőből, hanem az egyik ragozott alakból
történik. A módszer rendkívül eredményesnek
bizonyult: alkalmas volt a magánhangzó-harmónia
szerint elkülönülő kisebb, zárt főnévcsoportok ragozásának
kezelésére is, valamint ezt és a különböző hangrendű alakok kezelését
is egy ragozási osztályon belül el lehetett intézni (mivel a tőnek
választott többes számú alak kötőhangzójából egyértelműen
meghatározható a szó hangrendje)!

\item A ragozási osztályok számának csökkentése érdekében
több látszólag nem optimális, de mint később
kiderült, a fejlesztés szempontjából szerencsés választásra
került sor: a ragozási osztályok egy része
össze lett vonva, pl.\ az ikes és iktelen igék ragozása,
a főnevek és melléknevek ragozása részben ilyen volt.
A hangrend esetében sem a ragozási szabályok számával takarékoskodó
négy osztályos megoldás mellett döntöttem (mély hangrend,
közös magas hangrend, csak ajakkerekítéses, csak ajakréses magas
hangrend), hanem a szabályokat jelentős részben duplázó,
de eggyel kevesebb ragozási osztályt kívánó megoldás mellett
(mély hangrend, és a két magas hangrend).

Azóta szerencsére a 26 osztályos határt is sikerült átlépni,
mindenféle probléma nélkül, mivel a
Linux terjesztések is átálltak a több ragozási osztállyal
fordított Ispell binárisokra.
\end{enumerate}

\subsection{Affixum keretrendszer}

Az affixum állományok az áttekinthetőség miatt
több részre vannak feldarabolva. A legfontosabb, amely
a ragozási osztályok rövid összefoglalását is
tartalmazza, az \texttt{aff.fej} névre hallgató állomány.

Az \texttt{aff.alanyi} és az \texttt{aff.targyas} állományok az alanyi illetve
a tárgyas igeragozást tartalmazzák. Ezek az állományok
hangrendi összevonást nem tartalmaznak, az m4 makrók,
amelyek itt szerepelnek, csak a ragozási szabályokban
szereplő mintákat általánosítják. Pl. az aff.alanyi
állomány első (valóban is használt) makrójának definíciója
a következő:

\begin{verbatim}
define(dupik,[BDGJKLMNRTZY] [LDGRZ] I K)
\end{verbatim}

Egy példa a makró használatára, ugyanebből az állományból:

\begin{verbatim}
dupik     >   -IK,ASZ
\end{verbatim}

Ez a sor az \url{aff.alanyi} állomány m4 makrófeldolgozón való
átszűrésének eredményeképp a következőre alakul:

\begin{verbatim}
[BDGJKLMNRTZY] [LDGRZ] I K     >   -IK,ASZ
\end{verbatim}

A makrók használata itt csökkenti a tévedéseket, egyszerűsíti
a minták módosítását a későbbiekben.

Az \texttt{aff.fonev} állomány tartalmazza a főnevekre, és
-- az állomány megtévesztő neve ellenére -- a melléknevekre
vonatkozó ragozási szabályokat illetve ezek m4 forrását.

Az m4 makrózás használata ebben az állományban lényegesen megkönnyíti a 
számtalan rag előállítását. Az m4
makrók paraméteresek lehetnek, egymásba ágyazhatók,
egyszerű feltételvizsgálatokat végezhetünk. Segítségével a mély és a
két magas hangrend, valamint a tekintélyes számú képző+jel(ek)+rag
kombináció rövid makrókkal legeneráltatható. A \emph{pelda} állomány
tartalma a bal oldalon, az m4-gyel feldolgozott állomány kimenete
a jobb oldalon látható:

\begin{multicols}{2}

\texttt{define(rag,}

\texttt{\$1BA}

\texttt{\$1BAN}

\texttt{\$1RA)}

\texttt{~}

\texttt{define(jel,}

\texttt{rag(\$1M)}

\texttt{rag(\$1D)}

\texttt{rag(\$1JÁ))}

\texttt{~}

\texttt{jel(kocsi)}

\texttt{~}

Futtatás:

\texttt{\$~m4~pelda}

\texttt{kocsiMBA}

\texttt{kocsiMBAN}

\texttt{kocsiMRA}

\texttt{kocsiDBA}

\texttt{kocsiDBAN}

\texttt{kocsiDRA}

\texttt{kocsiJÁBA}

\texttt{kocsiJÁBAN}

\texttt{kocsiJÁRA}

\end{multicols}

A \emph{define(makró\_név, makró\_törzs)} szintaxis az m4 központi
utasítása, a paraméterek \$\emph{szám} azonosítóval érhetők
el. Részletes leírása: \texttt{info m4}.

További affixum állományok: \texttt{aff.fonev.morfo}, amely a hangkivetős
és a nyitótövek ragozását tartalmazza (a többes számú alakból
levezetve) két ragozási osztályt meghatározva.
Az \texttt{aff.ige\_kiv} a hangugratós igék ragozási osztályát
definiálja.

A következő táblázat összefoglalja a Magyar Ispell
jelenlegi ragozási osztályait. A táblázat oszlopai:
a ragozási osztályok betűjelei (a kapcsolók);
a szófaj, amit érint a ragozási osztály; a hangrend
(o = mély, e = ajakréses magas, ö = ajakkerekítéses
magas); és végül a ragozási osztály leírása példákkal.

\begin{longtable}[l]{cclp{12cm}}
\hline Jel & Szófaj & H. & Leírás
\\ \hline \endhead
\hline \endfoot
\\ \hline  A &  névszó & o & A magánhangzóra végződő névszók mély
hangrendű birtokos személyjeles toldalékolása (ollónkról,
macskáitokéinak), többes számú toldalékai (harcsákat),
-ék képzős alakjai (kutyáékról), -cska képzős alakjai (birtokos
személyjelek nélkül), és -nként, -stul ragok. A két utolsó
ragot a mássalhangzóra végződő főnevek is felvehetik (nadrágostul).
A tárgyragot kezelő ragozási szabályok nem itt szerepelnek, hanem a K (illetve a hangrendtől
függően az L, M) osztályokban.
\\ \hline  B &  névszó & e & Mint az előző, csak a hangrend más.
\\ \hline  C &  névszó & ö & Mint az előző, csak a hangrend más.
\\ \hline  D &  melléknév & -- & A leg-, legesleg- prefixum. Nem confixumként
kezelve még (legkutya).
\\ \hline  E &  ige & e & ajakréses magas hangrendű \emph{alanyi igeragozás}: ikes és iktelen jelen és múlt
idő, feltételes és felszólító mód; határozói igenév (-ve/-vén),
főnévi igenév (-ni) és személyragozása (-nem, -ned, -nie, ...).
\\ \hline  F &  melléknév & o & Fokjeles alakok (-bb) és ragozásuk,
,,a'' kötőhangzós toldalékolás (-at, -an, -ak, és -ak ragozása).
\\ \hline  G &  melléknév & e & Mint az előző, csak a hangrend más.
Itt van egy kis redundancia az L osztállyal is.
\\ \hline  H &  melléknév & ö &  Gyakorlatilag megegyezik az előzővel,
ezért sor kerül majd a két osztály összevonására.
\\ \hline  I &  névszó & oeö & Nem szótári tővel rendelkező, valamint a zárt
-a kötőhangzót kapó névszavak többes számú alakjaiból levezetett toldalékolás.
Nyelvtanilag több típus is tartozik ide, példákkal: bokor/bokrot, varjú/varjak,
út/utak, fű/füvek, mű/művek, jó/javak, falu/falvak, valamint az -a kötőhangzós
zárt osztály tagjai: vas/vasak. A nem szótári tövek a többes számú,
a birtokos személyjeles, és tárgyragos toldalékokat kapják meg az I
osztályban. Lásd \texttt{fonev\_morfo.2} és \texttt{fonev\_morfo2.2} állományokat.
\\ \hline  J &  névszó & oeö & Az előző osztályt kiegészítő -i melléknévképző.
Ezt csak a mássalhangzó végű hangkivetős nem szótári tövek kapják meg mind a mai magyar
helyesírás szerint (hatalmi, de úti, tűzi!). Ez különbözteti meg
a morfo1 és morfo2 csoportokat (bár a kategorizáláson ez nem látszik,
mivel az -a kötőhangzós alakoknak ez alapján a \texttt{fonev\_morfo.2}
állományban is helyet kellene kapni). Valószínű, hogy szerencsésebb
volna a -i képzős alakokat külön szóként felvenni a szótárba, mivel nem fedi 
le a teljes ragozási sort (paradigmát) ez az osztály (hiányoznak a birtokos
személyjeles toldalékok, például hatalminkról).
Az osztályba bekerült a -hat, -het végződésű igék E/3. múlt idejű
alakját képező két szabály is. A későbbi fejlesztések miatt
ez várhatóan kikerül innen.
\\ \hline  K &  névszó & o & Tárgyrag, és a mássalhangzó végű
névszavak toldalékolása az A osztályhoz hasonlóan.
Az A osztálytól való szétválasztására
az I osztályba tartozó kivételek miatt volt szükség (nincs
például szerelemünket).
\\ \hline  L &  névszó & e & Mint az előző, csak más hangrendű.
\\ \hline  M &  névszó & ö & Mint az előző, csak más hangrendű.
\\ \hline  N &  névszó & ö & -höz, -ön ragok. A névszók egy ajakkerekítéses
magas hangrendű tőosztálya ajakréses hangrendű toldalékokat vonz (könyvet, zöldet),
de a -höz, és az -ön esetében nem (könyvhöz, zöldhöz). A -hez, és -en toldalékú
hibás alakok kivételként vannak letiltva a ,,w'' kapcsolóval 
a főnevek esetében (könyvhez), míg mellékneveknél csak a -hez (zöldhez, bölcshez),
mivel itt az -en határozói rag miatt helyesek a zölden, bölcsen. stb. alakok.
\\ \hline  O &  ige & o & Mint az E kapcsoló, csak ez a mély hangrendű \emph{alanyi igeragozás}: 
A -k végű nem ikes igék ragozása külön van lekezelve (lásd \texttt{kivetelek/igekotos/rak}.
\\ \hline  P &  ige & ö & Mint az előző, csak ajakkerekítéses magas hangrendű.
\\ \hline  Q &  névszó & o & -ja (mély hangrendű I/3 személyű birtokos személyjel és ragozott
változatai).
\\ \hline  R &  névszó & eö & -je (magas hangrendű I/3 személyű birtokos személyjel és ragozott
változatai.)
\\ \hline  S &  névszó & o & -a (mély hangrendű I/3 személyű birtokos személyjel és ragozott
változatai).
\\ \hline  T &  névszó & eö & -e (magas hangrendű I/3 személyű birtokos személyjel és ragozott
változatai).
\\ \hline  U &  névszó & o & Esetragok birtokos személyjel nélkül. A birtokjeles (-é),
és birtoktöbbesítő jeles (-i) alakok is megtalálhatók itt (macskáéit), de önmagában a
tárgyrag nem.
\\ \hline  V &  névszó & e & Mint az előző, csak más hangrendű.
\\ \hline  W &  névszó & ö & Mint az előző, csak más hangrendű.
\\ \hline  X &  ige & -- & Igekötők: abba-, agyon-, alá-, ..., végbe-, végig-, vissza-.
Egyszerűsítés, hogy a legtöbb ige minden igekötőt felvehet. Ha egy igénél
nem szeretnénk igekötős alakokat, akkor helyezzük el az igét az \texttt{ige\_koto.1} állományban
is. Általában két esetben van erre szükség: ha az ige már tartalmaz valamilyen
nem tipikus igekötőt (\emph{kétségbeesik}); vagy
igenévszóról van szó, és nem akarjuk, hogy a névszóragok megjelenjenek
az igekötővel együtt (\emph{megingeiket}). Ez utóbbi esetben külön
vannak felvéve az igekötős alakok. Lásd \texttt{ige\_koto.1}.
\\ \hline  Y &  névszó & -- & Szóösszetételben való szereplést engedélyező
kapcsoló (COMPOUNDFLAG). Lásd a Hunspell(4) kézikönyv oldalt! A legtöbb köznév
megkapja. Kivételek a \texttt{fonev\_kulon.1} állományban.
\\ \hline  Z &  névszó & -- & Idegen kiejtésű, vagy mozaikszavak toldalékai esetében
a kötőhangzó hiányát jelzi. A \texttt{kotojeles\_hangzo.1} állományban vannak megadva
azok a szavak, amelyek felveszik a Z kapcsolót.
\\ \hline  a &  számnév & -- & A tízesek prefixumként: tizen-, huszon-, ... kilencven-.
\\ \hline  b &  számnév & -- & A százasok prefixumként: száz-, kétszáz-, ... kilencszáz-.
\\ \hline  c &  névszó & -- & -szerű, -féle, -fajta, -beli, -nemű képzőszerű utótagok.
A 6-3-as szabály helyes kezeléséhez szükséges osztály. (Ezek az utótagok nem
számítanak bele a szótagszámba, hasonlóan az igazi toldalékokhoz.)
\\ \hline  d &  ige & -- & morf. alt. ragozás
\\ \hline  e &  ige & e & Ajakréses magas hangrendű \emph{tárgyas igeragozás}: ikes és iktelen jelen és múlt
idő, feltételes és felszólító mód.
\\ \hline  f & névszó & -- & Idegen toldalékolású, y-ra végződő főnevek jele.
\\ \hline  g & -- & -- &  Toldalékolt alakok jele. A Hunstem tövező számára szükséges információt
adja meg. A g kapcsolót közvetlenül követő 1 és 9 közé eső szám jelentése, hogy a
tő a számnak megfelelő számú szóvégi karakter levágásával állítható elő. Ha ilyen
szám nincs, akkor a háttérben a különleges \_\_szó szótári bejegyzéssel (annak kapcsolóiként)
van tárolva a szó töve. L.~ragozatlan.2 állomány leírását.
\\ \hline  h &  számnév & -- & Ezeregyszáz-, ezerkétszáz-, ... ezerkilencszáz- prefixumok a
kétezer alatti számok egybeírásához.
\\ \hline  i &  névszó & o & -nyi. A morfofonetikus csoport miatt van szükség a szétválasztásra,
mivel a többi melléknévképzővel ellentétben ez nem járul a nem szótári tövekhez
(bokrnyi, füvnyi).
\\ \hline  j &  névszó & eö & Mint az előző, csak magas hangrendű.
\\ \hline  k &  főnév & o & Melléknévképzők: -(o)s, -(j)ú, -i, -tlan/-talan,
nem teljes ragozási sorral.
\\ \hline  l &  főnév & e & Mint az előző, csak más hangrenddel.
\\ \hline  m &  főnév & ö & Mint az előző, csak más hangrenddel.
\\ \hline  n &  főnév & oeö & Mint az előző, csak a morfo csoportra vonatkozóan.
\\ \hline  o &  ige & o &  Mint az ,,e'' osztály, csak ajakréses magas hangrendű
\emph{tárgyas igeragozás}.
\\ \hline  p &  ige & ö &  Mint az előző osztály, csak más hangrendű.
\\ \hline  q & -- & -- & -féle toldalék a tulajdonnevekhez.
\\ \hline  r & --
\\ \hline  s & főnév & o & -ai (I/3 birtokos személyrag + birtoktöbbesítő jel). L.~S kapcsoló
\\ \hline  t & főnév & eö & -ei (I/3 birtokos személyrag + birtoktöbbesítő jel). L.~T kapcsoló
\\ \hline  u & -- & -- & A ,,w'' kapcsoló hatását módosító kapcsoló: ha meg van
adva a ,,w'' mellett, akkor a tiltás csak a szótőre vonatkozik, a tiltott szótő
toldalékolt változataira nem. A mangrove szót így lehetett egyszerűen és
tártakarékosan lekezelni, mivel a felvitt szabályok nem kezelik a -e végződésű főneveket
mély hangrendű toldalékokkal. A ,,mangrove'' szó mellett szerepel
a ,,mangrové'' is a szótárban ,,w'', ,,u'' (és egyéb) kapcsolókkal,
így a ,,mangrové'' alak helytelen, de a ,,mangrovét'', ,,mangrovéinak''
stb. alakok helyesek. A ,,mangrove'' említett kapcsolóit a
\texttt{szotar/kivetelek/ragozatlan/mangrove} állományban találjuk meg.
\\ \hline  v & -- & -- & szerepelhet összetételekben első szóként (COMPOUNDFIRST).
Jelenleg ezzel a kapcsolóval van megoldva az egyszerű tőszámnevek, és a melléknévképzős főnevek
egybeírásának engedélyezése (illetve a Magyar Myspell gondoskodik arról, hogy
tényleg csak a melléknévképzős alakokat lehessen egybeírni a tőszámnevekkel), pl.
harmincnapi, de! két hónapos. Lásd A magyar helyesírás szabályai 119. pontját,
és a Hunspell(4) kézikönyv oldalt!
\\ \hline  w & -- & -- & Tiltott szóalakok kapcsolója (FORBIDDENWORD).
A Magyar Ispell/Myspell egyszerűsítő felépítésének számos hibája küszöbölhető
ki a hibásan képzett szavak tiltásával. A szótárbővítő az idegen
kiejtésű szótagra végződő, de a tővel egybeírt toldalékú szavak felvitelénél
találkozik ezzel (pl. Madáchhal/w), valamint a rossz szóösszetételek
tiltásánál (ifjúpár/w). Adjuk meg a \texttt{\#MYSPELL TILTOTT} megjegyzést
a szótárállományban, ha ragozott szavak tiltását szeretnénk. (Megtehetnénk
ezt úgy is, hogy ha a szót ismételten felvesszük a \texttt{ragozatlan.2}
állományba, a ,,w'' kapcsolóval. A speciális megjegyzés használatának két
előnye van: Először is, a tiltott szó nem kerül bele az Ispell szótárba,
másodszor az alapszó, és a tiltás egy helyen található, és így
könnyebben nyomon követhető, és szerkeszthető.) Lásd a Hunspell(4) kézikönyv oldalt!
\\ \hline  x & -- & -- & szerepelhet összetételekben utolsó szóként (COMPOUNDLAST).
Ezt a külön felvett (I osztály által kezelt) többes számú alakok kapják meg.
\\ \hline  y & névszó & -- & összetett szó (COMPOUNDWORD). A 6-3 szabály
helyes alkalmazásához szükség van arra az információra, hogy a tőként felvett
szó vajon összetett-e, vagy sem. Lásd a Hunspell(4) kézikönyv oldalt!
\\ \hline  z & számnév & -- & -magammal, -magaddal, -magával, -magunkkal, -magatokkal,
-magukkal toldalékként, mint a sorszámnevek visszaható névmás ,,ragja''.
Lásd \texttt{szotar/kivetelek/ragozatlan/szamnev2}.
\\ \hline 0 & -- & -- & A tövezésnél nem megjelenítendő alak jele.
A Magyar Ispell számos olyan ,,tövet'' tartalmaz, amelyek pusztán
gyakorlati szempontból léteznek. Ilyenek az improduktív névszóragozásnál
a többes számú alakok (madarak, szerelmek), illetve a kötőjellel toldalékolt szavaknál
a szó és kötőjel alakok (tv-). Ezeket az alakokat a 0 kapcsolóval
ellátva a tövezésnél nem jelennek meg.

\\ \hline \end{longtable}


\subsection{Szótári keretrendszer}

A szófajilag elkülönített szóállományok lehetővé teszik a szófajra
jellemző ragozási osztályok kapcsolóinak és az alapszavaknak
a viszonylag egyszerű párosítását.
Héj- és awk program gondoskodnak erről bizonyos kivétellisták
figyelembevételével.

Például egy szófajon belül három fő ragozási
mintacsoport különíthető el a hangrend alapján. Az alapszavak
hangrendje kibővített reguláris kifejezésekkel (awk programokkal)
fordítási időben kerül felismerésre, pl. egy erre
vonatkozó programrészlet:

\texttt{\#~mély~hangrendű~igék~}

\texttt{/{[}uúoóaá{]}{[}bcdfghjklmnprstvxyz{]}{*}ik\$/~\{~print~\$0~\char`\"{}/X/A\char`\"{}
\}}

\texttt{/{[}uúoóaá{]}{[}bcdfghjklmnprstvxyz{]}{*}\$/~\&\&~!~/ik\$/~\{~print
\$0~\char`\"{}/X/A\char`\"{}~\}}

A példa csak az utolsó szótag hangrendjének vizsgálatát végzi el,
illetve ikes igék esetén az -ik előtti szótagét, ez sok esetben nem
ad jó megoldást. A Magyar Ispell keretrendszerben
kivétellisták segítségével tehető pontossá az automatikus
hangrend-besorolás. Ilyen kivétellisták az \texttt{\_alap} könyvtárban
található \texttt{fonev\_mely.1}, \texttt{ige\_mely.1}, és
\texttt{melleknev\_mely.1} állományok,
amelyeket a feldolgozó awk programok egy-egy asszociatív tárba
töltenek be (más kivétellistákhoz hasonlóan), ami a feldolgozás
sebességét jelentősen gyorsítja.

\section{Új szótármodulok létrehozása}

A Magyar Ispell forrásának telepítése után (ezt a következő fejezet ismerteti)
lépjünk be a \texttt{magyarispell-0.86} könyvtárba.

A szótármodulok külön könyvtárakban helyezkednek el. Az alapkönyvtárak
neve aláhúzásjellel (\_) kezdődik. A legfontosabb szótármodul az
\texttt{\_alap}.

Egy új szótármodul létrehozása nagyon egyszerű: hozzunk létre egy
új alkönyvtárat a \texttt{magyarispell-0.86} könyvtáron belül.
A könyvtár neve aláhúzásjellel kezdődjék.

Ha szeretnénk, hogy a szótár fordítása során az új szótári modul is
bekerüljön a végeredménybe, hozzunk létre egy szimbolikus kötést (symlink)
a könyvtárra:

\begin{verbatim}
ln -s _példa Példa
\end{verbatim}

Látható, hogy a többi alkönyvtárhoz hasonlóan a szimbolikus kötés neve
aláhúzás nélküli, és nagybetűvel kezdődik. Ezek a tulajdonságok határozzák
meg, hogy mely könyvtárak tartalma számít fordításra kijelölt modulnak.

Egy modult egyszerűen a szimbolikus kötés törlésével tudunk kivenni ebből a
csoportból:

\begin{verbatim}
rm Példa
\end{verbatim}

\subsection{Szófaji bontás}

A szótármodul szavakat fog tartalmazni, amelyet szófaji alapon el
kell tudnunk különíteni. A köznevek a \texttt{fonev.1} állományban
kerülnek felsorolásra (egy szó egy sorba kerül). A melléknevek
a \texttt{melleknev.1} állományban, illetve az alanyi és tárgyas igék
az \texttt{ige\_alanyi.1} és az \texttt{ige\_targy.1} állományokban.

A \texttt{tulajdonnev.2} állomány két mezőben tárolja a tulajdonnevekre
vonatkozó információt, de ha az első mező üres, a második speciálisan
(ragozatlan szóként) kerül értelmezésre.

Ezért ha egy tulajdonnév nem kap toldalékot a magyar nyelvben 
(rendszerint többelemű tulajdonnevek nem utolsó tagja, vagy
kapcsolóval ellátott, illetve letiltott toldalékolt alakok), akkor a
sorban egy tabulátor után (tehát a második mezőbe) írjuk a szavakat, például:

\begin{verbatim}
        Santa
	Vörösmarty/f
	Gaussal #MYSPELL TILTOTT
	Gaussá #MYSPELL TILTOTT
	Gauss-szal/g5
	Gauss-szá/g4	
\end{verbatim}

Ha ragozzuk, akkor rögtön sor elejére.

\begin{verbatim}
Einstein
\end{verbatim}

Ha a ragozott alakok között melléknévképzős (kisbetűs) is akad, akkor
az ugyanebbe a sorba, egy tabulátorral elválasztva írjuk:

\begin{verbatim}
Einstein	einsteini
\end{verbatim}

Ha sehová nem illik a szó, felvehetjük a \texttt{ragozatlan.2} állományba.
Ha azért valamilyen mértékben ragozott,
akkor puskázzunk. A legenerált \texttt{magyar.dict}
állományt szűrjük meg arra vonatkozóan,
hogy egy hasonló ragozású, hangrendű, stb. szó milyen ragozási 
csoportjelzőkkel  került a szótárba:

\begin{verbatim}
grep  ^milyen/ magyar.dict
milyen/B/V/L/R
\end{verbatim}

A szavunkhoz ugyanezt rendelhetjük hozzá a \texttt{ragozatlan.2} állományban:

\begin{verbatim}
ilyen/B/V/L/R
\end{verbatim}

\subsection{Kivételek a szófaji kategóriákon belül}

A legtipikusabb kivételek a hangrendi kivételek.
Ha egy szó utolsó szótagja magas hangrendű, de a szó mégis mély
hangrendű, akkor a szót vegyük fel a szófajhoz tartozó
\texttt{\_mely.1} végződésű névvel rendelkező állományba.
Az ilyen szavak utolsó szótagjában többnyire ,,é'', vagy ,,i''
magánhangzó szerepel, és gyakran vegyes hangrendűek.

Konvenció, hogy \texttt{tulajdonnev\_mely.1} állomány nem létezik,
az ilyen tulajdonneveket a \texttt{fonev\_mely.1} állományba
helyezzük el.

A főnevek esetében megtaláljuk még a \texttt{fonev\_magas.1} 
állományt is, ami elsősorban idegen tulajdonneveket, illetve
egy-két át nem írt idegen közszót tartalmaz (pl. gentleman,
Cadillac), amelyek utolsó szótagja mély hangrendű, mégis
a kiejtés miatt magas hangrendű toldalékokat kapnak (gentlemannel,
Cadillackel).

A névszók (elsősorban a főnevek) esetében a hangrendi kivételek mellett a
I./1-es birtokos személyjeleket (-ja/-je/-a/-e) érintő
kivételek jelentősek. Három állománnyal kell
megismerkednünk velük kapcsolatban: a \texttt{fonev\_ae.1} azokat
a főneveket sorolja fel, amelyek \emph{b}, \emph{d}, 
\emph{f}, \emph{k}, \emph{l}, \emph{n}, \emph{p}, \emph{r} és \emph{t} betűre
való végződés ellenére -a vagy -e birtokos személyjelet kapnak (például váll$\rightarrow$válla).
A \texttt{fonev\_jaje.1} azokat
a főneveket sorolja fel, amelyek \emph{c}, \emph{g}, 
\emph{h}, \emph{j}, \emph{m}, \emph{s}, \emph{x}, \emph{y}, \emph{v} és \emph{z} betűre
való végződés ellenére -ja vagy -je birtokos személyjelet kapnak (például hang$\rightarrow$hangja).
Amennyiben mind a j-s, mind a j nélküli változatát megkapja egy szó, akkor a
\texttt{fonev\_jajeae.1} állományban kell feltüntetni (például beszéd$\rightarrow$beszéde, beszédje).

\subsection{Állományok táblázata}

A következő táblázat összefoglalja a jelenlegi állományokat:

\begin{longtable}[l]{lp{10cm}}
\hline Állomány & Leírás
\\ \hline \endhead
\hline \endfoot
\\ \hline fonev.1 & köznevek
\\ \hline fonev\_ae.1 & b, d, f, k, l, n, p, r és t végű; -a, -e birtokos személyragot kapó főnevek (váll$\rightarrow$válla)
\\ \hline fonev\_ing.1 & mély és magas hangrendű ragot kapó főnevek (fotel$\rightarrow$fotelban, fotelben)
\\ \hline fonev\_jaje.1 & c, g, h, j, m, s, x, y, v, és z végű, -ja, -je birtokos személyragot kapó főnevek (hang$\rightarrow$hangja)
\\ \hline fonev\_jajeae.1 & -a/-e, és -ja/-je birtokos személyraggal is előforduló főnevek (beszéd$\rightarrow$beszéde, beszédje)
\\ \hline fonev\_kulon.1 & főnevek, amelyek összetett szóban nem szerepelhetnek (január)
\\ \hline fonev\_magas.1 & főnevek, amelyek utolsó szótagja mély hangrendű, de magas hangrendű ragot kapnak (gentleman$\rightarrow$gentlemannel)
\\ \hline fonev\_mely.1 & főnevek, amelyek utolsó szótagja magas hangrendű, de mély hangrendű ragot kapnak (héj$\rightarrow$héjjal)
\\ \hline fonev\_morfo1.2 & hangkivető főnevek, többesszámú alakjaikkal (szerelem$\rightarrow$szerelmen, kehely$\rightarrow$kelyhen)
\\ \hline fonev\_morfo2.2 & nyitótövek, és egyéb kivételek, többesszámú alakjaikkal
\\ \hline fonev\_oe.1 & -et, -ek, -ön, -höz ragot kapó, ajakkerekítéses magas hangrendű főnevek (könyvet, könyvön)
\\ \hline fonev\_osszetett.1 & Összetett szavak (kerékpár).
\\ \hline ige\_alanyi.1 & nem tárgyas igék (történik, nincs történi, történed, mint a Helyes-e?-ben)
\\ \hline ige\_ikes\_kiv.1 & dupla mássalhangzó+ikes igék, -ó, -ás képzőkkel, l. iges.awk, igesgen
\\ \hline ige\_koto.1 & igekötőt nem kapó igék (vagy külön kezelve az igekötős alakok)
\\ \hline ige\_mely.1 & igék, amelyek utolsó szótagja magas hangrendű, de mély hangrendű ragot kapnak (sír$\rightarrow$sírok)
\\ \hline ige\_morfo.1 & hangkivetős igék (bicsakol$\rightarrow$bicsakló)
\\ \hline ige\_targy.1 & tárgyas igék (üt$\rightarrow$üti, ütöm)
\\ \hline ige\_tat\_kiv.1 & -tat, -tet gyakorítóképzős alakok nincsenek (pl. mond, mondat, de nincs mondtat, mondattat)
\\ \hline melleknev.1 & melléknevek
\\ \hline melleknev\_a.1 & -o kötőhangzót (főnévi ragozást) nem kap, (nincs állottot)
\\ \hline melleknev\_ae.1 & b, d, f, k, l, n, p, r és t végű; -a, -e birtokos személyragot kapó melléknevek
\\ \hline melleknev\_ing.1 & mély és magas hangrendű ragot kapó melléknevek
\\ \hline melleknev\_jaje.1 & c, g, h, j, m, s, x, y, v, és z végű, -ja, -je birtokos személyragot kapó melléknevek
\\ \hline melleknev\_jajeae.1 & -a/-e, és -ja/-je birtokos személyraggal is előforduló melléknevek
\\ \hline melleknev\_mely.1 & melléknevek, amelyek utolsó szótagja magas hangrendű, de mély hangrendű ragot kapnak
\\ \hline melleknev\_oe.1 & -et, -ek, -ön, -höz ragot kapó, ajakkerekítéses magas hangrendű melléknevek (zöldet, zöldön)
\\ \hline ragozatlan.2 & Nem ragozott, vagy kivételesen ragozott szavak megadására szolgáló állomány.
A kivételes ragozási adatokat kapcsolókkal adhatjuk meg a szó után közvetlenül, egy perjellel elválasztva
a szótól. A szavakat külön sorba kell megadni. Egy sorban a szó töve is megadható a
tövezőprogram számára, tabulátorjellel elválasztva a szótól.
\\ \hline tulajdonnev.2 & Tulajdonnevek: ha az első mező üres, akkor a szó ragozatlan, ha nem, akkor a második mező melléknév.
\\ \hline tulajdonnev-geo.2 & földrajzi nevek
\\ \hline tulajdonnev-keresztnev.2 & keresztnevek
\\ \hline tulajdonnev-szemelynev.2 & személynevek
\\ \hline kotojeles\_mely.7 & Mély ragozású, idegen ejtésű, vagy mozaikszavak kötőjellel elválasztott toldalékkal (felépítést l. az állományban).
\\ \hline kotojeles\_magas.7 & Magas ajakréses ragozású, idegen ejtésű, vagy mozaikszavak kötőjellel elválasztott toldalékkal
\\ \hline kotojeles\_magas2.7 & Magas ajakkerekítéses ragozású, idegen ejtésű, vagy mozaikszavak kötőjellel elválasztott toldalékkal
\\ \hline kotojeles\_hangzo.1 & Az itt felsorolt szavak kapják meg a Z kapcsolót, ami azt jelzi. hogy az itt megadott szavak esetében
nincs kötőhangzó a toldalék és a szó között (például URH-nk, és nem URH-unk, mivel az URH kiejtve ,,uerhá'').
\\ \hline \end{longtable}

A tulajdonnevek hangrendjéről: a -i végű melléknévképzős alakoknál a hangrend automatikusan
mély, ha a tőszó utolsó magánhangzója mély. Ha ingadozó, (i, í, mint Párizs), akkor
külön felveendő a \texttt{melleknev\_mely.1} állományba a képzett alak (párizsi).

\subsection{Y-ra végződő szavak}

	Az y végű szavak (pl. Sydneyvel, Uruguayjal, Kölcseyn, sprayen)
	ragozása vissza lett vezetve az i, és j végű szavakéra. 
	
	Az ,,f'' kapcsoló segítségével a következőképp kódolhatóak az
	y végű szavak:

	A tövet nem ragozzuk, csak ,,f'' kapcsolót kap (közneveknél
	még Y-t, hogy összetett szavakban szerepelhessen).
	
	Felveszünk egy olyan tövet, amiben kiejtés szerint
	az y vagy i-re, vagy j-re van átírva (Sydnei, Uruguaj, Kölcsei,
	spraj), és ezt szerepeltetjük a megfelelő állományokban, de letiltva!

Köznevek (angol eredetű idegen szavak) esetében:

\begin{verbatim}
--- részlet az _alap/fonev állományból ---
boj #MYSPELL TILTOTT (boy)
brandi #MYSPELL TILTOTT (brandy)
cowboj #MYSPELL TILTOTT (cowboy)
displaj #MYSPELL TILTOTT (display)
ladi #MYSPELL TILTOTT (lady)
gázspraj #MYSPELL TILTOTT (gázspray)
orrspraj #MYSPELL TILTOTT (orrspray)
spraj #MYSPELL TILTOTT (spray)
penni #MYSPELL TILTOTT (penny)
whiski #MYSPELL TILTOTT (whisky)
złoti #MYSPELL TILTOTT (złoty)
------------------------------------------
\end{verbatim}

\begin{verbatim}
--- részlet a kivetelek/ragozatlan/y állományból ---
boy/fY
brandy/fY
cowboy/fY
display/fY
lady/f
gázspray/fY
orrspray/fY
spray/fY
penny/fY
whisky/fY
złoty/fY
----------------------------------------------------
\end{verbatim}

A köznevek esetében a \texttt{kivetelek/ragozatlan/y} állomány szolgál
az f(és az Y) kapcsolós alakok megadására. A tulajdonnevek
(régies írásmódú keresztnevek, illetve földrajzi nevek) esetében
a \texttt{tulajdonnev*} állományok szolgálnak erre a célra.
Ezekben van a szótő nem ragozva, ,,f'' kapcsolóval felvéve.
Felvesszük az átírt, nem valódi
tövet, megadjuk a melléknévképzős alakot is, és külön sorban tiltjuk le
a nem valódi tövet.

\begin{verbatim}
--- részlet a tulajdonnév állományból ---
	Vörösmarty/f
Vörösmarti #MYSPELL TILTOTT
Vörösmarti	vörösmartys
Vörösmarti	vörösmartyas
-----------------------------------------
\end{verbatim}

Itt gyakran -- ebben a példában is --  a szavak hangrendje is
más. Ezért a \emph{Vörösmarti} szót felvesszük a \texttt{fonev\_mely.1}
állományba is, a melléknévképzős alakokat pedig a
\texttt{melleknev\_mely.1} állományba.

hasonló problémát okoz az idegen szavak esetében a mély hangrendűnek
	látszó, de magas hangrendű alak: pl. spray, display.
Ezen a nem valódi tövek \texttt{fonev\_magas.1} állományban
való elhelyezése segít.

\subsection{Kivételek könyvtár}

A \texttt{szotar/kivetelek} könyvtár tartalmazza azokat a kivételeket,
amelyek rendszerint valamilyen zárt toldalékolást mutatnak, de jóval
szűkebb csoportot alkotnak a Magyar Ispellben morfo1/morfo2 néven jelölt
névszóosztályoknál. Két alkönyvtárat tartalmaz a könyvtár, az
\texttt{igekotos} és a \texttt{ragozatlan} könyvtárat.
A két könyvtár sok állományában tövezési információk is meg vannak
adva második mezőként, hasonlóan a \texttt{ragozatlan.2} állományhoz.
Ezeket az állományokat a \texttt{.2} kiterjesztés jelöli.

A \texttt{kivetelek} könyvtár gyökerében található \texttt{ige\_kepzos.11}
állomány az igei kivételek
képzős alakjait adja meg (mivel a két alkönyvtárban lévő igék
kimaradnak a képzős alakok automatikus előállításából).

Az ige állományban felsorolt képzős alakok útmutatást adnak
arra vonatkozóan is, hogy milyen képzős alakok kerülnek külön
tőként felvételre a szótárba.

\subsection{További információk}

További információkat a Gyakran ismételt kérdések között
találunk (\texttt{GYIK} állomány a Magyar Ispell forrásában),
valamint a Magyar Ispell levelezőlistán (\url{http://www.yahoogroups.com/group/magyarispell}).

A levelezőlistára a \texttt{magyarispell-subscribe@yahoogroups.com}
e-mail címre írt levéllel jelentkezhetünk. A listára szánt leveleinket
a \texttt{magyarispell@yahoogroups.com} címre címezzük.

\subsection{Segédprogramok}

A \texttt{bin/} alkönyvtárban található \texttt{break} program
segít szavakat kigyűjteni szöveges, vagy HTML állományokból.

\section{Magyar Myspell}

A Magyar Myspell legfrissebb változata jelenleg a
\url{http://magyarispell.sf.net}
oldalról tölthető le. Korábbi változatokat a
\url{http://www.szofi.hu/gnu/magyarispell} oldalon
találunk.

A forrásból a \texttt{make} paranccsal fordíthatjuk le
az \texttt{example} nevű példaprogramot, és a leendő
-- Ispellt felváltani képes -- programot, a \texttt{Hunspell}-t.

\section{Javítási cseretáblázat}

A következő táblázat összefoglalja a
Magyar Ispell 0.99.3-as változatában megtalálható
javítási cseretáblázatot.

A táblázat harmadik oszlopa részben példákat mutat
a cseretáblázat segítségével tett javaslatokra, valamint
a cseretáblázat segítségével beazonosított hibás
szóösszetételekre. Ez utóbbi tulajdonság a Magyar Myspell
0,4-es változatában jelent meg.

A legtipikusabb hibák (i/í, ü/ű stb.) elöl találhatók,
hogy a javaslatoknál is ezek kerüljenek legelőre.

\begin{longtable}[l]{llp{10cm}}
\hline Mit & Mire & Példák cserére, illetve javított hibákra
\\ \hline \endhead
\hline \endfoot
\\ \hline í & i & szer+víz$\rightarrow$szerviz, sí+ma$\rightarrow$sima
\\ \hline i & í & kiváncsi$\rightarrow$kíváncsi, elit+élt$\rightarrow$elítélt
\\ \hline ó & o & szimbólikus$\rightarrow$szimbolikus, mikró+számítógép$\rightarrow$mikroszámítógép
\\ \hline o & ó & mikro$\rightarrow$mikró
\\ \hline o & ő & cselekvo$\rightarrow$cselekvő (lapolvasási, kódolási hibák javításához)
\\ \hline ú & u & kultúrált$\rightarrow$kulturált, vas+árú$\rightarrow$vasáru
\\ \hline u & ú & kultura$\rightarrow$kultúra
\\ \hline u & ű & keseru$\rightarrow$keserű (lapolvasási, kódolási hibák javításához)
\\ \hline ű & ü & menű$\rightarrow$menü
\\ \hline ü & ű & betü$\rightarrow$betű, keserü$\rightarrow$keserű
\\ \hline j & ly & juk$\rightarrow$lyuk, est+éj, kar+vaj, kord+éj, rost+éj,
szeg+éj, szem+éj, szem+éjes, szem+éji, szent+éj, szesz+éj, szesz+éjes,
tar+táj, tök+éj, ünnep+éj, ünnep+éjes,
\\ \hline ly & j & csevely$\rightarrow$csevej, muszály$\rightarrow$muszáj, boly+torján,
kard+bolyt, tojássár+gálya, váll+bolyt, boly+ár, boly+tár, súly+tó
\\ \hline a& ä & Handel$\rightarrow$Händel
\\ \hline S& © & Skoda$\rightarrow$©koda
\\ \hline s& ą & skodás$\rightarrow$ąkodás
\\ \hline r& ř & Dvorák$\rightarrow$Dvořák
\\ \hline ra& řá & Dvorak$\rightarrow$Dvořák
\\ \hline l& ł & zloty$\rightarrow$złoty
\\ \hline L& Ł & Lódz $\rightarrow$Łódz
\\ \hline Lo & Łó & Lodz $\rightarrow$Łódz
\\ \hline oliere & oli\&egrave;re & Moliere$\rightarrow$Moli\`ere
\\ \hline Angström& \&Aring;ngström & Angström$\rightarrow$\AA ngström
\\ \hline angström& \&aring;ngström & angström$\rightarrow$\aa ngström
\\ \hline \&Otilde;& Ő & \~O$\rightarrow$Ő
\\ \hline \&otilde;& ő & \~o$\rightarrow$ő
\\ \hline \&Ucirc;& Ű & \^U$\rightarrow$Ű
\\ \hline \&ucirc;& ű & \^u$\rightarrow$ű
\\ \hline - & \&ndash; & Duna-Tisza köze$\rightarrow$Duna--Tisza köze
\\ \hline jj & lly & gajj$\rightarrow$gally
\\ \hline jj & llj & ájj$\rightarrow$állj
\\ \hline lly & jj & csevellyel$\rightarrow$csevejjel
\\ \hline ggy & gyj & haggyon$\rightarrow$hagyjon, naggya$\rightarrow$nagyja
\\ \hline gyj & ggy & higyjen$\rightarrow$higgyen
\\ \hline ggy & dj & maraggy$\rightarrow$maradj
\\ \hline gy & dj & horgya$\rightarrow$hordja, kargyuk$\rightarrow$kardjuk
\\ \hline nny & nyj & annya$\rightarrow$anyja
\\ \hline nny & nj & fonnyátok$\rightarrow$fonjátok
\\ \hline tty & tyj & attya$\rightarrow$atyja
\\ \hline tty & tj & láttyák$\rightarrow$látják, bottya$\rightarrow$botja
\\ \hline cc & tsz & szerecc$\rightarrow$szeretsz
\\ \hline cc & dsz & maracc$\rightarrow$maradsz
\\ \hline cc & gysz & eccer$\rightarrow$egyszer
\\ \hline cs & ts & kölcség$\rightarrow$költség
\\ \hline cs & ds & boloncság$\rightarrow$bolondság
\\ \hline ccs & ts & baráccság$\rightarrow$barátság
\\ \hline ccs & ds & vaccság$\rightarrow$vadság
\\ \hline ccs & gys & naccság$\rightarrow$nagyság, őnaccsága$\rightarrow$őnagysága
\\ \hline g & kd & csug$\rightarrow$csukd, lög$\rightarrow$lökd
\\ \hline öss & ős & elösször$\rightarrow$először, erössen$\rightarrow$erősen
\\ \hline öll & ől & szöllő$\rightarrow$szőlő
\\ \hline ütt & űt & hüttő$\rightarrow$hűtő, füttő$\rightarrow$fűtő
\\ \hline ijj & íj & dijja$\rightarrow$díja, ijja$\rightarrow$íja
\\ \hline x & ksz & boxer$\rightarrow$bokszer, vax$\rightarrow$vaksz
\\ \hline ksz & x & fakszol$\rightarrow$faxol, Beatriksz$\rightarrow$Beatrix
\\ \hline xx & xsz & kódexxel$\rightarrow$kódexszel
\\ \hline xx & kssz & vaxxal$\rightarrow$vaksszal
\\ \hline xsz & kssz & vaxszal$\rightarrow$vaksszal
\\ \hline x & xsz & kódexel$\rightarrow$kódexszel
\\ \hline x & kssz & vaxal$\rightarrow$vaksszal
\\ \hline sz & c & licensz$\rightarrow$licenc
\\ \hline szt & cet & licenszt$\rightarrow$licencet
\\ \hline ssz & cc & licensszel$\rightarrow$licenccel
\\ \hline jl & lj & tejles$\rightarrow$teljes, éjlen$\rightarrow$éljen
\\ \hline gg & g & heggeszt$\rightarrow$hegeszt
\\ \hline file & fájl & file$\rightarrow$fájl
\\ \hline file- & fájl & file-lal$\rightarrow$fájllal
\\ \hline floppy & flopi & floppy$\rightarrow$flopi
\\ \hline bájt & byte & bájt$\rightarrow$byte
\\ \hline bájt & byte- & bájtos$\rightarrow$byte-os
\\ \hline chh & chcs & Madáchhal$\rightarrow$Madáchcsal
\\ \hline ll & l & vállfaj$\rightarrow$válfaj
\\ \hline ny & nny & menyország$\rightarrow$mennyország
\\ \hline nny & ny & mennyhal$\rightarrow$menyhal
\\ \hline o & a & házok$\rightarrow$házak
\\ \hline ivess & íves & szivessen$\rightarrow$szívesen
\\ \hline -cel & -szel & AIDS$\rightarrow$AIDS-szel
\\ \hline -cé & -szé & AIDS-cé$\rightarrow$AIDS-szé
\\ \hline  őrö & ölrő & előröl$\rightarrow$elölről
\\ \hline  őr & ölr & előről$\rightarrow$elölről
\\ \hline  ölr & őr & elölre$\rightarrow$előre
\\ \hline egyenlőre & egyelőre & egyenlőre$\rightarrow$egyelőre\footnote{Bár
helyes az \emph{egyenlőre} is, nagyságrendileg ritkább, mint az \emph{egyelőre}.}
\\ \hline kábé& kb. & kábé$\rightarrow$kb.
\\ \hline ss& ss-s & Barossal$\rightarrow$Baross-sal
\\ \hline ss& ss-sz & Gaussal$\rightarrow$Gauss-szal
\\ \hline ssz& ss-sz & Gausszal$\rightarrow$Gauss-szal
\\ \hline ll& ll-l & Böllel$\rightarrow$Böll-lel
\\ \hline nn& nn-n & Mannal$\rightarrow$Mann-nal
\\ \hline mm& mm-m & Grimmel$\rightarrow$Grimm-mel
\\ \hline tt& tt-t & Beckettel$\rightarrow$Beckett-tel
\\ \hline Jellasics& Jelačić & Jellasics$\rightarrow$Jelačić
\\ \hline
\end{longtable}
