               СТРУКТУРА НА ФАЙЛОВЕТЕ ЗА ДАННИ.


  Този документ описва структурата на файловете, които съдържат
данните за типовете и думите. Какво съдържа bg.dat и каква е
връзката с description.dat. Дават се обяснения за някой решения,
посочват се проблемните места в дизайна и евентуалните
разширения за следващи версии.


  Информацията за всеки един тип се пази в отделен файл.
Правилата за образуване на имената и разположението на тези
файлове е зададено в друг документ. Този документ специфицира
организацията на данните вътре в един такъв файл. При
обработката на файла трябва да се спазват следните правила:

1. Игнорират се всички празни редове.

2. Игнорират се всички интервали (white spaces) в началото и в
края на реда.

3. Всичко след знака # се смята за коментар и не се обработва.
Коментарите са в стил Perl.

4. На всеки ред може да има само по един елемент. Има случаи, в
които дадена дума има дублетна форма. В тези случаи те се
специфицират на един ред разделени със запетая и се броят за
един елемент.


  Този файл има две задължителни секции Окончания и Думи и една
незадължителна секция Тест. Секциите трябва да завършват със
знака двоеточие (:). Секциите Окончания и Думи трябва да ги има
само един път. Докато секцията Тест може да се среща произволен
брой пъти. Секцията Окончания трябва да се намира първа. След
това може да има нула или няколко секции Тест. Секцията Думи се
намира задължително последна.


  Секцията Думи съдържа думите, които принадлежат на този тип. В
секцията Думи не важат правилата за обработка на файла. В тази
секция не може да имаме празни редове, коментари или интервали в
началото и края на думата. Секцията свърша с края на файла. Т.е.
след реда "Думи:" до края на файла следва списък на думите,
всяка на нов ред и никакви други символи не са допустими. Това е
така за да се улесни сортирането и премахването на ограниченията
в списъка. Ако има коментари или интервали или други символи
процеса на обработка ще се затрудни ако трябва да се запазват
тези символи. Секцията Думи задължително трябва да съществува,
но може да няма елементи в нея. В секцията се записват само
основните форми на думите. Производни форми не са допускат. За
простота няма дефинирани префикси. Т.е. думите "разбиране" и
"неразбиране" трябва да ги има и двете.


  Секцията Тест служи за задаване на тестови случаи (test
cases). Идеята е да се създаде начин за автоматично тестване на
данните от секцията Окончания с цел да се избегнат грешки, били
те правописни или разместване на елементи или някакви други.
След първоначалното създаване на файловете и тестването им
ролята на тази секция намалява. Но може да се извършват тестове
ако има промени в секцията Окончания. Всяка секция Тест има
точно толкова елемента, колкото секцията Окончания. Взема се
първата дума от секцията Тест и върху нея се прилагат правилата
за образуване на формите. След това тези форми се сравняват с
останалите думи в секцията. Как се прилагат правилата е описано
по-надолу в документа.


  Секцията Окончания е най-важна. В нея са описани правилата за
образуване на производните форми от основната форма. Дизайна на
тези правила се опитва да намери баланс между правилата за
образуване на суфиксите в афикс файловете на OpenOffice.org и
ispell и правилата за изменение на някои букви в българският
език. Примерно от "е" на "я" в някои случаи. За съжаление
втората цел е постигната отчасти и се набляга повече на
удобството при създаване на афикс файловете (първата цел). Тук
има възможности за подобрения. Понеже секцията Окончания
отговаря на секцията Форми от description.dat то задължително тя
трябва да има поне един елемент.

Първият елемент има специално значение за тази секция и е
задължителен, за това ще му направим отделно описание:

1. Първият елемент съдържа окончанието, което трябва да се
извади от края на основната форма. Нулата (0) означава, че няма
какво да се вади (празен низ).

2. Може да се специфицира допълнителен филтър (условие, на което
отговарят думите в този тип) разделен със запетая (,). Ако няма
зададен допълнителен филтър като такъв се подразбира
окончанието, което трябва да се извади. Ако е 0 значи няма
филтър и всяка една дума може да влиза в този тип. Филтърът се
задава, чрез използването на регулярни изрази.

