Искусственный интеллект. Строки, контекст и волны на Паскале - страница 25

Шрифт
Интервал



Илл. 34. Процедура Justbreak «распиливает» предложение на отдельные слова и сохраняет его в массив с числом элементов j.


В процедуре Justbreak происходит обработка предложения, поступившего в переменную S в двух циклах Repeat. В ней, индекс слова будет контролировать переменная j, а индекс последовательного символа в предложении – переменная i. Первый цикл присваивает новое значение счетчику индекса слова командой inc (j). Условием выхода из цикла, сохраняющего слово, будет символ пробела, запятой, двоеточия, точки или превышение индекса i длины строки предложения. Внутри этого цикла мы добавляем очередной символ к текущему слову, если он соответствует условиям – не равен знаку пунктуации или пробелу. Кто-то может возмутиться, ведь процедура разбивает некоторые составные слова, вроде «кто-то», «как-то», «как-нибудь» и т. д. Но в данном случае мы все же отделим «мух от котлет» – выделим составные конструкции как слова по отдельности, но запомним, в какой конструкции пунктуации они находились.

Модель пунктуации

Перейдем к процедуре сохранения пунктуации. Конечно же, она нам очень пригодится. Она очень проста.


Илл. 35. Выделение модели пунктуации из предложения.


Здесь мы берем исходное предложение и (на всякий случай) предварительно исправляем наиболее распространенные ошибки: наличие пробела перед символами пунктуации, с помощью ранее описанной процедуры insinstring. Далее поработаем с элементами массива signs, в котором будем хранить символы пунктуации на время обработки.

Здесь мы начинаем «путешествие» по индексу входного предложения, отмечая каждое слово символом пробела или символом пунктуации, если он есть. Кроме того, мы выделяем весь полученный блок служебными символами «^».

В результате, на строку «Антошка – плохой, нехороший.» мы получим следующую картинку пунктуации « ^-,.^». Что же, теперь мы можем рассматривать любое предложение как набор «чистых» слов и модель пунктуации, к нему прилагающуюся.

Теперь вновь вернемся к задаче, в которой требовалось выделить и обнаружить пару наиболее схожих слов в предложении.

Мы можем использовать следующий алгоритм:

1. Разбить слова в предложении на массив с помощью процедуры justbreak с числом элементов j.

2. Сравним каждое слово массива с каждым и если полученное значение является максимальным, то сохраним его, как ответ. Для этого нам потребуется два цикла и правило, по которому одно и то же слово мы не будем сравнивать с самим собой.