АЛГОРИТМИ И ПРОГРАМИ В ТЕКСТООБРАБОТКАТА

(дипломна работа, София, ФМИ, 1995 г.)

3.4.1. Нови дефиниции, променливи, флагове и множества

При програмната реализация на локалните правила се налагат някои промени в изписването на дефинициите, както и добавяне на някои нови:

b_ – редовна буква на кирилица;

B_ – главна буква на кирилица;

l_ – редовна буква на латиница;

L_ – главна буква на латиница;

bB – българска буква (редовна или главна);

lL – буква на латиница (редовна или главна);

bl – редовна буква (на латиница или кирилица);

BL – главна буква (на латиница или кирилица);

bL – буква (главна или редовна, на латиница или кирилица).

Следствия.          b_ U l_ = bl; B_ U L_ = BL; b_ U B_ = bB; l_ U L_ = lL; bl U BL = bL.

n_  – цифра (0, 1, ..., 9);

_x  – знакът х, където х е кой да е аскизнак;

xx  – знак без значение.

Знакът '^' тук означава особени случаи. Ако направим аналогия със С++, той се явява първият елемент на escape-последователност, т.е. специална преобразуваща последователност.

^t – табулация;

^f – край на файл;

^@ – знак за маркиране;

^. – многоточие;

^- – това е тире, което не може да служи за пренос;

^  – твърд интервал, т. е. знакът отляво и този отдясно на него трябва да се намират на един ред;

^l – нов ред;

^! – елемент от множеството {!, ?};

^) – елемент от множество на затварящи скоби – {), ], }};

