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

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


Далее, говоря об обработке строковых данных нам регулярно будет требоваться процедура замены подстроки в строке, как приведенная ниже InsInString:


Илл. 21. Замена подстроки в строке на нужный набор символов в процедуре InsInString происходит благодаря несложной конструкции из функций Pos, Length и Copy.


Как она работает. Переменная i получает позицию нахождения подстроки S2 в строке S. Если при этом позиция находится не на первом символе, в строку результата S4 копируется фрагмент строки до указанной позиции (фрагмент Copy (S,1,i-1), к нему прибавляется «слово» -замена S3, и оставшийся фрагмент текста за минусом уже полученного фрагмента с учетом стоявшего ранее на этом месте слова (фрагмент Copy (s,i+length (s2),length (s) -length (s2) -i+1)).

В операции замены первого слова есть небольшое различие – первым сразу становится подстрока замены S3.

Предположим, в строке «Мама мыла раму» нам необходимо заменить слово «раму» на «окно».

Замена производится в одно действие:



В данном случае переменная s2 получит измененную строку «Мама мыла окно». А в случае, если искомая подстрока не будет найдена, переменная S4 вернет в программу исходную строку S.

Но здесь необходимо учесть один момент. В случае, когда в текстовой строке встречается несколько раз одно и то же заменяемое слово, (например, слово «быть» в строке «быть или не быть»), процедуру следует повторить. Поскольку нам неизвестно, сколько раз во фразе может встретиться слово (или символ, или группа символов), один, три раза или 100 раз, мы можем усовершенствовать процедуру для того, чтобы она заменяла их все до тех пор, пока искомой подстроки в строке не останется. Здесь можно применить цикл Repeat с условием выхода.

Видоизменим процедуру InsInString, добавив цикл.


Илл. 22. Усовершенствованная процедура InInstring прекращает заменять подстроку только тогда, когда заменять остается нечего.


Еще одним необходимым элементом нормализации текста является его преобразование из строчного написания в заглавное для удобства последующего оперирования.27

То есть наша строка «Мама мыла раму» после обработки должна выглядеть как «МАМА МЫЛА РАМУ», где все буквы являются прописными, большими.

Приведенная ниже процедура Getups преобразует строку таким образом, что все символы, написанные строчными буквами становятся прописными, а все прочие символы – копирует в той же позиции. Для этого процедура, которая работает со строкой использует другую процедуру, (