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

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

 

Осъзнай, че вечността наближава.
Бъди непогрешим...

разказ на мъдреца от оазиса

 

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

Изброените по-горе правила представят един много опростен модел на преносите в българския книжовен език. Пример за формализацията им може да се види в [19, 20] във вид на таблица, в която са кодирани 22 допустими околности на комбинацията между гласни, съгласни и специални букви, макар че не е ясно дали в този вид възможните сечения между отделните правила могат да се определят еднозначно, т. е. дали те са непротиворечиви и достатъчни. Друг по-добър начин е те да се представят чрез метода на контекстните забрани, т. е. да се формулира не това, което е позволено, а онова, което е забранено. Правила 1-11 се характеризират като локални, тъй като при тях няма значение къде се намира конкретната околност от букви (в началото, средата или края на думата), а 12-15 са глобални, тъй като се отнасят за думата като цяло. Със 'С' могат да се означат съгласните, с 'Г' – гласните, а отделно могат да се отбележат по-особените букви: 'й', 'ь', както и комбинацията 'дж'. С потъмняване на СС може да се отбележи поредността от две еднакви съгласни, а със знака '*' – поредност от нула или повече букви от едно и също множество (съгласни или гласни). Така правила 1-11 могат да се опишат съгласно [2, 3, 4]:

Не се допуска сечение в следните околности:

  1. ГС-Г
  2. ГС*С-Г, Г-С*СГ
  3. С-СС, СС-С
  4. С-ГГС
  5. СГ*ГГ-С
  6. Гй-С
  7. Гй-С*С, Г-йС*С
  8. Гй-Г
  9. ь-о
  10. С-ь
  11. д-ж

Тези правила могат да се минимизират със средствата на дискретната математика [8]. Например означението С*С в околността ГС*С-Г е съкратено означение на реда от конюнкции

ГСС-Г U ГССС-Г U ГСССС-Г U ...

Съобразявайки се с възможния брой последователности на съгласни в българския език, може да се положи СС-Г=р и да се запише като:

a formula

Тъй като a formula [8], то в случая би се получило:

ГС*С-Г = ГСС-Г U ГССС-Г U ... = СС-Г.

Като се действа по аналогичен начин [4], от правила 1-15 може да се извлече една минимална и независима ДНФ от седем контекстни забрани:

  1. С-Г
  2. Г-СС
  3. С-СС, СС-С
  4. ГГГ-С
  5. й-СС
  6. С-ь
  7. д-ж

Ето и един прост алгоритъм, който въз основа на тези седем контекстни забрани определя дали една дума w може да се раздели след i-тия знак:

// Дали буквата е гласна.
int is_vow (char ch) {return (strchr("аоеиъяуАюИОЕУЪЯ“, ch)!=NULL);}

// Дали 'ch' и 'c' са една и съща буква.
// (без разлика дали е главна или не!)
int is (char ch, char c) {return (ch==c||ch == c+32);}

// Функцията devisible отговаря на въпроса може ли думата w
// да се раздели след i-тата позиция.

int devisible (char * w, int i)
  {
    if (is_vow(w[i+1])) return is_vow(w[i]);
    if (is_vow(w[i]))
      {
        if (!is_vow(w[i+2])) 
          return (is(w[i+1],'д') && is(w[i+2],'ж'));
        if (i>2 && is_vow(w[i-1])) 
          return !is_vow(w[i-2]);
        return 1;
      }
    if (is(w[i+1], 'ь')||w[i-1]==w[i]||w[i+1]==w[i+2]) 
      return 0;
    if (is(w[i],'д')) 
      return !is(w[i+1],'ж');
    if (is(w[i],'й')) 
      return is_vow(w[i+2]);
    return 1;
  }
    

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

Повечето съвременни алгоритми в същината си спират дотук, но стремежът ни не е насочен към опростяване на българския език, като се отказваме от старите правила (с оправданието например, че поддържането на специални речници е неефективно!?). Целта също така не е да се даде прост алгоритъм, който да се основава на окастрени правила и за когото естествено после можем да кажем, че „не допуска никакви грешки и има абсолютна точност 100%“ [2, 3, 4, 19, 20]. За съжаление така са постъпили онези, които са предпочели да изхождат от тривиални изходни позиции и са съсредоточили огромната част от уменията си по-скоро за създаване на удобен интерфейс, отколкото за вникване в същината на реалния проблем.

(Заб. – едно малко по-илюстративно разглеждане на тези проблеми може да видите тук)

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

Съдържание

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. Някои статистики и резултати от проведени изследвания