^( – елемент от множество на отварящи скоби – {(, [, {};

^~ – кой да е знак от множеството {$, #, &, ', *, +, <, =, >, ^, |, ~, \, @}.

Някои флагове, които реализират проверка на условията за прилагане на дадено правило (използват се само в правила от тип Ч? и К?, зададени са със стойностите си по подразбиране), са:

flag_conv			= 1; 
// Дали '/' да се преобразува в '(' 
// или съответно ')'. 0 – не; 1 – да.

flag_bulg_numbers		= 0; 
// Дали реалните числа се задават с ',' 
//(български стандарт).

flag_lat_numbers		= 1; 
// Дали реалните числа се задават с '.' 
//(латински стандарт).

flag_space_numbers		= 2; 
// Проблемът с ' ' между цифри. 0 – остава без промяна;
// 1 – маркиране; 2 – ' ' се заменя с твърд интервал.

flag_line_numbers		= 1;
// Проблемът с '-' между цифри. 0 – остава без промяна;
// 1 – заменя се с твърдо тире.

flag_for_numbering		= 1;
// Проблемът с изброяване в текст. 0 – остава 
// без промяна;
// 1 – осигурява се неразделност на първата 
// сричка с номерацията.

flag_short			= 1;
// Дали сме в околност на съкращение. 0 – не; 1 – да.

flag_tables			= 0;
// Проблемът с таблиците. 0 – промяна; 
// 1 – маркиране; 2 – без промяна.

flag_big_new_line		= 2;
// Проблемът с начален знак на нов ред. 
// 0 – без промяна; 
// 1 – маркиране; 2 – промяна.

flag_del_lines		= 0;
// Проблемът с излишните празни параграфи.
// 0 – без промяна; 1 – изключване на празен ред.

flag_opening		= 0; 
// Проблемът с отваряща кавичка. Не е реализиран локално.

flag_closing       	= 0; 
// Проблемът със затваряща кавичка. Не е реализиран локално.

flag_french_names   	= 1;
// Проблемът с наличие на френски имена. 0 – маркиране; 
// 1 – без промяна.

flag_chemistry      	= 0;
// Проблемът с индекси във вътрешността на дума.
// 0 – маркиране; 1 – без промяна.

flag_math           	= 0;
// Проблемът с индекс на края на дума.
// 0 – маркиране; 1 – без промяна.
    

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

локално(и) правило(а) + флаг (флагове) = глобално правило,

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

Картинно флаговете могат да се представят като двоичните стойности на една променлива от тип unsigned long с 32 бита, където ще остане място за евентуално допълване с други флагове. Теоретично са възможни 232 възможности на локални условия, но като се има предвид, че ще бъдат заети само 18 от битовите полета от това флагово пространство (като при това за някои от флаговете трябва да се отделят 2 бита, макар че за тях са възможни само 3 стойности, а и освен това flag_opening и flag_closing засега са фиктивни), се получават реално 27 648 активни варианта за настройка на тези условия. Полето на условията би изглеждало (флаговете са описани от младшите битове към старшите):

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0

0

1

0

0

0

1

0

0

0

1

1

1

1

0

1

0

1

Ако битовите сравнения се извършват програмно чрез прилагане на операцията shift (<< или >>), е редно флаговете да се подредят по честотата на обръщение към тях (от младши към старши битове). Макар и слабо, това би повишила скоростта на програмната реализация. Причината да не се задълбочава в тази подредба е, че в примерната създадена програма от приложението не се използва този начин на реализация, а се използва променлива за всеки флаг. Представя се това поле на условията по горния начин, тъй като ако го отбележим с S, то нашият преобразувател чрез функциите си за преход, зададени в таблица, би работил точно по начина, както е дефиниран в понятията на дискретната математика за краен преобразувател (подчинен на дяснорекурсивна граматика) [8], а именно:

S->αS' или S->α.

За да пристъпим към програмна реализация на локалните и глобални правила, са ни необходими и следните няколко множества:

{'най', 'НАЙ', 'по', 'ПО'} – степени;

{'в', 'и', 'а', 'о', 'у',  ...} – еднобуквени думи;

{'така че', 'тъй че',...} – думи, които стоят пред 'за да' и 'че' и между които не се слага запетая;

{'т. н.', 'т. е.', 'напр.',...} – обикновени съкращения;

{'гр.', 'с.', 'о.', 'д-р', ...} – съкращения пред;

{'кг', 'лв.', 'мм', ...} – съкращения след;

{'в', 'на', 'пред', 'зад', ...} – съюзи и предлози;

{'No', '§', '$', ...} – неделими цифрови представки;

{'лв.', '%', 'кг', 'мг', ...} – неделими окончания на цифри;

{'-та', '-тия', '-и', ...} – цифрови окончания с тире.

<< назад | отгоре | напред >>

Съдържание

0. Встъпление

1. Увод

2. Сричкопренасяне

2.1. Малко история

2.2. Правила за сричкопренасяне от 1983 г.

2.3. Метод на скандирането

2.4. Алгоритъм на сричкопренасянето по фонетичен и морфологичен принцип

2.4.1. Алгоритъм за откриване на морфема в дума

2.4.2. Алгоритъм за анализ на буква

2.4.3. Алгоритъм за анализ на дума

2.4.4. Алгоритъм за анализ на текст

2.4.5. Други възможности

3. Автоматизирано откриване и отстраняване на грешки в текст

3.1. Дефиниции и понятия

3.2. Често допускани грешки

3.3. Класификация на правилата

3.4. Примерна програмна реализация на локалните правила

3.4.1. Нови дефиниции, променливи, флагове и множества

3.4.2. Таблица на локалните правила

3.4.3. Функции, необходими за реализация на локалните правила

3.5. Глобални правила

3.5.1. Класификация на думите в текст на равнище знакове

3.5.2. Функции, необходими за реализация на глобалните правила

3.5.3. Функции и идеи, които предстоят да бъдат осъществени

4. Някои метрики в текстообработката

4.1. Текстови и шрифтови метрики

4.2. Сложност на текст

4.3. Професионализъм на предпечатната подготовка

4.3.1. Използване на възможностите на програмите чрез дефиниране на различни стилове

4.3.2. Премахване на излишното форматиране

4.3.3. Използване на възможностите за настройка на основните отношения между и в параграфите

5. Заключение

6. Литература

7. Приложениe

7.1. Списък на книгите, върху които са направени експерименти

7.2. Някои статистики и резултати от проведени изследвания