3. В случаите, когато имаме изменение на звук, окончанието
трябва да съдържа клас от допустими символи (справка регулярни
изрази). Класът трябва да бъде колкото се може по-строго
специфициран. В него не се допуска използването на глобални
символи или множества. Може да има само един клас. Ако се налага
използването на два класа се дефинира подтип. Справка примера
по-долу.


  Останалите елементи на тази секция са окончанията, които се
добавят (след като се извади първото) за да се получи
съответната форма. Нулата (0) отново означава, че няма какво да
се добавя (празен низ). Ако не съществува някоя форма от
description.dat се задава знака минус (-). Ако първият елемент
съдържа клас от допустими символи на съответното място те се
задават със знака въпросителна (?). Ако окончанието разрешава
дублетни форми те се разделят със запетая (,).


  Това е пример от noun/male/bg001.dat:

Окончания:
0
0
а
ът
ове
овете
а
-

Тест:
град
град
града
градът
градове
градовете
града
-


  Не се нуждае от коментар. Процедурата по образуване на формите
от основната форма е доста ясна.


  Това е малко по-сложен пример от noun/male/bg002.dat:

Окончания:
я[гхтрсв]
я?
е?а
е?ът
е?ове
е?овете
я?а
-

Тест:
бряг
бряг
брега
брегът
брегове
бреговете
бряга
-

Тест:
грях
грях
греха
грехът
грехове
греховете
гряха
-


  Стъпките за прилагане на правилата в този случай са:

1. Ако думата завършва на -яг се вади -яг и се запомня буквата
"г".

2. В останалите окончания въпросителната се заменя с "г" и се
добавя към резултата от изваждането.


  Това е пример със допълнителен филтър от noun/male/bg011.dat:

Окончания:
ъм, зъм
ъм
ма
мът
ми
мите
ъма
-

Тест:
организъм
организъм
организма
организмът
организми
организмите
организъма
-


  В този случай имаме специфициран допълнителен филтър. Вадим
само -ъм, но думите от този тип трябва да завършват на -зъм.


  Това е пример със допълнителен филтър съдържащ пълен регулярен
израз от verb/bg145a.dat:

Окончания:
[еа]са, [^аъиеоуяю][еа]са


  Класът може да се намира навсякъде в окончанието. В средата, в
края или в началото. Може да има само един клас. Наличието на
втори клас е недопустимо. Кратки правила за обработване на
окончанията, които съдържат класове.

1. Разделя се окончанието на три низа. Преди класа, самият клас,
и след класа. Вторият низ трябва да съдържа поне два символа.
Първият или последният низ могат да бъдат празни (с нулева
дължина).

2. При замяна се взема N-тия символ от края на основната форма,
където N е дължината на третия низ. Въпросителните в другите
форми се заменят с този символ.

3. При генериране на окончанията се прави цикъл на символите на
втория низ. Като всеки път се взема по един символ и той се
долепва по следния начин низ1 + символ от низ2 + низ3.


  Във всички случаи когато имаме клас, в останалите окончания
задължително има въпросителна. Единствено в тип 145 в някой
окончания не се среща въпросителна. Така, че въпросителната не
е задължителна ако имаме клас.


  Е точно този момент с класовете не ми харесва много, който има
по-добри идеи да споделя.

Проблемите са:
1. При добавяне на нови думи, може да се наложи допълнение на
класа.

2. Има някои случаи като bg043.dat и bg043a.dat където дължината
на символите след класа (третият низ) е различна. И в този
случай се наложи дефинирането на подтип.

  В българският език имаме изменение на звук при някакви
правила, които не можах да намеря лесен начин да ги задам. И
освен това трябваше да се намери лесен начин за конвертиране на
тези правила към начина на образуване на суфиксите за
OpenOffice.org. Именно поради последната причина твърдо заложих
на този формат, колкото и да не ми харесваше. Все пак върши
добра работа, много лесен е за обработка и бъдещи разширения
и се използва в малък процент от случаите.
