Лидовский В.

ПЕРВИЧНАЯ МАШИННАЯ ОБРАБОТКА ТЕКСТА: МЕТОДИКА И ПРОБЛЕМАТИКА

РЕЗЮМЕ

В этой книге подробно рассматриваются проблемы формализации текстов наиболее общего вида (например, многоязычных) и методов первичной, не использующей семантической информации, машинной обработки таких формализованных текстов. Итогом книги является перечисление свойств и возможностей некоторой гипотетической ``почти'' идеальной программы для такой обработки. Большое внимание уделено рассмотрению систем кодировки, маркирования (в частности, SGML) и подобным темам. Книга предназначена прежде всего для филологов и программистов, но может быть полезна и всем интересующимся означенными проблемами.

1997

ОГЛАВЛЕНИЕ

Введение

Общая схема обработки текста на вычислительной машине

Особенности работы с многоязычными текстами

Выбор системы кодировки

Маркирование текстов

Системы обобщенного маркирования текстов

Русификация таблиц кодировок на основе ASCII

Настройка систем ввода

Настройка системы шрифтов

Недостатки существующих способов представления текстов в машинной форме

Настройка системы печати

Система переходов от одного языка к другому

Обзор типов программных систем, используемых при обработке многоязычных текстов

Поддержка программами Летнего института лингвистики работы с многоязычными текстами

Минимальные требования к аппаратуре при работе с многоязычными текстами

Сравнительный анализ программ филологической работы с текстами

Идеальная программа первичной обработки текстов

Список литературы

ПРИЛОЖЕНИЕ. Программа CC

Введение

Сегодня стало уже очевидным, что абсолютное большинство лингвистических научно-исследовательских работ немыслимо без использования современной электронно-вычислительной техники. Причем для многих таких работ использование компьютеров позволяет значительно расширить горизонты исследований, а в некоторых случаях, даже прийти к постановке и разрешению совершенно новых, качественно других проблем. Но и для тех задач, где использование ЭВМ не дает ощутимых качественных преимуществ, использование машинных методов только лишь для совокупности операций по подготовке публикаций дает существенный рост эффективности работы, т.к. снижаются материальные и временные затраты.

Кроме собственно филологических задач, обработка текстов представляет собой область приложения интересов для такого таинственного и перспективного направления в науке как Искусственный Интеллект. Последнее является следствием того, что тексты, являясь отражением практически всех знаний, накопленных человечеством за всю его историю, сравнительно просто переводятся в формальную, машинную форму.

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

Целью данной книги является тщательный разбор сути общего процесса обработки текстовой информации, а также анализ и сравнение некоторых конкретных существующих программных средств обработки текстов, используемых филологами. Особое место будет постоянно выделяться описанию сложностей и особенностей работы с текстами наиболее общего вида — многоязычным текстами. И в связи с этим в книгу войдет обзор одной весьма популярной в интернациональном сообществе филологов разработке — набору программ Летнего института лингвистики (Summer Institute of Linguistics — SIL, США).

Большое внимание будет уделено рассмотрению различных систем кодировки текстов, а также различным системам маркирования: SGML, HTML и другим.

Общая схема обработки текста на вычислительной машине

Процесс обработки текста на вычислительной машине можно разбить на три основные стадии.

Первый этап — это ввод текста в компьютер. На этом этапе имеющуюся исходную текстовую информацию необходимо перевести в форму, пригодную для дальнейшей обработки на вычислительных машинах. Этот этап является единственным из всех стадий процесса обработки текста, аналоги которого отсутствуют при полностью "ручной" работе с текстами. Сегодня существует множество способов ввода текстов в компьютер. Самые распространенные из них — это ввод с использованием клавиатуры (машинописный способ) и ввод текстов при помощи сканера и программы оптического распознавания символов. Все большую популярность приобретают также рукописный ввод с использованием графического планшета и специального программного обеспечения, а также звуковой (речевой) ввод, обеспечиваемый специальной аппаратурой и тесно связанным с ней набором программ. При вводе текста в компьютер любым способом часто используют специальные программы автоматической проверки правописания, или spellchecker'ы.

Суть ввода текста в компьютер состоит в следующем. Исходный текст, подлежащий такому вводу, переводится в последовательность чисел, адекватно его отображающих. При таком переводе каждому из уникальных символов текста ставится в соответствие некоторое уникальное число (или последовательность чисел), называемое кодом этого символа. Кроме того, как правило, текст при вводе дробится на строки путем помещения специально выделенного для этой цели кода в концы строк. Печать текста на пишущей машинке можно, в каком-то смысле, рассматривать как один из ближайших аналогов перевода того же текста в машинную форму: кодам букв, цифр, пробела, пунктуационных и прочих видимых при печати знаков соответствуют нажатия алфавитно-цифровых клавиш, а коду, отмечающему концы строк, соответствует рычаг перехода на начало новой строки. Таким образом, кроме кодов, соответствующих обычным печатным знакам, в текст в машинной форме могут вноситься специальные, не имеющие соответствия среди печатных знаков коды, называемые также кодами управляющих символов. Кроме символа для разделения строк, существуют и другие управляющие символы, например, символ для деления текста на страницы. Было бы очень неудобно, если бы соответствие чисел (кодов) символам не было бы никак зафиксировано и произвольно менялось бы от текста к тексту. Поэтому такая трансляция является строго стандартизированной и отражается в так называемых таблицах кодировки.

Таблица кодировки — это занумерованные буквы одного или более алфавитов, цифры, пунктуационные и прочие часто используемые знаки и управляющие символы. Номера всех этих символов называют их кодами (в некоторых производных таблицах кодировки в качестве дополнительных кодов могут выступать последовательности некоторых номеров). Нужно отметить, что сами таблицы кодировки не могут быть формально представлены в машинной форме и, следовательно, использоваться каким-либо образом при компьютерной обработке текстов. Эти таблицы представляют собой лишь мост между реальной текстовой информацией и ее компьютерной формой. Все существующие ныне технологии ввода текста в компьютер опираются на соглашения, задаваемые ограниченным числом стандартизированных таблиц кодировки.

Для программ интерактивного ввода, т.е. ввода, в процессе которого пользователь имеет возможность видеть на компьютерных устройствах вывода (дисплей, принтер и т.п.) визуальный образ введенного текста, необходимо использование, как минимум, одной таблицы шрифта, соответствующей применяемой таблице кодировки.

Таблица шрифта представляет собой набор графических образов (рисунков) символов. Причем в этой таблице задается соответствие каждого образа некоторому коду (числу или последовательности чисел). Для адекватного показа текста необходимо, чтобы таблица шрифта соответствовала по содержанию выбранной таблице кодировки, т.е. чтобы каждому неуправляющему символу из таблицы кодировки соответствовал по коду правильно его отображающий графический образ из таблицы шрифта. Используя таблицу шрифта, программы интерактивного ввода по коду символа выдают на устройство вывода компьютера визуальный образ, соответствующий этому коду. Таблица шрифта называется также компьютерным шрифтом (существуют еще и типографские шрифты, сделанные из дерева, металлов и т.п.) или (если ясно, что речь идет о машинном объекте) просто шрифтом.

Многие современные программные средства дают возможность работать одновременно с большим количеством компьютерных шрифтов, соответствующих самым разным таблицам кодировок.

Для того чтобы при отображении текста некоторые его участки были так или иначе выделены (средства выделения обычно включают в себя подчеркивание, наклон и утолщение символов, использование другого шрифта, а также комбинирование перечисленных и других средств) и/или отформатированы (средства форматирования среди многих возможных прочих обычно включают в себя центрирование строк, выравнивание строк текста по правому краю и выделение абзацев отступом), нужно вносить в текст в машинной форме информацию об участке и типе выделения или форматирования. Эта дополнительная по отношению к базовому тексту информация называется разметкой, элементы разметки — маркерами, а сам процесс внесения такой информации — маркированием. Часто внесение многих маркеров в текст при использовании современных программ редактирования и набора текстов происходит в полуавтоматическом режиме. Разметка позволяет также внести в текст структуру, что дает возможность, например, отделять собственно текст от комментариев и т.п.

Таким образом, ввод текста в компьютер состоит в следующем: сначала выбирается соответствующая данному тексту таблица кодировки, а затем для каждого символа из исходного текста в компьютер вводится код этого символа в выбранной таблице кодировки и, кроме того, по мере необходимости вводятся также управляющие символы. При клавиатурном вводе такая трансляция образа символа в код осуществляется в два этапа. На первом, ключевом из них, человек-оператор набирает на клавиатуре соответствующий данному образу символа из входного текста клавиатурный код (комбинацию клавиш), который далее посредством таблицы раскладки клавиатуры транслируется в код символа в таблице кодировки. При автоматизированных способах ввода (оптическом, акустическом, рукописном или подобных) программы-распознаватели сразу же переводят образы символов в их коды в выбранной таблице кодировки. При необходимости увидеть текст, переведенный в машинную форму, используется компьютерный шрифт, соответствующий выбранной таблице кодировки. Опциональная разметка может вноситься как одновременно с вводом текста, так и после него.

Из написанного выше следует, что при вводе текста в компьютер практически полностью теряется информация об особенностях начертания конкретных символов исходного текста. Часто также теряется и информация об особенностях распределения текста по строкам, абзацам, страницам и т.п.

Второй этап — это собственно обработка текста с целью получения тех или иных результатов. Результаты обработки текста — это тоже текст, который можно использовать для дальнейшей обработки. Наиболее типичны следующие операции с текстами: построение словников, конкордансов, сбор статистики и дальнейшая работа с этим материалом (разбиения, слияния, поиск подтекстов, выборки, прочие преобразования и статистическая обработка). При этом можно выделить несколько элементарных типовых процедур, применяемых почти во всех лингвистических исследованиях, проводимых с помощью ЭВМ: сегментация (в простейшей форме — это выделение словоупотреблений и членение текста на фразы и предложения); лемматизация (сведение различных форм одной и той же единицы, обычно слова, к ее категориальной или словарной форме); характеризация и категоризация (приписывание признаков и образование классов единиц, объединяемых какими-либо признаками); инвентаризация (образование перечней единиц или классов); установление и категоризация связей между единицами разных перечней; образование различных выборок из перечней и упорядочение членов выборки (группирование); форматная выдача результатов по запросу. Следует отметить три очень существенные особенности этих процедур: произвольность их сочетаний во времени, совместность исполнения и использование результатов работы друг друга; их уместность на всех уровнях языка и членения текста; их зависимость от внешних по отношению к объекту обработки данных (глобальных и локальных характеристик текста, глобальных и локальных правил обработки составляющих). Некоторые из этих операций могут осуществляться только специализированными лингвистическими программами, а некоторые могут осуществляться как такими специализированными программами, так и широко распространенными коммерческими пакетами: текстовыми редакторами, системами управления базами данных (далее БД), электронными таблицами, статистическими пакетами и др. Как правило, осмысленная лингвистическая обработка осуществляется на больших и сверхбольших объемах информации, что делает реализацию такой обработки конструктивно очень непростой.

На этом этапе обработки текстов, как правило, используются так называемые таблицы сортировки. Как уже отмечалось выше, текст в машинной форме — это просто последовательность кодов. Таблицы сортировки позволяют присваивать символам из выбранной таблицы кодировки произвольный порядок, что, например, дает возможность задавать некоторым символам одинаковый порядок (прописным и строчным буквам, буквам е и ё) или использовать одну таблицу кодировки для работы со схожими алфавитами (напр., немецким и шведским), меняя порядок лишь нескольких символов и т.п. Стоит отметить, что даже в случае отсутствия при обработке текста таблицы сортировки, эта таблица все равно присутствует неявно, задавая порядок кодов, определяемый их собственными значениями и отношениями "больше" и "меньше" между ними. Таблица сортировки в отличие от таблицы кодировки является чисто машинным объектом, так как она всегда оперирует только с кодами символов и никогда — с самими реальными символами.

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

Третий этап — это печать текстов. Этот этап полностью противоположен первому, на нем текст из формы, удобной для обработки на компьютере, переводится в форму, наиболее удобную для человека. На этой стадии кодам машинного представления текста ставятся в соответствие образы символов (из таблиц шрифтов), которые и выводятся на печать.

Схематически и несколько упрощенно процесс обработки текста на ЭВМ представлен на схеме 1.

Схема 1.

Особенности работы с многоязычными текстами

Многоязычный текст — это текст, содержащий литеры некоторого множества алфавитов, требующий в общем случае для своей обработки разных раскладок клавиатуры, кодовых таблиц, шрифтов, разных таблиц сортировок и правил проверки орфографии к своим различным фрагментам. При обработке деловой документации в многоязычном тексте могут понадобиться разные форматы чисел, дат, обозначений времени и валютных знаков. Многоязычный текст представляет собой гораздо более сложный объект для всех стадий работы с текстом на компьютере, чем одноязычный текст. Большинство возможностей для работы с текстами, заложенных в базовое программное обеспечение существующих моделей компьютеров, часто не применимы к многоязычным текстам. Среди проблем, возникающих при попытке работы с многоязычным текстом на вычислительной машине, главные следующие:

Рассмотрим каждую из этих проблем подробнее.

Выбор системы кодировки

Обеспечение правильного внутрикомпьютерного представления символов (кодировки) — это самая сложная задача при работе с многоязычными текстами. Дело в том, и это уже отмечалось выше, что все существующие программы для обработки текстов работают не с образами литер, а с их кодами (программы оптического, рукописного и звукового распознавания могут в некоторых частных случаях только транслировать образ в код). Поэтому от выбора кодировки зависит вся дальнейшая работа с текстом. К сожалению, в силу исторических причин все наиболее широко известные и применяемые таблицы кодировок не позволяют присвоить уникальные коды более чем 256 различным печатным знакам. Далее будет следовать ретроспективный обзор различных известных систем (таблиц) кодировки символов для персональных компьютеров.

В основе практически всех существующих сегодня таблиц кодировки лежит стандарт ASCII (American Standard Code for Information Interchange) (его отечественный аналог — КОИ-7, Код для Обмена Информацией 7-битный), принятый международной организацией по стандартизации (International Standarts Organisation — ISO) в качестве универсального кода для обмена информацией (стандарт 646). Рассмотрим структуру кодов ASCII подробнее.

Первые 32 позиции (от 0 до 31) и последнюю 128-ю (код 127) занимают коды управляющих символов, большинство из которых в существующих системах обмена и обработки цифровой информации практически не используются:

Остальные символы кода — печатаемые:

Таким образом, код ASCII — это 7-битная таблица кодировки, т.е. она позволяет закодировать только 128 символов, а из-за того, что 33 из них — управляющие, реальное количество печатаемых символов, которые можно ею закодировать, снижается до 95. В эти 95 символов входит пробел, цифры, пунктуационные и некоторые другие часто используемые знаки, а также базовый латинский алфавит, на котором записываются команды и сообщения компьютера, операционной системы и многих системных программ. Латинский алфавит состоит из 26 заглавных и 26 строчных букв. Теоретически к ним можно добавить еще более 20 знаков, размещаемых в практически не используемых позициях 1..6, 14..16, 18, 20..25, 28..31 (приведенный список позиций можно расширить, так как при обработке текстов на IBM PC совместимых ПЭВМ, в качестве управляющих, в большинстве случаев, рассматриваются лишь коды 10 и 13, к которым гораздо реже присоединяются коды 0 и 26), однако размещение в этих позициях печатаемых символов противоречит изначальному стандарту ASCII и может приводить к проблемам при использовании этих символов с некоторыми прикладными программами и устройствами ввода/вывода.

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

Однако несмотря на жесткие ограничения ASCII, затрудняющие его использование для работы с многоязычными текстами, этот код до сих пор находит себе применение как наиболее универсальный и лежащий в основе всех позднейших систем кодировки символов. При работе со сложными, в частности, многоязычными текстами, содержащими большое число различных символов, для каждого символа, не входящего в ASCII, в качестве его кода формируется последовательность символов ASCII. Как правило, все такие последовательности начинаются с одного и того же специально выбранного символа, который не используется самостоятельно (его по аналогии с escape-символом (код ASCII 27) также часто называют escape-символом). Часто в качестве такого символа используют знак обратной косой черты. Главный недостаток такого кодирования — это отсутствие каких-либо международных стандартов в этой области, что приводит к отсутствию поддержки такого кодирования абсолютным большинством прикладных программ.

Другой способ использования этой кодировки (применяемый, например, в КОИ-7 и в других национальных кодовых таблицах) — это замена символов части, а в пределе и всей таблицы ASCII. Например, кодам ASCII, соответствующим символам фигурных и квадратных скобок, иногда ставят в соответствие немецкие буквы со знаком умлаута. Но в этом случае либо приходится идти на утрату знаков скобок, либо переносить их в другие позиции, что, очевидно, в свою очередь, приводит к потерям знаков, расположенных в этих позициях.

Последний способ использования ASCII можно сделать очень мощным, если использовать разметку, что позволило бы, например, точно указывать связь участка текста в машинной форме с таблицей кодировки для его интерпретации.

Дальнейшее развитие кода ASCII — это так называемый расширенный 8-битный ASCII (его отечественный аналог КОИ-8). Этот код дает возможность закодировать до 256 символов и в некоторых случаях использовать первые 32 позиции для отображаемых символов. Дополнительные 128 кодов (с номерами от 128 до 255) и опциональные 32 кода (с номерами от 0 до 31), предоставляемые данной таблицей кодировки, были стандартизированы лишь на уровне большинства фирм-производителей ПЭВМ и программного обеспечения для них, а не на уровне универсального кода для связи всех цифровых устройств, как базовый ASCII (эти коды, большие 128, получили также название IBM extension set — расширенное множество фирмы IBM). Этим дополнительным кодам жестко ставятся в соответствие следующие группы символов: 34 символа с диакритиками и лигатуры для большинства алфавитов западноевропейских языков и пять знаков некоторых национальных валют (коды 128-169), символы псевдографики (коды 176-223), различные значки, пиктограммы и некоторые математические символы, включавшие в себя 12 греческих букв (коды 1-31, 168-175, 224-254). Таким образом, расширенный ASCII включает в себя в дополнение к базовому латинскому алфавиту еще 34 буквы, дополняющие базовый латинский алфавит до национальных алфавитов большинства языков западноевропейских стран. Путем перепрограммирования этого жесткого соответствия кодов и символов появлялась возможность работать с текстами, содержащими символы двух и более различающихся в графике алфавитов (например, алфавитов на основе латинского, кириллицы, арабского и т.д.).

Если не изменять значений первых 128 кодов (базовый стандарт ASCII) и кодов символов псевдографики (использование позиций псевдографики рискованно — это может привести к большим неудобствам при использовании многих прикладных программ), то остаются до 80 кодов, значения которых можно изменить. Таким образом, код на базе расширенного ASCII и максимально с ним совместимый дает позиции только для приблизительно 130 алфавитных знаков.

Использование разметки в этом случае, как и в случае с 7-битными кодами, позволит получить очень мощную систему кодирования, способную покрыть нужды практически любой задачи по переносу текстов в машинную форму.

Позднее на основе кода ASCII начал формироваться новый нелинейный способ кодировки символов на основе кодовых страниц и информации о стране. Каждая кодовая страница специфицируется числом от 0 до 999 (теоретический максимальный предел 65535) и задает соответствие кодов от 0 до 255 некоторым знакам. Таким образом, кодовые страницы стандартизировали перепрограммирование кодов расширенной таблицы ASCII. Информация о стране также идентифицируется трехзначным десятичным числом (это, как правило, телефонный код выбранной страны) и позволяет, помимо прочего, не связанного явно с задачей обработки текстов, задавать таблицу сортировки к выбранной кодовой странице.

Ясно, однако, что для тех языков, для записи текстов на которых используются более 130 литер (для таких языков, в частности, корейского, японского и китайского, используются особые двубайтовые (их еще называют широкими) коды и двубайтовые кодовые страницы), а также в случае необходимости работать с текстом, содержащим литеры более чем двух-трех национальных алфавитов, стандарт кодовых страниц не совсем удовлетворителен. Кроме того, стандарт кодовых страниц очень плохо поддерживается большинством прикладных программ. Автору неизвестна ни одна программа, которая бы поддерживала все известные кодовые страницы или позволяла бы переключаться между кодовыми страницами или хотя бы таблицами сортировки во время работы.

Новый стандарт кодирования символов Unicode является 16-битным, что позволяет закодировать до 65536 символов. Таблица кодировки Unicode имеет линейную структуру, начало которой совпадает с ASCII. В этом стандарте представлены практически все существующие на земле системы письменности, включая иероглифические. Кроме того, в Unicode зарезервированы места для доопределения их конечными пользователями. В настоящее время Unicode поддерживается только 32-разрядными операционными системами (такими как Microsoft Windows NT и некоторыми другими). Однако возможностей даже этой, находящейся на стадии внедрения новейшей системы кодирования, может не хватить в случае работы со сложными текстами, встречающимися в филологии. Обычный пример — использование сложной системы диакритик, когда на один символ может накладываться произвольное число различных диакритических знаков.

Описанные выше стандартные системы кодирования являются базовыми по отношению ко многим другим, используемым только в том или ином наборе прикладных программ, и которые по тем или иным параметрам могут превосходить стандартные. В качестве примеров можно назвать систему TEX или программы Летнего института лингвистики.

Маркирование текстов

Идея внесения в текст специальных маркеров имеет следующие предпосылки.

Любой текстовый документ может быть рассмотрен теоретически, как структура, состоящая из элементов различных типов. Например, автор организует свою книгу из разделов, каждый из которых содержит абзацы и может содержать иллюстрации, которые, в свою очередь, должны иметь некоторую сопроводительную надпись. Редактор составляет более сложный текст из статей, которые разделены на абзацы, которые состоят из слов.

Компьютерные текстовые редакторы должны обрабатывать такие различные элементы по-разному. Например, при печати нужно, чтобы заголовки были напечатаны выделяющимся шрифтом, абзацы выделены отступами и т.п., т.е. нужно, чтобы читателю визуально были переданы структура и другие атрибуты текста. Аналогично, информационно-поисковые системы будут особым образом обрабатывать слова в заголовках при создании словарей.

Хотя связь между атрибутами документа и тем, как он будет обрабатываться, сегодня кажется очевидной, имеется тенденция делать эту связь менее понятной, вовлекая в ее объяснения описания как старых, "ручных", так и первых машинных методов текстовой обработки. В докомпьютерные времена редактор маркировал исходные тексты специальными инструкциями, которые описывали желаемый формат итогового документа и, руководствуясь которыми, наборщик создавал полиграфическое издание. Все связи между инструкциями и структурой документа в этом случае полностью содержались в голове редактора. Первые машинные системы продолжили этот подход добавлением специфических маркеров к созданным на компьютерах файлам документов. Эти маркеры по-прежнему означали определенные инструкции по обработке, но они записывались на специфическом языке машинной системы, понятном форматирующим компьютерным программам, но не человеку-наборщику. Однако, эти файлы документов не могли быть просто использованы для других целей или на других машинных системах без смены всех маркеров.

По мере того, как пользователи компьютеров становились все более опытными, а программы для работы с текстами все более мощными, были развиты новые методы, которые позволяли избежать описанных выше проблем. "Вызовы макросов" (или "формальные вызовы") стали употребляться в тех местах текста, к которым требовалось применить те или иные процедуры обработки. При этом сами инструкции обработки стали содержаться отдельно от файла документа, в "процедурах" (или "определениях макросов"), в которых они могли быть легко изменены. Такая разметка получила название процедурной.

Этот тип разметки, однако, также имел множество недостатков. Один из них — это высокая вероятность потерь различных атрибутов документа. Если, например, пользователь решит центрировать как заголовки, так и надписи к иллюстрациям, то внесенная перед заголовками и надписями команда "центрировать" не будет в дальнейшем сигнализировать о том, какой элемент текста стоит перед ней, заголовок или надпись к иллюстрации. Таким образом, если впоследствии пользователь захочет использовать этот документ в информационно-поисковой системе, то программа поиска не будет способна отличить заголовки, несущие очень важные данные о содержании документа, от относительно малоинформативных для документа в целом участков текста, которые также следует центрировать при печати.

Процедурную разметку отличает также ее чрезвычайно малая гибкость. Так, если пользователь захочет сменить стиль документа (например, вследствие смены устройства печати), то ему придется повторить большую часть процесса маркирования, чтобы отразить требуемые изменения.

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

Недостатки процедурной разметки были столь очевидны, что она естественным образом стала трансформироваться в другой, более удобный тип разметки (тем не менее, стоит отметить, что высокая популярность такой системы как TEX, основанной на высокоразвитой процедурной разметке, показывает, что для некоторых видов работы с текстами только что описанные недостатки практически не дают о себе знать; то же можно сказать и о машинно-ориентированной разметке языка описания страниц Postscript, хотя последний только с большими оговорками можно считать языком разметки текстов).

Так, хотя вызовы макросов при процедурной разметке могли быть расположены в любом месте документа, пользователи стали замечать, что большинство из них размещаются в начале и конце элементов формата текста. Естественно, что для таких вызовов старались выбирать имена, которые характеризовали бы родовые свойства типов элементов формата текста, а не имена процедур обработки (например, имя "заголовок" вместо "форматирование-17"). Использование таких имен и положило начало "обобщенному кодированию" (или "обобщенной разметке").

Принципы обобщенной разметки были впервые сформулированы в работах C.F.Goldfarb, E.J.Mosher, T.I.Peterson "An Online System for Integrated Text Processing" и C.F.Goldfarb "Document Composition Facility Generalized Markup Language: Concepts and Design Guide":

а) Маркированием следует описывать структуру и другие атрибуты документа, а не специфицировать виды его обработки, маркирование должно делаться только один раз и быть достаточным для всех видов дальнейшей обработки;

б) Маркирование должно быть строгим и точным в том смысле, чтобы такие чувствительные к форме входных данных объекты как компьютерные программы и системы управления БД могли быть используемы при работе с размаркированным документом.

Обобщенная разметка стала большим шагом вперед на пути создания систем автоматической обработки текстов, отражающих естественные отношения между атрибутами документа и его обработкой. Появление "языка обобщенной разметки" в начале 70-х повело эту тенденцию дальше через обеспечение формальной языковой базы для обобщенной разметки. Язык обобщенной разметки соблюдает два главных принципа.

1) Описательные маркеры являются доминирующими над инструкциями по обработке и различающимися от них.

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

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

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

2) Маркеры формально определяются для каждого типа документа.

Язык обобщенного маркирования формализирует маркеры документа введением "определения типа документа". Определение типа включает спецификацию (подобно формальной грамматике) каждого элемента и атрибута, который может встретиться в документе, а также порядка таких встреч. С этой информацией возможно определить, правильна ли разметка для конкретного отдельного документа, и восстановить многие пропущенные маркеры, основываясь на маркерах, присутствующих в документе.

Системы обобщенного маркирования текстов

Основы систем обобщенного маркирования были заложены доктором Голдфарбом (dr. Goldfarb), впервые опубликовавшим в 1970 г. описание языка обобщенного маркирования текстов — GML (Generalised Markup Language). Язык GML, созданный также и с целью облегчения обмена документами между различными системами, стал основой принятого в 1986 г. Международной организацией по стандартизации (ISO) стандарта 8879, описывающего язык SGML (Standart Generalized Markup Language). В 1988 году в этот стандарт были внесены незначительные изменения. Ввиду того, что системы маркирования на основе SGML (среди них стоит отметить систему TEI) приобретают все большую популярность, следует остановиться на его базовых характеристиках поподробнее.

Фундамент SGML, как и вообще систем обобщенного маркирования, составляет концепция взаимоотношений между документами, определениями типов документов и процедурами обработки текстов.

Документ SGML — это логическая, древовидная конструкция, состоящая из элементов документа. Неконечными узлами такого дерева-конструкции выступают такие элементы как главы, абзацы и т.п., а конечными — символы текста или нетекстовая информация (например, рисунок). Для иллюстрации сказанного приводится следующая схема, содержащая один из возможных вариантов документа.

                           КНИГА
                          /     \
                     ГЛАВА  ...  ГЛАВА
                    /     \     /     \
                АБЗАЦ  ................ АБЗАЦ
             /        \               /      \
  <текст абзаца> .... ... ..... ....... <текст абзаца>

Элементы документа различаются один от другого дополнительной информацией, вносимой в текст при его маркировании. Таким образом, документ SGML состоит из двух сортов информации: собственно данных текста и разметки.

Разметка SGML — это текст, который добавляется к данным документа для ввода дополнительной информации о них. Все маркеры SGML делятся на четыре категории.

1. Описательные маркеры. Они определяют структуру документа.

2. Определяющие ссылки на данные. Они дают возможность вносить в документ не сами данные (текст, картинки и т.п.), а только ссылки на них, что позволяет вводить сокращения для используемых часто данных и многое другое.

3. Декларации компонентов разметки. Декларации — это положения, которые контролируют ход интерпретации разметки документа. Они, в частности, служат для определения типа документа.

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

Описательные маркеры отмечают начало и конец элемента. Они состоят из трех частей. Первая — это знак начала маркера начала или конца элемента (для них рекомендуются знаки "<" и "</" соответственно). Вторая — это название маркера (любое слово) и опциональный список назначения атрибутам маркера значений (об атрибутах см. ниже). Третья — это знак конца маркера (для него рекомендуется знак ">"). Например, предложение "Это <цит>пример</цит> использования SGML" содержит маркер начала элемента "<цит>" и маркер конца элемента "</цит>".

Маркеры, определяющие ссылки на данные, отмечают начало и конец ссылки и состоят из двух частей. Первая — это знак начала ссылки (для него рекомендуется знак "&"). Вторая — это знак конца ссылки (для него рекомендуется знак ";"). Пример использования ссылки: "Стандарт &SGML; поддерживает офисные и издательские системы".

Маркеры, осуществляющие декларации компонентов разметки, состоят из знака начала декларации (рекомендуется "<!"), имени сущности декларации, декларируемого имени, определения декларируемого имени и знака конца декларации (рекомендуется ">"). Например, положение <!ENTITY SGML "Standart Generalized Markup Language"> описывает ссылку SGML, пример использования которой приведен в предыдущем абзаце.

Маркеры, вводящие инструкции обработки текста, состоят из знака начала такой инструкции (рекомендуется "<?"), самой инструкции (возможно, с параметрами) и знака конца инструкции (рекомендуется ">"). Например: "<?newpage>".

Определение типа документа может содержать до трех видов различных определений:

В качестве примера определения типа элемента документа можно привести определение элемента типа "книга": <!ELEMENT книга (начало, середина, конец)>. Определенный таким образом элемент типа "книга" должен состоять строго из трех заданных элементов (для каждого них тоже должно приводиться определение), идущих в заданном порядке.

При определении структуры элемента можно пользоваться знаками, имеющими специальное значение (конкретный вид этих знаков не есть часть стандарта SGML, который имеет средства для произвольного их определения, но рекомендуемый для использования). Все такие знаки можно разделить на четыре типа:

группирования — это открывающая и закрывающая круглые скобки;

индикаторы частоты — это знаки:

соединители — это знаки:

Итак, часть определений документа типа "книга" может выглядеть следующим образом:

<!ELEMENT книга (начало?, содержимое, конец?)>

<!ELEMENT содержимое (абзац | рисунок)+>

<!ELEMENT начало (заглавие & автор & издательство)>

<!ENTITY % фраза "цитата | ссылка">

<!ELEMENT абзац (#PCDATA | %фраза;)*>

<!ELEMENT рисунок EMPTY>.

Где знак "%" используется для определения и использования (вместо "&") ссылок, применяемых в определениях. "PCDATA" обозначает любой символ текста, а EMPTY — специальное значения для данных, не относящихся к SGML. Таким образом, определение типа документа задает формальную грамматику языка представления документа.

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

<!ELEMENT письмо (от, к, тема, содержимое, подпись, дата?)>

<!-- ЭЛЕМЕНТ ИМЯ ЗНАЧЕНИЕ ПРЕДОПР.-->

<!ATTLIST письмо стадия (работа | конец) "конец"

    секретность CDATA #REQUIED

    версия NUMBER "01"

    отправитель NAME #IMPLIED>

В этом примере приведено описание атрибутов элемента документа с типом "письмо" с атрибутами: "стадия", который может иметь значение "работа" или "конец" (предопределенное); "секретность", который может иметь значение строки от нуля и более символов ("REQUIRED" означает необходимость задания этого атрибута); "версия", который может иметь значение строки из одной и более цифр; "отправитель", может иметь значение любого синтаксически правильного в SGML имени ("IMPLIED" означает, что в случае неуказания этого атрибута, программное приложение должно назначить его само). Маркер "<!--" используется для ввода комментариев (по рекомендации к SGML). Таким образом можно использовать описательный маркер, начинающий письмо так: <письмо секретность="для внутреннего пользования" отправитель="ИРЯ">.

Большое внимание в SGML уделено вопросам работы с многоязычными данными. Каждое описание типа документа включает в себя описание значений всех 256 однобайтовых, 8-разрядных кодов (для типичных наборов значений вместо полного описания используют ссылки) для данного документа. Кроме того, SGML предоставляет возможность для работы с заданными последовательностями 8-разрядных кодов, как с одним кодом.

В SGML нашли отражения практически все детали работы с текстами. Например, даже такая техническая деталь, как разбиение текста в машинной форме на строки, нашла в нем тщательнейшее отражение.

Кроме основных, базовых положений в SGML определены многие полезные возможности, которые не являются обязательными компонентами этого стандарта и могут отсутствовать в конкретных реализациях систем интерпретации определенной SGML разметки. Использование или неиспользование всех или некоторых из этих возможностей в документах указывается в определениях типов этих документов. Среди этих опциональных, дополнительных возможностей есть такие, которые позволяют значительно упростить вид документа, соответствующего SGML. Так, например, может разрешаться опускать многие очевидные из контекста маркеры или интерпретировать естественные формы выделения участков текста (такие как абзацный отступ) как часть маркировки.

Некоторые развитые системы процедурной разметки текстов, включающие в себя средства для определения новых маркеров, такие как разработанная в конце семидесятых годов известнейшим теоретиком и практиком программирования на ЭВМ Дональдом Кнутом система TEX, могут служить базисом для создания на их основе систем обобщенного маркирования. К серьезному недостатку таких систем, следует отнести то, что они служат как бы надстройкой над набором стандартных процедур обработки текстов (как правило, форматирования), а не наоборот, как это следует из стандарта SGML или подобных, что приводит к необходимости ``подгонять'' схемы маркирования к возможностям, жестко заложенным в готовые системы процедурной разметки. Кроме того, если создать на основе системы, предназначенной для работы с текстами, размеченными процедурной разметкой, систему, работающую с высокоуровневой разметкой, то сразу возникнет проблема ее стандартизации. К достоинству таких систем следует отнести наличие готового ПО для некоторых аспектов использования разметки, так например, система печати документов TEX существует практически для всех существующих компьютеров и операционных систем (в их числе Amiga, Atari ST совместимые, Macintosh, IBM PC совместимые (MS-DOS, OS/2, Microsoft Windows), Unix (VAX, Sun, Apollo, IBM PC 386, Irix и др.), VMS (VAX, IBM 360 и др.), X-Windows, AIX (IBM RS6000), 386/ix, Tandy 6000, DEC-10 (WAITS, TOPS-20)). Стоит также отметить, что на основе таких развитых программных систем, как TEX, можно получить систему, которая могла бы работать с текстами, размеченными, например, по некоторому подмножеству стандарта SGML (реализовать все возможности и расширения SGML средствами TEX скорее всего невозможно). Так как TEX довольно широко используется для подготовки научных публикации, что делает TEX своего рода стандартом, следует кратко рассмотреть его возможности.

Синтаксис языка разметки TEX весьма прост. TEX работает с 8-разрядной таблицей кодировки и делит все ее 256 кодов на 16 групп, т.о., каждый код имеет свой тип. Однако, если рассмотреть эти типы более общим образом, то получится, что можно выделить пять основных типов кодов.

1.Для вызова и определения именованных процедур (маркеров). Этому коду в ASCII соответствует символ обратной косой черты. После него может следовать либо составленное только из букв имя процедуры (имя завершается любым символом небуквой), либо один символ-небуква. В обоих случаях описывается либо определение процедуры, либо ее вызов.

2.Коды-вызовы процедур. Им в ASCII соответствуют следующие шесть символов: $&^_~%. Они служат для краткой записи обращений к используемым часто в некоторых контекстах командам и используются соответственно при вводе: математических текстов, табуляции, верхнего индекса, нижнего индекса, фиксированного пробела, комментариев. Кроме этих шести символов, к кодам-вызовам процедур можно отнести коды 0 и 127 (это управляющие символы в ASCII), первый из которых всегда игнорируется, а второй вызывает процедуру обработки ошибок.

3.Код задания параметра. Ему в ASCII соответствует символ "#". Он используется при вводе параметра, при определении новой процедуры.

4.Коды символов группирования. Им в ASCII соответствуют символы открывающей (начало группы) и закрывающей (конец группы) фигурных скобок. Они объединяют слова для действий над ними как с одним словом или локализуют действие процедуры выделенной ими группой.

5.Собственно символы текстов (разделенные на буквы и небуквы), включая концы строк.

TEX позволяет приписать любой из кодов любому из 16 типов и поэтому приведенное выше соответствие конкретных кодов типам (это соответствие используется во многих реализациях TEX-систем) может быть изменено. Кроме того, TEX по особому интерпретирует некоторые последовательности кодов (например, два кода для введения верхнего индекса, идущие подряд, служат, в частности, для внесения в текст символов с кодами меньшими 32 (управляющих), а не прямо по назначению), эти случаи можно интерпретировать как вызовы процедур с зарезервированными именами.

Таким образом, возможности TEX позволяют, определив новые маркеры (процедуры) и используя возможности TEX для указания либо области действия маркера, либо, наоборот, для ее локализации, создать мощную систему обобщенной разметки текстов.

Однако даже относительно простые системы печати документов, не допускающие расширения набора своих маркеров, могут быть использованы для работы с текстами, размеченными высокоуровневой, обобщенной разметкой, если их использовать совместно с программами для проведения замен в текстах (пакетные редакторы, программируемые конверторы), которые бы транслировали исходную обобщенную разметку в процедурную.

Стоит еще отметить, что системы процедурной, и тем более обобщенной разметки текстов практически не используются большинством коммерческих программ для работы с текстами. Исключение составляет лишь довольно развитый язык процедурной разметки текстов фирмы Microsoft — RTF (Rich Text Format — развитый формат текста), который может быть, в частности, использоваться программами серии Word этой фирмы. Стоит еще добавить, что высокоразвитые коммерческие редакторы текстов (такие как Microsoft Word for Windows) при использовании так называемых стилей, выходят за рамки возможностей процедурной разметки, вводя неявно разметку, близкую по некоторым критериям к обобщенной (сделать ее явной можно с использованием того же RTF).

В последнее время возникло новое направление концепций маркирования — язык HTML (HyperText Markup Language — язык маркирования гипертекстов), который позволяет при помощи маркеров описывать связи между элементами текста. Хотя в этом языке очень большое внимание уделено описанию процедур форматирования текста, это все же язык обобщенного маркирования, в котором, однако, реализована лишь очень небольшая часть концепций, заложенных в SGML (нет возможности описания типа документа и многого другого). Но под HTML можно создать удовлетворяющее его описание типа документа SGML. Язык HTML ныне — это, пожалуй, наиболее используемая ныне в мире система разметки текстов. Это связано с тем, что HTML стал базовым языком глобальной компьютерной сети Internet.

Русификация таблиц кодировок на основе ASCII

Самой первой русифицированной таблицей кодировки, основанной на ASCII, была КОИ-7. Она имела следующую структуру: коды 0-63, 127 совпадали с ASCII, а коды 64-126 представляли русские буквы, при этом русские буквы, где это было возможно, соответствовали своим латинским фонетическим аналогам, но прописные русские буквы располагались на месте строчных латинских или наоборот, т.е. были, например, соответствия д-D, ф-F, И-i, н-N и т.д. В этой таблице не было возможности закодировать буквы Ё, ё и Ъ (прописной твердый знак).

Иногда применялась модификация КОИ-7, позволявшая использовать одновременно только прописные русские и латинские буквы. В этой модификации от стандартного ASCII без изменений оставлялась та часть таблицы, которую в КОИ-7 занимали прописные русские буквы, а в соответствие латинским прописным буквам ставились русские прописные буквы.

Надо отметить, что в КОИ-7, предвосхищая стандарт кодовых страниц, использовалось понятие номера набора. Так таблица КОИ-7 набор 0 полностью совпадала с ASCII, таблица КОИ-7 набор 1 представляла описанный выше русифицированный ASCII, а таблица КОИ-7 набор 2 — это также описанная выше таблица, позволяющая использовать как русские, так и латинские прописные буквы.

Логическим развитием КОИ-7 явилась таблица кодировки КОИ-8, которая полностью совпадала по кодам от 0 до 127 с ASCII, а русские буквы располагались в позициях 192-223 (строчные) и 224-254 (прописные). В КОИ-8 также нет возможности кодирования символов Ё, ё и Ъ. Порядок расположения русских букв остался таким же, как и в КОИ-7. КОИ-7 и КОИ-8 использовались в основном на старых восьмиразрядных компьютерах (типа Robotron-1715, Yamaha, "Корвет" и т.п.), которые ныне выходят из употребления. Один из главных недостатков этих кодировок заключался в том, что порядок русских букв в них был никак не связан с русским алфавитом. Недостатком КОИ-8, делавшим ее неудобной для использования на более современных компьютерах (IBM PC совместимых), являлось также расположение часто используемых прикладными программами символов псевдографики, не совпадавшее с расширенным ASCII. Однако из-за того, что КОИ-8 стала широко использоваться раньше других таблиц кодировки, она успела утвердиться в средах различных вариантов операционной системы UNIX и следовательно ныне широко используется в Internet.

Некоторое время на персональных компьютерах (IBM PC совместимых) использовалась так называемая болгарская кодировка (кодировка MIC, Interprog), также называемая "старый вариант ВЦ АН СССР". В ней без изменения оставлялись коды 0-127 и 192-255 расширенного ASCII, а кодам 128-159 ставились в соответствие прописные русские буквы от А до Я (без Ё) в алфавитном порядке, а кодам 160-191 таким же образом ставились в соответствие строчные русские буквы. Таким образом, у этой кодировки отсутствует способ кодирования букв Ё и ё. Другим недостатком данной кодировки, похожим на имеющийся у КОИ-8, являлось почти полное перекрытие русскими буквами символов псевдографики, что, очевидно, делало невозможным использование этих столь часто употребляемых прикладными программами символов.

В середине 80-х в СССР был принят ГОСТ на таблицы кодировки символов: "основную" и "альтернативную". В позициях 0-127 они полностью совпадают с ASCII. "Основная" таблица кодировки была принята в соответствии с рекомендациями Международной организации по стандартизации ISO. Она имеет следующую структуру. Кодам 128-175 соответствовали символы псевдографики, которые в стандартном расширенном ASCII занимают позиции 176-223, т.е. при принятии этой кодировки, наверное, предполагалось, что все программы, использующие псевдографику, будут адаптироваться для использования с описываемой "основной" кодировкой. Кодам 176-207 ставились в соответствие прописные русские буквы от А до Я (без Ё) в алфавитном порядке, кодам 208-239 таким же образом ставились в соответствие строчные русские буквы, кодам 240 и 241 ставились в соответствие буквы Ё и ё, а кодам 242-254 — значки, не совпадающие (за исключением кода 254) со значками с теми же кодами расширенной таблицы ASCII. Таким образом, "основная" таблица кодировки ГОСТ в главном повторяла недостатки описанной выше болгарской кодировки. "Основная" кодировка была использована на компьютерах серии ЕС-1840/1841, а также на некоторых моделях принтеров (в частности, Epson), но сейчас практически нигде не используется. В практике прижилась как раз "альтернативная" таблица кодировки, которая сохраняет символы псевдографики в предопределенных для них позициях стандартной таблицы расширенного ASCII, что позволяет без проблем использовать множество программ, использующих эти символы. Значения кодов 224-255 "альтернативной" таблицы совпадали с "основной", а значения кодов 128-175 "альтернативной" таблицы совпадали с их значениями в болгарской кодировке. Таким образом, строчные русские буквы оказались поделенными на две части, но порядок их друг относительно друга сохранялся. Недостатком "альтернативной" таблицы ГОСТ явилась практически ничем не оправданная замена кодов 242-253 знаками, отличными от используемых в расширенном ASCII. Поэтому этот вариант кодировки также не получил широкого распространения. Наибольшее же распространение среди компьютеров, работающих в среде MS-DOS, получила так называемая "модифицированная альтернативная" таблица кодировки, совпадающая по позициям 242-253 с кодами стандартной расширенной таблицы ASCII, а по остальным кодам идентичная первоначальной "альтернативной" кодировке ГОСТ.

В графических операционных средах (в частности, в среде Microsoft Windows), где символы псевдографики не используются, получила распространение таблица кодировки, в которой прописные русские буквы в алфавитном порядке без Ё занимают позиции 192-223, а строчные аналогично — позиции 224-255, буква Ё имеет код 168, а ё — 184.

Настройка систем ввода

Приступая к описанию проблем настройки устройств ввода, прежде всего следует отметить, что нынешний уровень аппаратного и связанного с ним программного обеспечения не дает возможности в общем случае обеспечить ввод многоязычных текстов речевым (звуковым) способом. Хотя некоторые из существующих программ оптического распознавания символов и программ распознавания непосредственно вводимых рукописных символов теоретически могли бы работать с очень сложными текстами, но из-за ограничений, связанных с практической реализацией, эти программы сегодня и в ближайшем будущем будут практически непригодны для ввода многоязычных текстов.

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

Для настройки клавиатуры на ввод конкретного текста используют таблицы раскладок клавиатуры, загружаемые специальными программами-драйверами. Каждая такая таблица транслирует некоторую последовательность нажатий клавиш в код символа из таблицы кодировки. Как правило, таблицы раскладки клавиатуры устроены так, что для получения кода любого символа достаточно нажать одну клавиатурную клавишу, что обеспечивает максимально простой и быстрый ввод текстов. А так как существующие стандартные клавиатуры содержат не более 105 клавиш, до половины из которых обычно не перепрограммируют из-за их специальных функций, то, очевидно, что для работы со сложным многоязычным текстом потребуется более чем одна таблица раскладки клавиатуры.

Для переключения между различными раскладками используются как нажатие на клавиатуре назначенных/ой для этой цели клавиш/и, так и другие гораздо менее распространенные и используемые способы (среди них вызов программы-драйвера с параметром-переключателем, действие с альтернативного устройства ввода, например, мышки или графического планшета и др.). Таким образом, получение требуемой конфигурации раскладок клавиатуры включает в себя два основных этапа. Первый этап — это определение того, сколько различных раскладок клавиатуры потребует тот или иной многоязычный текст и способов переключения между ними. Ясно, что для каждой группы языков со сходными алфавитами желательно иметь одну отдельную раскладку. Второй этап — это перепрограммирование значений отдельных клавиш в каждой из раскладок. Для сложных текстов часто бывает полезным обеспечивать трансляцию нажатий нескольких клавиатурных клавиш в корректные символьные коды.

Настройка системы шрифтов

Настройка программ обработки текстов наряду с выбором системы кодировки и настройкой устройств ввода текста обычно включает в себя также подготовку и настройку таблиц шрифтов для этих программ. Сначала рассмотрим, какие бывают типы шрифтов. При всем многообразии форматов и разновидностей шрифтов все их можно свести к двум основным типам: растровым (или дискретным) и непрерывным, семейство последних очень велико и включает в себя, помимо прочих, векторные и сплайновые шрифты. Образы символов шрифтов растрового типа описываются двумерной матрицей, в каждой из позиций которой может быть одно из двух значений: "заполнено" или "пусто". Образы символов непрерывного шрифта описываются при помощи задания опорных точек и типа соединяющей их кривой (в редких случаях, можно также специфицировать способ заливки пространства внутри контуров знаков). Работа с растровыми шрифтами идет быстрее, так как абсолютное большинство устройств ввода-вывода компьютера растровые (растровыми устройствами являются и дисплеи распространенных сегодня компьютеров, принтеры и сканеры, а из непрерывных можно назвать только плоттер). Однако для растровых шрифтов практически невозможно проводить корректные и тем более обратимые операции масштабирования, утолщения/утончения/наклона литер и т.п. Непрерывные шрифты, хотя работа с ними более трудоемка, легко подвергаются разнообразным обратимым модификациям и трансформациям и, в частности, очень важной операции масштабирования или пропорционального изменения размера всех литер шрифта. Существует тенденция, ведущая к почти полному вытеснению использования растровых шрифтов на персональных компьютерах.

Иногда шрифты подразделяют на пропорциональные и непропорциональные (или фиксированные). В непропорциональных шрифтах все символы занимают одинаковое по размеру место при отображении, в пропорциональных же — варьируются по горизонтальному размеру (например, буква "i" пропорционального шрифта займет в строке гораздо меньше горизонтального пространства, чем буква "w"). Это последнее деление, как правило, используется только с растровыми шрифтами, так как непрерывные практически всегда пропорциональны.

Каждый шрифт определяет некоторую таблицу кодировки (таблица шрифта отличается от таблицы кодировки только тем, что в шрифте представлены конкретные, а не родовые образы), а таблица кодировки может соответствовать сразу целому классу шрифтов.

Во многих типах текстов некоторые участки требуется набирать шрифтом, отличным от выбранного ранее или только по некоторым признакам начертания, таким как наклон, насыщенность, размер, положение относительно базовой линии строки и т. п., или вообще совершенно другим шрифтом, соответствующим, в общем случае, другой таблице кодировки. Ясно, что только кодирование с использованием любой одной таблицы кодировки будет недостаточно для получения изображения таких текстов со всеми желаемыми атрибутами символов как на экране компьютерного дисплея, так и на печатающем устройстве. Это связано с тем, что таблицы кодировки в силу их природы отражают лишь родовые свойства букв (так как нельзя закодировать каждою конкретную букву из бесконечного ряда ее возможных модификаций), а в шрифтах представлены конкретные буквы с их индивидуальными особенностями. Ясно также, что любые две, хоть в чем-то различающиеся таблицы шрифта, должны соответствовать двум отдельным таблицам кодировки, если требуется в дальнейшем различать литеры этих шрифтов. Но точка зрения, согласно которой в таблицах кодировки должны находить отражения видовые вариации букв, противоречит родовой природе таблиц кодировки. Для разрешения этого противоречия (с учетом того, что желательно и исторически обоснованно иметь одну таблицу кодировки и множество соответствующих ей таблиц шрифтов), обычно используется следующий метод.

Программы, поддерживающие работу с разнообразными шрифтами, используют/вносят в текст особые маркеры, которые указывают, какую таблицу шрифта или модификацию текущей таблицы шрифта нужно использовать с каждым участком текста. Эта дополнительная информация о шрифте обычно используется только при необходимости визуального отображения текста, а при обработке текста она, как правило, игнорируется, т.е. при обработке текстов, набранных разными шрифтами, используются только собственно коды символов (таблица кодировки) и, возможно, таблицы сортировки, связанные с данными текстами. Внесение в исходный текст специальных маркеров, в частности, для указания способа интерпретации кодов, из которых состоит текст в машинной форме, представляет собой отдельную очень важную для компьютерной лингвистики проблему маркирования текстов, рассмотренную выше.

Таким образом, выбор таблиц шрифтов для программ обработки текстов сводится к выбору тех шрифтов, образы символов которых полностью обеспечивают отображение обрабатываемых текстов. Кроме того, при использовании любого шрифта нужно учитывать, что этот шрифт задает связь с некоторой соответствующей ему таблицей кодировки. Однако эта связь будет чисто визуальной, так как существующее программное обеспечение не в состоянии установить соответствие данного шрифта выбранной ранее таблице кодировки, т.е. провести распознавание символов в таблице шрифта. Следовательно, только замена одного шрифта другим не приводит к изменению правил обработки текста, задаваемых таблицей сортировки.

Недостатки существующих способов представления текстов в машинной форме

Можно выделить два существенных недостатка существующих способов представления текстов в машинной форме.

Первый заключается в том, что в основе всех существующих ныне систем работы с текстами лежит серьезный изъян. Суть изъяна — это отсутствие возможности по тексту в машинной форме определить способ его интерпретации его кодов, т.е. возможности связать последовательность чисел, его составляющих, с одной из стандартных таблиц кодировок. Связывание же текста с конкретным шрифтом, что имеет место при применении многих современных компьютерных программ, приводит к большой неразберихе, так как, во-первых, не существует четких стандартов на связь шрифтов с таблицами кодировки, а, во-вторых, сами шрифты допускают бесконтрольное изменение своего содержания. Использование таблиц шрифтов как эквивалентной альтернативы таблицам кодировки стало бы возможным только в случае соблюдения хотя бы одного из следующих условий:

Выполнение этих условий на сегодняшний день нереально: первого — из-за необходимости как отказа от большого числа существующих программных средств, так и глубокого пересмотра устоявшихся базисных концепций функционирования многих компонентов программного обеспечения; второго — из-за отсутствия достаточно мощных и универсальных средств распознавания символов.

Таким образом, единственный реальный путь для преодоления описываемого недостатка — это внесение в каждый текст в машинной форме информации о том, какую таблицу кодировки использовать для его интерпретации. Для тех же случаев, когда используются нестандартные пути интерпретации (нестандартизированные таблицы кодировки, escape-последовательности) необходимо наличие зарезервированных способов для формального описания таких ситуаций.

Такую информацию можно внести либо используя разметку, например, на базе SGML, либо, определив новый формат для текстовых данных, поддерживающий внесение такой информации. Последний путь находит свое отражение в форматах файлов новейших операционных систем.

Другим недостатком существующих стандартных способов представления текстов в машинной форме является отсутствие стандартных способов для возможности особой интерпретации некоторых символов, например, диакритик.

Настройка системы печати

Настройка программ печати текстов, как и программ обработки текстов, включает в себя выбор системы кодирования и выбор таблиц шрифтов для печати. Кроме того, для данного рода программ может потребоваться еще одна трансляционная таблица, которая будет использоваться в случаях, когда при печати используются таблицы шрифтов самого печатающего устройства, в то время как таблицы кодировок прикладной программы и печатающего устройства не совпадают. Иногда эти трансляционные таблицы могут иметь весьма сложную структуру и поддержка их — дело очень нетривиального программного обеспечения. Хотя, стоит отметить, что сегодня имеется четко выраженная тенденция вытеснения посимвольной печати и переходу к печати исключительно в графических режимах печатных устройств, т.е. тенденция ведущая к отказу от использования встроенных в печатающее устройство шрифтов.

Система переходов от одного языка к другому

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

В общем случае при переходе с одного языка на другой должно выполняться следующее (в конкретных реализациях переходов некоторые действия из приведенного ниже списка могут опускаться):


Обзор типов программных систем, используемых при обработке многоязычных текстов

Среди программных систем для работы с многоязычными текстами наибольшее распространение получили самые простые из них, основанные на одном из множества существующих текстовых редакторов, поддерживающих работу с разнообразными шрифтами. Абсолютное большинство таких редакторов работает в графической, а не в текстовой среде (в качестве примера программ для текстовой среды можно привести интерфейс командной строки MS-DOS, Norton Commander, Lexicon, Microsoft Word для DOS), налагающей множество аппаратных ограничений на возможность отображения символов шрифтов (принципиальная невозможность корректного показа пропорциональных шрифтов, ограничение максимального видимого растра любого символа шрифта размером 9 на 16 точек, невозможность отображать на экране монитора теоретически более 512 (на практике 256) различных символов при варьирующей емкости экрана монитора приблизительно от 1000 до 8000 символов). Программы, работающее в графических средах, можно, в свою очередь, разбить на программы для операционных систем с сильной поддержкой межпрограммного взаимодействия (OS/2, Microsoft Windows, Macintosh OS) и на программы для операционных систем, такого взаимодействия не поддерживающих или поддерживающих очень слабо (MS-DOS, CP/M). В качестве примера первых можно привести следующие программы: Microsoft Word for Windows, Microsoft Write, Symantec Just Write, Microsoft Fox Pro for Windows, Microsoft Access, Borland Paradox for Windows, Microsoft Excel и многие другие. В качестве примера вторых очень характерен редактор ChiWriter. Очевидны преимущества первого типа программ: они, как правило, используют единую систему поддержки разнообразных типов периферийных устройств (сканеры, принтеры, мышки, графические планшеты и т.п.), шрифтов и других подобных данных, имеют практически идентичные интерфейсы пользователя и прочие достоинства.

Недостатки этих простых подходов к работе с многоязычными текстами проявляются прежде всего на этапе обработки текстов, так как для программ типа ChiWriter практически не существует средств для дальнейшей лингвистической обработки набранных с их помощью текстов, а для программ, работающих в средах с хорошей поддержкой межпрограммного взаимодействия, таких средств хотя и много (это стандартные СУБД, электронные таблицы, статистические пакеты и т.п.), но они будут обрабатывать многошрифтовые тексты, основываясь только на таблицах сортировки, а не на собственно шрифтовой информации. Таким образом, в последнем случае неизбежно получается, что для текстов, набранных двумя возможно принципиально различающимися шрифтами, будут применяться одинаковые правила обработки.

Другим принципиальным недостатком программных систем, основанных на текстовом редакторе, поддерживающим разнообразные шрифты, является сам принцип замен текущего шрифта. Этот принцип очень хорош в случаях, когда требуется изменить начертание, насыщенность или размер текущего шрифта или перейти на отличающийся от текущего шрифт. Но в филологии часто встречаются случаи (источники, транскрипция и др.), когда требуется совместное использование множества диакритических знаков и практически невозможен предварительный расчет о том, какие именно символы с диакритиками потребуются для того или иного случая (и тем более привести эти символы в систему, удобную для набора, обработки и печати), а использование системы шрифтов, учитывающих все возможные сочетания диакритик, приводит к необходимости иметь необозримо огромное количество шрифтов.

Среди более сложных систем работы с многоязычными текстами выделяются системы, основанные либо на системе набора текстов TEX, либо на системе программ Летнего института лингвистики. Как TEX, так и программы Летнего института лингвистики используют в качестве базовой таблицу кодировки расширенного ASCII, или кодовою страницу, или даже стандартную таблицу ASCII, применяя для ввода знаков, отсутствующих в выбранной таблице кодировки, escape-последовательности. Использование такого кодирования позволяет достаточно корректно обрабатывать тексты практически любой прикладной программой, вне зависимости от типа используемого ею режима отображения (текст, графика) или операционной системы, для которой она предназначена. В системе TEX, в отличие от программ Летнего института лингвистики, при работе, вовлекающей в совместное использование множество диакритических значков, пользователю все же нужно произвести учет всех получаемых новых знаков и построение из них рабочей системы, но, в отличие от редакторов, поддерживающих переключение шрифтов, TEX не требует, чтобы эта работа была проделана до ввода текста — она может быть сделана как одновременно с вводом текста, так и после полного окончания его ввода.

Набор программ Летнего института лингвистики представляет собой, в отличие от рассмотренных выше программ, не просто основу для работы с многоязычными текстами, но полностью завершенную систему ввода, обработки, и вывода текстов.

Поддержка программами Летнего института лингвистики работы с многоязычными текстами

Как уже отмечалось выше, программы Летнего института лингвистики используют в качестве базовой кодировку ASCII. Для кодирования символов, отсутствующих в ASCII, применяется оригинальный и очень мощный способ кодировки, использующий последовательности кодов ASCII. Суть способа состоит в том, что коды для диакритических знаков интерпретируются особым образом. Последовательность кодов для диакритических знаков и код собственно символа интерпретируются программами Летнего института лингвистики как единый код этого символа с наложенными на него диакритиками. Стоит отметить, что среди распространенных программ для IBM PC совместимых компьютеров, нет таких, которые бы поддерживали только что описанный или аналогичный ему по результатам способ работы со знаками диакритик, а компьютеры фирмы Apple серии Macintosh, поддерживающие такую возможность на уровне операционной системы, достаточно редки в нашей и в большинстве других стран (эти компьютеры получили достаточно широкое распространение лишь в США и в некоторых богатых арабских странах) и имеют ряд недостатков, затрудняющих использование этих их полезных для лингвистике свойств.

Клавиатурный ввод текстов в компьютер поддерживается при помощи программы-драйвера (KEYSWAP), специально приспособленного для работы со сложными текстами. Этот драйвер поддерживает до девяти различных раскладок (плюс стандартная) клавиатуры, в каждой из которых поддерживается трансляция последовательности нажатий до двух клавиш в последовательность до 255 8-разрядных кодов. К драйверу прилагается программа-редактор раскладок клавиатуры (KEYDEF).

Программы обработки текстов включают в себя: пакетный текстовый редактор, полноэкранный текстовый редактор и программы для построения и дальнейшей обработки различного рода словарей.

На этом этапе работы естественно использование размаркированных текстов. Рассмотрим вкратце систему маркирования, используемую в Летнем институте лингвистики.

Текст размечается маркерами стандартного формата (используется терминология принятая в Летнем институте лингвистики). Маркеры стандартного формата — это особые символы, которые следует набирать, когда текст вводится в компьютер. Эти символы не являются управляющими, а представляют собой фиксированные комбинации обычных печатаемых символов, что позволяет легко вводить их средствами любой системы редактирования текстов. Эти маркеры идентифицируют различаемые элементы текста и таким образом выделяют в нем те или иные структуры.

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

Первое соображение, оправдывающее использование маркеров стандартного формата, — это то, что их введение в текст делает его понятным для разных программ обработки текстов. Летний институт лингвистики является обладателем множества программ, которые могут помочь при создании словарей и словников, при анализе текстовых файлов. Большинство этих программ работает только с текстами, размеченными маркерами стандартного формата.

Другое соображение, оправдывающее использование маркеров стандартного формата, — то, что когда наступит время печатать или публиковать текст, он может быть отформатирован и напечатан правильно. Обычно текст форматируется символами управления печатающим устройством. Но разные устройства печати обладают разными языками управления. Использование маркеров стандартного формата и программы-конвертера этих маркеров в командные коды конкретного устройства печати позволяет избавить пользователя от знакомства с языками управления различными принтерами и в то же время досконально контролировать процесс форматирования. В большинстве коммерческих редакторов текстов команды форматирования скрыты от пользователя (виден лишь результат их применения), что не дает возможности полного контроля за форматированием.

Существует два основных типа маркеров стандартного формата программ Летнего института лингвистики:

Маркер элемента формата текста состоит из обратной косой черты (backslash), за которой следуют идентифицирующие маркер символы (обычно один или два алфавитных символа, хотя большинство программ Летнего института лингвистики создано для работы с маркерами, содержащими до 4 символов). Маркер идентифицирует сегмент текста, следующий за ним до другого маркера элемента формата текста. Эти маркеры позволяют, например, выделять такие элементы текста, как строфы, абзацы, заголовки и т.п. Таким образом, маркеры элементов формата текста структурируют текст.

Маркер элемента формата текста определяют природу или функцию маркированных элементов текста. Вот пример использования маркеров элементов формата текста в источнике:

\s Jesus Calls Four Fisherman

\r (Matt 4:12-22, Lk 4:14-15, 5:1-11)

\p

\v 14 After John had been put in prison, Jesus went to Galilee and preached

the Good News from God.

\v 15 <<The right time has come,>> he said <<and the kingdom of God is near!

Turn away from your sins and believe the Good News!>>

\p

\v 16 As Jesus walked...

— где \s отмечает заголовок, \r — ссылки, а \p употребляется для маркирования текстовых элементов (абзацев), которые состоят из нескольких меньших текстовых элементов (строф), выделяемых нумерованным маркером \v.

А вот пример использования маркеров элементов формата текста в словарях иностранных языков:

\lx солнце

\ps noun

\df sun

\ex Яркое солнце.

\tr The sun is bright/powerful.

— где \lx используется для отметки входного слова (заголовка), \ps — части речи, \df — перевода, \ex — примера использования, \tr — перевода примера.

Если текст представляет собой список записей (таких как словари, списки адресов и т.п.), то очень важно для дальнейшей обработки, чтобы каждая запись сохраняла некоторую общую для всех записей структуру.

Маркеры подтекста употребляются для выделения произвольных, не образующих структуры участков текста. Текст, выделяемый такими маркерами, не может перекрывать границ сегментов текста, обозначенных маркерами элементов формата текста. Маркеры подтекста состоят из двух частей, между которыми располагается выделяемый сегмент текста. Первая часть начинается с символа вертикальной черты, за которой следуют один или два символа, идентифицирующие маркер. Завершает первую часть маркера символ открывающей фигурной скобки. Вторая часть маркера подтекста — это последовательность двух символов: вертикальной черты и закрывающей фигурной скобки.

Маркеры подтекстов употребляются для отметки слов, требующих того или иного выделения. Вот пример использования маркеров подтекстов:

\p During that year we read many books together. We learned of brother Andrew's exploits in the book |bt{God's Smugler|}, a story we found to be |ew{really|} exciting. We also read of the adventures of Hans Kristian in |bt{Secret Invasion|} and Bruce Olsen in |bt{Bruchko|}. It was a |ew{fantastic|} year which we all enjoyed.

В этом примере названия книг заключены между |bt{ и |}, а слова, на которые падает ударение, заключены между |ex{ и |}. Маркер подтекста состоит из двух частей. Первая часть начинается с символа "вертикальная черта", за которой следуют один или два символа, идентифицирующие маркер. Завершает первую часть маркера символ открывающей фигурной скобки. Вторая часть маркера подтекстов — это последовательность двух символов: вертикальной черты и закрывающей фигурной скобки.

Важно помнить, что маркер должен идентифицировать функцию или вид элемента, а не тип форматирования.

Хотя система разметки текстов Летнего института лингвистики в сравнении с системой SGML выглядит весьма тривиально, она имеет одно важное достоинство, а именно, наличие готовых схем маркирования для практически всех используемых в филологии типов документов (источники, словари и т.п.).

Пакетный текстовый редактор (CC — Consistent Changes) представляет собой язык программирования, максимально приспособленный для проведения изменений в текстах. При помощи этого программного средства можно, например, инвертировать словари, конвертировать разметки (например, заменить маркеры TEX на маркеры формата RTF или наоборот), отслеживать изменения в системе кодирования, внести в слова текста информацию о местах разрешенного переноса и многое другое. От языков макрокоманд коммерческих редакторов текстов, а также от аналогичных по назначению программ (например, программы AWK, широко распространенной в операционной системе Unix), описываемый пакетный редактор отличается как предельной простотой синтаксиса, так и наличием некоторых уникальных возможностей.

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

Учитывая огромную важность подобных программ для первичной обработки текстов, а также уникальность некоторых особенностей функционирования именно данного пакетного редактора, далее, в приложении, приводится его подробное описание.

Полноэкранный текстовый редактор (ED) позволяет проводить редактирование в режиме "что на бумаге, то и на экране": код, составленный из кодов диакритик и кода символа, будет отображаться на экране как корректный символ с наложенными на него диакритиками. При этом пользователю необходимо иметь только шрифт (сам шрифт при этом может иметь до нескольких тысяч матриц базовых символов), содержащий образы лишь для отдельных диакритик и символов, а не их комбинаций!

Эта программа, кроме того, имеет еще несколько интересных возможностей для работы с текстами. Важнейшие из них:

С другой стороны, этот редактор поддерживает только элементарнейшие базовые операции по редактированию текстов. В нем сравнительно слабы средства для форматирования текста (в концепции программ Летнего института лингвистики, как и в популярной для научных публикаций системе TEX, форматирование производится специальной программой непосредственно при выводе на печать). В нем отсутствуют многие обычно ассоциируемые с текстовыми редакторами простые операции, например, ``поиск с заменой'' (однако, поскольку данный редактор поддерживает макросы, можно, используя встроенную операцию ``поиск'', написать соответствующий макрос, который будет практически неотличим от встроенной команды). Некоторые операции, например, блочные, хотя и реализованы, но в очень базисном, неразвитом виде.

Стоит отметить, что хотя редактор ED является полноэкранным, он не реализует полностью принципа WYSIWYG (означающего: ``что вижу на экране дисплея, то и увижу при распечатке на бумаге''; это слово — аббревиатура от ``What You See Is What You Get''), так как он может использовать только непропорциональные (фиксированные) шрифты с шириной символов равной восьми, а также из-за упомянутых выше неразвитых возможностей форматирования.

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

Печать текстов обеспечивают ряд программ, среди которых программы настройки на конкретное устройство печати, генерации и модификации шрифтов и трансляционных таблиц для печати, преобразования команд управления печатью, которые могут вноситься в текст, в задаваемые ими действия по управления печатью. Вывод на печать может осуществляться с использованием как фиксированных, так и пропорциональных растровых шрифтов.

Особенностью основной программы печати документов (Manuscripter) Летнего института лингвистики является возможность использования трансляционных таблиц в процессе печати, что, в частности, позволяет скрытно переводить исходную высокоуровневую разметку документов в процедурную, используемую собственно программой печати.

Минимальные требования к аппаратуре при работе с многоязычными текстами

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

Рассмотрим каждую такую аппаратную компоненту компьютера в свете ее пригодности для работы с многоязычными текстами (будут рассмотрены в основном только компоненты наиболее распространенных в нашей и в большинстве других стран мира IBM PC совместимых компьютеров).

Как уже отмечалось выше, наиболее универсальным средством для ввода многоязычных текстов на сегодня остается клавиатура. Средства оптического ввода текстов также могут быть очень полезны при необходимости ввода в компьютер больших объемов текстов на распространенных языках на основе латинского и иногда кириллического алфавитов, напечатанных на бумаге.

Среди устройств вывода можно выделить два основных широко используемых вида: дисплеи и принтеры. Оптимальным дисплеем сегодня можно считать дисплей VGA, несколько худшими — EGA и Hercules, дисплеи CGA иногда очень сложно, а иногда и просто невозможно использовать с большинством современных прикладных программ.

Минимальное требование к принтеру для работы с ним с многоязычными текстами — возможность работы в графическом режиме. Этому базовому требованию удовлетворяют все модели матричных, струйных и лазерных принтеров, и только ромашковые принтеры физически непригодны для такой печати. Другим свойством принтеров, иногда значительно ускоряющим процесс печати, является возможность перезагрузки всех или части базовых шрифтов. Наконец, стоит отметить, что наиболее качественно и быстро печатают лазерные принтеры.

Устройство обработки информации (центральный блок компьютера) должно выбираться в соответствии с предполагаемым типом работы с текстами. Для простого ввода и ручного редактирования текста в текстовой среде вполне пригодным является центральный блок типа IBM PC XT с 512-640 килобайтами памяти, но графической среде уже требуется, как правило, центральный блок типа IBM PC AT минимум с двумя мегабайтами оперативной памяти. Для задач сложной обработки больших объемов текстов лучшим является самый быстрый из возможных центральных блоков, т.е. блок на основе микропроцессоров 80386, 80486, Pentium (микропроцессоры приведены в порядке "от худшего к лучшему") с памятью не менее четырех мегабайт.

Сравнительный анализ программ филологической работы с текстами

В этой главе будет проведено сравнение следующих программ: Фиеста (FIESTA — Fast Interactive Editor of Scripture and Text Analysis) версия 4.5n (Летнего института лингвистики), WordCruncher версия 4.10 (фирмы ETC — Electronic Text Corporation) и Унилекс-Т версия 1993 года (автор Ж.Г.Аношкина, отдел Машинного фонда русского языка Института русского языка им. Виноградова В.В.). Анализ возможностей этих программ, по мнению автора, позволит выявить фундаментальный набор составляющих любой серьезной программы первичной обработки (т.е. не использующей семантического разбора) символьной информации.

Сразу стоит отметить, что несмотря на то, что эти программы (Фиеста, WordCruncher и Унилекс-Т) предназначены для решения очень схожих задач, они все же очень далеки от идентичности наборов их функций и даже методик работы с ними. Но все они имеют целый ряд общих черт. В частности, общая черта всех этих программ — это сам процесс работы с текстами, который всегда состоит из двух этапов.

На первом из них из исходных текстов строится текстовая БД, а на втором происходит собственно филологическая обработка. Иногда первый этап такой работы скрыт от пользователя, а иногда нужно несколько раз повторять первый этап для подготовки новых видов филологической обработки. Хотя для пользователя-филолога первый этап компьютерной обработки абсолютно неинтересен (сам этот этап представляет собой аналог рутинной операции перевода текстов в машинную форму), от качества его выполнения зависит вся дальнейшая работа с программами филологической обработки текстов.

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

Структура текстовых БД. Структура текстовых БД у Фиесты следующая. Каждая БД состоит из набора книг (разделы с одинаковым именем), поделенных на разделы, которые, в свою очередь, состоят из записей, которые могут быть поделены на поля (допускается неидентичность набора полей для различных записей). Для идентификации книг можно использовать имена, состоящие из не более чем шести (семи, если число разделов в книге не более 9) символов, разрешенных для использования в именах файлов MS-DOS. Разделы нумеруются от 1 до 99. Записи также нумеруются с единицы. Доступ к полям записей осуществляется по их именам. Имена полей — это обычно маркеры стандартного формата Летнего института лингвистики. Поля могут содержать как отдельные слова, так и последовательности слов.

БД программы WordCruncer четко разделена на три уровня. Единицы первого именуются любыми строками длиной до 20 символов, единицы второго также именуются любыми строками, но длиной уже до 8 символов, единицы третьего нумеруются от 0 до 65535. Единицы третьего уровня — это слова или последовательности слов.

Вся БД программы Унилекс-Т состоит из именованных модулей (имя модуля может содержать до 30 символов). Каждый модуль может содержать отмеченные позиции двух типов: делящие текст на порции и выделяющие в тексте участки. Всего допускается наличие до 20 типов отмечающих позиций. Оба типа позиций именуются некоторой последовательностью символов, но тип позиции второго типа распадается на два подтипа, отмечающих начало и конец выделения, и каждый из них должен иметь различное имя. Таким образом, теоретически каждый модуль БД Унилекс-Т может иметь очень глубоко вложенную структуру (до 20 уровней) или очень сложную структуру, состоящую из взаимнопересекающихся и вложенных участков текста. Однако из-за того, что все отмеченные позиции равноприоритетны, пропуск всего лишь одной такой позиции (или неправильный ее тип) сможет разрушить целостность всей структуры. Последнее усугубится тем, что обнаружить такую ошибку будет очень сложно.

Итак, можно заключить, что БД программы WordCruncher имеют наиболее четкую и определенную структуру, с достаточно широкими возможностями для представления лингвистической информации. Структура БД Фиесты не столь стройна как у предыдущей программы, но предоставляет уникальные возможности для работы с текстами, в которых встречаются регулярные структуры (словари, параллельные тексты и т.п.). Структура БД Унилекс-Т теоретически предоставляет широчайшие возможности для представления филологических данных. В ней можно представить структуры как программы WordCruncher, так и Фиесты (единственное ограничение — это то, что число полей в записях Унилекс-Т не может быть большим 19 или, если для каждой записи выделять отдельный модуль, 20). Но практически использовать все возможности, предоставляемые этой структурой, невозможно из-за сложностей в поддержании ее целостности. В частности, стоит отметить, что перенос БД программ WordCruncher и Фиесты в формат Унилекс-Т сделает их в намного большей степени восприимчивым к случайным ошибкам.

Формат входных текстов. Фиеста может строить БД как по неразмеченным, так и по размеченным текстам. В первом случае за единицы строимой БД будут либо приниматься последовательности слов, заключенных между знаками пунктуации (точка, вопросительный и восклицательный знаки), либо строки входного текста. Размеченные же тексты содержат в себе структуру строимой по ним БД, поэтому их формат был неявно выявлен в предыдущем пункте анализа.

Программа WordCruncher не может работать с абсолютно неподготовленными текстами. Ей требуется текст, размеченный хотя бы на самые крупные уровни членения: простейший случай такой разметки — это вставка одной строки с именем уровня в начало текста. Остальные уровни членения текста могут быть выявлены программой самостоятельно. Разделителями единиц второго уровня могут выступать: пустая строка, конец строки и символ конца страницы (ASCII код 12). Разделителями единиц третьего (низшего) уровня могут выступать те же разделители, что перечислены для единиц второго уровня, плюс знаки пунктуации (точка, вопросительный и восклицательный знаки) вместе со следующими за ними двумя пробелами. При необходимости можно установить тождественное соответствие между некоторыми уровнями членения, т.е. просто отказаться от одного из уровней.

Унилекс-Т также не может работать с абсолютно неразмеченными текстами. Тексты требуется, как минимум, разбить на модули, а также ввести некоторую дополнительную информацию (имя группы модулей, имя администратора БД, определения маркеров и, возможно, некоторые другие данные). Эта программа умеет самостоятельно разбивать тексты модулей на порции двух типов: разделенные пустыми строками и разделенные концом строк.

Из написанного выше можно выявить одну очень полезную особенность маркировки Унилекс-Т: в ней тексты, предназначенные для обработки, содержат в себе большую часть информации о том, как их интерпретировать при обработке. Фиеста и WordCruncher ни имеют ничего подобного и им приходиться поэтому для каждого нового вводимого текста проводить сеанс конфигурации параметров. Единственный недостаток внесения такой дополнительной информации в текст заключается в том, что при использовании текстов с минимумом разметки, внесение такой информации будет малоинформативно и несколько трудоемко. Стоит здесь также отметить заслуживающий внимания способ членения текстов на предложения, используемый программой WordCruncher.

Устройство словарей БД. Словари БД Фиесты и программы WordCruncher очень просты по структуре: они состоят из отсортированного списка слов текста с приписыванием каждому слову его частоты во всей БД и ссылок на его положение в тексте (последнее позволяет быстро по любому выбранному из списка слову получать все его контексты, т.е. конкорданс). Особенностью Фиесты является ее способ работы с прописными буквами: она не считает эквивалентными слова, если в любой позиции слов, кроме первой, они различаются признаком заглавности-строчности буквы — это позволяет корректно работать с аббревиатурами (например, название фирмы ETC и широко используемое в английском языке сокращение etc в Фиесте будут представлены отдельными словами) и в то же время рассматривать как одинаковые такие слова как that и That.

Унилекс-Т, кроме информации, подобной той, которая имеется в словарях Фиесты и WordCruncher, имеет еще возможность добавлять сведения (хоть и не всегда однозначные) о части речи и виде леммы (словарной словоформы) каждого слова словаря.

Кроме списка слов, встречающихся в тексте. Программы Фиеста и WordCruncher имеют возможность работать со специальными, отдельными списками слов. Фиеста — со списками ключевых слов и собственных имен, а WordCruncher со словарем и "тезаурусом". Списки ключевых слов и имен собственных абсолютно идентичны по организации и назначению и разделены исключительно для удобства пользователя. Слова из этих списков позволяют получать доступ к местам текста, к которым они относятся (при этом эти слова и участки текста, на которые они указывают, могут быть на разных языках). Словарь программы WordCruncher состоит из слов и комментариев к ним. Этот словарь создается абсолютно независимо от БД, и так как его содержимое нельзя редактировать (это же относится и к "тезаурусу", и к дополнительным спискам слов Фиесты) при работе с текстами БД, то его можно рассматривать как своеобразную филологически специализированную подсказку. "Тезаурус" программы WordCruncher состоит из списка слов, с каждым из которых связан список ассоциируемых с ним слов, он, так же как и словарь, не зависит от содержания БД, но его можно использовать, как и основной список слов БД, т.е. для быстрого доступа к контексту БД для выбранного из него слова (если, конечно, это слово там есть). Создание и редактирование таких дополнительных списков как для Фиесты, так и для WordCruncher очень трудоемко.

Программы WordCruncher и Унилекс-Т могут еще при построении БД использовать (хотя и по-разному) так называемый стоп-словарь. Для слов из стоп-словаря WordCruncher не включает список ссылок на их положение в исходном тексте, Унилекс-Т исключает такие слова полностью (даже из списка слов текста). Очевидно, что использование стоп-словарей снижает информационную ценность полученных с их использованием текстовых БД: стоп-словари повышают эффективность работы программ ценой отказа от обработки некоторой информации.

Итак, можно заключить, что структура списка слов текста для всех рассматриваемых программ практически идентична. Но благодаря встроенному в Унилекс-Т лемматизатору, эта программа может вводить в свой список слов много дополнительной и полезной филологу информации. Программы же Фиеста и WordCruncher имеют возможности для работы с дополнительными списками слов (независимыми от основного списка слов БД).

Конкордансы. Не будет преувеличением сказать, что основное назначение программ первичной филологической обработки текстов — это получение различного рода конкордансов. Конкордансы характеризуются двумя основными признаками: структурой контекста и способами задания критериев поиска контекстов.

Фиеста может в качестве контекстов, составляющих конкорданс, использовать: записи; строки, части записей; поля записей; группу записей (группа записей может состоять из заданной записи и до восьми следующих за ней). Как об этом уже писалось выше, записью в Фиесте может быть строфа, предложение, абзац, словарная статья и т.п. Поиск может происходить как по всему содержимому записей, так и только по содержимому некоторых полей (или даже их частей) записей. Критерий поиска можно задавать шаблонами слов или фраз. При задании шаблонов можно использовать специальные символы, обозначающие либо один любой символ, либо любую последовательность символов. Кроме того, можно (это уникальная возможность Фиесты) использовать символы (метасимволы), обозначающие любой из назначенных им символов, что позволяет, например, иметь символы-шаблоны для гласных, согласных, назальных и т.п. При задании шаблонов слов можно группировать последовательность шаблонов для задания одного слова, используя логические операции "И" и "НЕ" (например, можно специфицировать шаблон слова, начинающегося с "при", оканчивающегося на "ал", но не содержащего "еж"). Операция "ИЛИ" естественным образом реализуется при задании шаблонов друг за другом, с получением конкорданса по каждому из них. Можно вводить верхнюю и нижнюю границу частоты для слов, контексты которых будут приводиться в конкордансе. При использовании шаблонов фраз, можно искать подтексты в которые входит:

В шаблонах фраз можно использовать операцию ``НЕ'', т.е. специфицировать в позиции слова фразы шаблон слов, которых здесь не должны быть. Кроме того, можно искать все подтексты, в которые слова, удовлетворяющие заданным шаблонам, разделены не более чем заданным количеством слов и/или не разделены заданным словом-разделителем.

Фиеста может создавать конкордансы как по большому списку заранее заготовленных шаблонов, так и в интерактивном режиме.

Наряду с конкордансами Фиеста может получать словоуказатель.

Программа WordCruncher имеет два способа получения конкордансов, которые сильно различаются по возможностям: интерактивный и пакетный.

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

Контексты при интерактивном способе могут быть единицами второго и третьего (низших) уровней членения текста или копиями экранов дисплея.

Критерии поиска можно задавать шаблонами одного или более слов. Шаблоны образуют множества (набор) слов, среди которых можно указывать группы слов либо начинающихся с заданной символьной последовательности, либо оканчивающихся на заданную последовательность символов. Шаблоны можно объединять в последовательности и связывать логическими отношениями. Можно работать с двумя группами шаблонов. Возможны следующие операции над шаблонами одной группы:

Пусть X — это результирующий шаблон первой группы, а Y — второй. Тогда возможен поиск подтекстов, в которых:

Поиск слов, удовлетворяющих X и/или Y, происходит в ограниченных, задаваемых подтекстах: единицах второго или третьего уровня членения текста; участках текста, заданной в символах длины.

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

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

Унилекс-Т, как и WordCruncher, имеет те же два способа получения конкорданса.

Интерактивный способ работает со списками: слов, отсортированных в прямом и обратном порядке, лемм, частей речи, частот и рангов. И по каждому из элементов любого из списков можно получать его (или, если этот элемент — неслово, то связанных с ним слов) конкорданс из строк исходного текста, а не элементов, разделенных или выделенных маркерами. Таким образом, работа в диалоговом режиме полностью игнорирует разметку.

При пакетном способе получения конкорданса нужно подготовить файл со списком критериев поиска подтекстов. Критерий поиска можно задавать шаблонами слов или набора двух слов. Подтекст (он же выводится в конкордансе) поиска задается либо длиной в символах, либо в маркерах-ограничителях и глубиной их вложенности. Можно также искать только в выделенных маркерами подтекстах или в указанных модулях. Кроме того, критерием поиска могут выступать как совместно с шаблонами слов, так и самостоятельно шаблоны лемм и/или части речи. При задании шаблонов можно использовать специальные символы, обозначающие либо один любой символ, либо любую последовательность символов. Шаблон набора двух слов состоит из двух частей. Первая — это обычный шаблон (к слову, удовлетворяющему ему, относятся также шаблоны лемм и/или части речи), а вторая — набор шаблонов (слово должно удовлетворять хотя бы одному из них). Слова, удовлетворяющие обоим шаблонам, должны встретиться на подтексте поиска. В пакетном режиме можно получать и словоуказатель.

Итак, можно резюмировать, что все из рассмотренных программ имеют целый ряд уникальных и трудносопоставимых возможностей при получении конкордансов. Особого внимания заслуживают: возможность использования программой Унилекс-Т, расширенного леммами и частями речи списка слов текста, что позволяет получать гораздо более широкие по сравнению с другими рассматриваемыми программами классы конкордансев; использование Фиестой в шаблонах, определяемых пользователем, метасимволов.

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

Программа WordCruncher не имеет средств для пересортировки каких-либо используемых данных. Более того, словарь, независимый от основной БД, и "тезаурус" при их подготовке нужно сортировать "вручную" (или отдельными программами, не входящими в дистрибутивную версию WordCruncher)!

Унилекс-Т может пользоваться только единственной таблицей сортировки. Но он может пересортировывать словарь слов БД, сортируя слова с конца, по частоте и группируя слова по частям речи.

Можно заключить, что Фиеста и Унилекс-Т имеют мощные, хотя и служащие для совершенно различных целей возможности для сортировки.

Поддержка многоязычия. Фиеста имеет богатейшие средства для поддержки многоязычия. Они заключаются в следующем наборе возможностей:

Программа WordCruncher также может устанавливать любой желаемый порядок между символами (т.е. задавать алфавит), но только для одиночных символов (для некоторых широко распространенных языков к этой программе прилагаются специальные таблицы сортировки, которые способны работать с одним-двумя символами длиной два символа ASCII, но создавать такие таблицы для произвольных составных символов эта программа не может). Эта программа может обрабатывать тексты, введенные справо-налево (например, арабские).

Унилекс-Т узко ориентирована на работу с одноязычными текстами (многие функции этой программной системы применимы только к текстам на русском языке) и не имеет заслуживающих упоминания средств поддержки работы с многоязычными текстами.

Работа с параллельными текстами. Фиеста имеет несколько функций, специально предназначенных для работы с параллельными текстами. Она может одновременно и синхронно выводить на экран подтексты-записи до четырех текстов (подтексты могут извлекаться из любого места этих текстов). Кроме того, она может использовать списки параллельных мест различных и лишь частично параллельных текстов и обеспечить показ сколь угодно больших контекстов таких мест в синхронном режиме. Фиеста может также работать с записями, поля которых пословно синхронизованы и части слов в словах которых также синхронизованы. Например, пусть в одном поле есть предложение на одном языке, в другом поле каждому слову этого предложения сопоставлено его разложение на морфемы, в третьем поле каждой морфеме сопоставлена ее глосса на другом языке и т.д. Использование синхронизации — это опция при работе со строго параллельными текстами, представленными полями в записях. Фиеста может проводить поиск в таких параллельных текстах по весьма сложным критериям, с использованием шаблонов. Можно задавать шаблоны поиска для каждого или некоторых из параллельных полей записей и получать в результате только те записи, которые содержат в соответствующих полях соответствующие слова или фразы. При таких поисках в синхронизированных полях можно указывать дополнительные критерии, такие как, расстояния между словами.

Программа WordCruncher не имеет средств поддержки работы с параллельными текстами.

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

Возможности редактирования данных. Фиеста позволяет редактировать свои текстовые БД и предоставляет для этого достаточно мощные средства (режимы вставки и замены, работа с блоками и др.). Кроме того, эта программа имеет очень развитые возможности для проведения замен слов и фраз в тексте с использованием шаблонов. Фиеста имеет еще одну очень интересную возможность редактирования, позволяющую проверить правильность написания каждого слова текста. Эта возможность проявляется выводом одного из контекстов каждого из еще непроверенных слов текста и требованием подтвердить правильность или неправильность этого слова. Однажды проверенное слово больше никогда не будет выводиться в последующих подобных проверках.

WordCruncher практически лишен средств редактирования своих текстовых БД. Все его средства редактирования сводятся лишь к возможности заменять одни символы текста на другие, у этой программы нет возможностей как добавлять что-нибудь к тексту, так и удалять что-либо из него.

Унилекс-Т не имеет средств редактирования своих текстовых БД. Хотя почти все файлы этой БД текстовые, но они связаны между собой своим содержанием. А последнее означает, что если воспользоваться текстовым редактором для изменения некоторых из них, то это может привести к нарушению целостности всей БД (но для опытных пользователей возможность такого редактирования может часто оказаться очень полезной).

Печать текстов. Фиеста имеет довольно развитые для программ такого класса возможности для форматного вывода содержимого текстов, составляющих ее БД. Так, можно специфицировать длину страницы и отступы от всех ее границ. Можно также транслировать маркировку текстов в операции форматирования: центровку, пропуск указанного количества строк, начало новой страницы, внесение абзацных и "висящих" отступов и др. Выделенные места текстов можно при выводе на принтер печатать жирным шрифтом, подчеркнуто или курсивом. Кроме того, Фиеста может выводить и неформатированный текст, в частности, восстанавливать исходный текст по содержимому БД. Фиеста имеет возможность практически любой свой вывод текстовых данных направить на экран, принтер или в файл.

Программа WordCruncher обеспечивает лишь вывод неформатированного текста, но позволяет иногда слова, которые могут в дальнейшем потребовать выделения, снабжать специальными маркерами. Эта программа, как и Фиеста, имеет возможность практически любой свой вывод текстовых данных направить на экран, принтер или в файл.

Унилекс-Т также лишен форматирующих возможностей. Есть лишь операция, которая может удалять специфицированные маркеры и связанные с ними текстовые участки из выходного текста.

Статистические функции. Фиеста может выводить списки частот всех слов или символьных строк по всему тексту или по его заданной адресами записей части, распределение частот по книгам, а также количество записей, содержащих заданные слова или символьные строки.

WordCruncher может выводить частоты всех слов (и некоторых видов их сочетаний) текста, распределенные по всем единицам первого и второго уровня членения текста, а также объединениям единиц первого уровня. Вместо частот могут выводиться проценты. Кроме реальных процентов можно выводить ожидаемые проценты, исходя из равномерного распределения слов, и разницы между реальными и ожидаемыми процентами. К сожалению, статистические функции этой программы не могут работать в пакетном режиме, что делает анализ результатов их использования очень трудоемким.

Унилекс-Т позволяет получать частоту, процент, процент в выборке и ранг любых, указанных в запросе слов, лемм и частей речи.

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

WordCruncher имеет очень неразвитую систему подсказки, включающую лишь справки по назначению функциональных и некоторых других клавиш.

В Унилекс-Т подсказка состоит из возможности вывода на экран длинного текста документации к этой программе и, кроме того, из строк-подсказок, появляющихся автоматически на экране при выборе любого из пунктов меню и разъясняющих назначение этого пункта.

Дополнительные возможности. Фиеста может переставлять поля в записях своих БД, что позволяет, в частности, инвертировать словари.

WordCruncher не имеет каких-либо уникальных, заслуживающих упоминания дополнительных, не описанных выше возможностей.

Уникальнейшие возможности, неоднократно упомянутые выше, дает программе Унилекс-Т встроенный в нее лемматизатор русских слов, заслуживающий повторного о себе напоминания из-за своей огромной полезности для филолога-русиста. В частности, он позволяет получать все возможные словоформы специфицированных русских слов.

Недостатки и недоработки. Многие недостатки Фиеста связаны с тем, что основное назначение этой программы — это работа с текстами Нового Завета. Среди этих недостатков можно выделить частые ссылки на тексты Нового Завета как на базовую БД и наличие функций, подготовленных к использованию в основном только с этими текстами.

Один из недостатков программы WordCruncher — это отсутствие возможности развитой работы в пакетном режиме. Кроме того, стоит отметить очень неразвитые средства для задания обычных шаблонов (т.е., используя символы-шаблоны одного или последовательности символов) и громоздкость логики для задания шаблонов на основе операций с множествами.

Из недостатков Унилекс-Т можно выделить несопоставимо огромный совокупный объем всех файлов БД и недоработанность системы маркировки.

На все рассмотренные программы накладываются серьезные ограничения на объем обрабатываемых текстов. Другое ограничение касается многоязычия. Все эти программы могут работать только с ограниченным числом алфавитов одновременно.

Идеальная программа первичной обработки текстов

В этой главе будет предпринята попытка, на основании изложенного в предшествующих главах материала, составить набор требований, которым должна удовлетворять ``почти'' совершенная программа первичной обработки текстов.

Самое главное концептуальное требование — это четкое разделение основных понятий теории формализации текстов в архитектуре программы: маркировки, шрифтов, таблиц кодировки и сортировки. Смещение и нечеткость определения для пользователя этих последних понятий делают абсолютное большинство современных прикладных программ чрезвычайно негибкими при работе с текстами общего вида (многоязычными, на редких языках, некоторыми специальными научными и т.п.). Эта негибкость проявляется как в невозможности корректной работы с такими текстами, так и в отсутствие средств (и в первую очередь системных) для создания возможностей работы с ними.

Автор предлагает следующую четкую иерархию: прикладная программа должна поддерживать некоторое множество таблиц кодировки, каждой из которых соответствует некоторое множество шрифтов, каждому из которых, в свою очередь, ставится в соответствие набор таблиц сортировки. Маркировка, как минимум, должна дробить текст на участки, соответствующие той или иной таблице сортировки, которую, как правило, можно однозначно связать с информацией о языке данного участка текста и которая всегда однозначно будет идентифицировать такие формальные понятия более высокого уровня как шрифт и таблица кодировки. Для всей структуризации текста идеально подходит система маркирования стандарта SGML.

В качестве общего вида таблицы сортировки можно предложить соответствия последовательностям некоторых минимальных кодов (обычно в таком качестве выступает байт) некоторым числам, определяющим порядок между такими последовательностями. При этом, для упрощения структуры такого соответствия, к некоторым таблицам сортировки должно прилагаться множество таких последовательностей минимальных кодов (коды диакритик и т.п.), которые игнорируются или просто исключаются из последовательностей минимальных кодов при при определении порядка (или, что есть то же самое, идентификации) кодов обрабатываемого текста. Последнее обеспечит простой способ не различать при обработке определенные композиционные символы (символы плюс, наложенные на них по специальным правилам, другие символы) от других подобных им.

Шрифт, в простейшем случае, можно представить соответствием последовательностям минимальных кодов фиксированной длины (оптимальная длина — два байта) описаниям некоторых графических образов (растр, система векторов и т.п.) и способу их использования. Способ использования — это задание для каждого символа шрифта информации о том, используется ли он самостоятельно или должен налагаться заданным образом на следующий или предшествующий символ (так устроены шрифты программ Летнего института лингвистики). Кроме того, шрифт должен содержать информацию об определяемой им таблице кодировки.

В более сложном, но также и в гораздо более общем случае, шрифт в отличие от ранее данного определения задает соответствие не описаниям графических образов вместе с некоторой краткой дополнительной информацией, а некоторым процедурам, большинство из которых — это зависимые от контекста ``рисовальщики'' ассоциированных с ними символов (зависимость от контекста обеспечивает вырисовку модификаций базовых символов: наклон и его степень, подчеркивание и его вид, курсив и т.п.). Часть процедур, однако, должна предназначаться только для спецификации некоторых изменений контекста вызова следующей процедуры рисования. Такой способ задания шрифтов легко позволит из относительно небольшого исходного набора процедур рисования некоторых базовых символов получать огромное число самых разнообразных знаков: лигатуры, индексы, символы с диакритиками и прочее.

Стоит отметить, что многие современные технологии работы со шрифтами, в частности True Type, имеют много общего с только что описанным теоретическим вариантом представления шрифтов, но из-за плохой проработанности теоретической проблемы места шрифта при формализации текстов, а также часто и просто из-за недоделок в программном обеспечении, все они пока практически неприменимы к текстам общего вида.

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

Главное требование к основной части такой программы, т.е. собственно процедурам преобразования текстов — это возможность очень гибкого использования таблиц сортировок наиболее общего вида. Очевидно, как это уже и отмечалось, что шрифты и, тем более, таблицы кодировки на данном этапе работы с текстами не используются.

Основная базовая операция по обработке текстов — это построение некоторого словаря с заголовками из словоформ, встречающихся в обрабатываемом тексте. Среди полей такого словаря наиболее характерны следующие два: частота и список ссылок на местоположения в исходном тексте данной словоформы. Такой простейший словарь, подключенный к соответствующей информационно-поисковой системе, обеспечит быстрое получение различного рода конкордансов, проекций, статистик и т.п. Иногда (система Унилекс-Т имеет такую возможность), в качестве заголовков статей могут использоваться леммы или словарные словоформы, встречающихся в обрабатываемом тексте словоформ. Однако из-за неоднозначности существующих чисто машинных методов нахождения лемм, такая структура словаря несколько спорна, хотя ясно, что она дает более богатые возможности по получению характеристик текста (так, например, при вычислении леммы определяется и часть речи...). Очень важным является возможность построение словарей по текстам большого объема, т.е. по текстам, объем которых лимитирован лишь емкостью используемых машинных носителей информации.

Следующий тип операций — это работа с таким построенным по исходному тексту словарем (иногда этот словарь должен включать себя и исходный текст). Эти операции естественно рассматривать как аналог запросов к БД. И поэтому требования к ним примерно такие же: возможность использования шаблонов и формул в запросах, возможность для пользователя самому определять шаблоны, возможность логических операций (И, ИЛИ и НЕ) над запросами, разнообразная индексация/сортировка и, наконец, возможность из результатов запросов получать новые БД. Важно предусмотреть возможность для пакетных запросов и соответственно наличие некоторого формального языка их задания. Кроме того, часто бывает очень полезна возможность редактирования как исходного текста, так и построенной по нему БД со скрытой от пользователя синхронизацией их содержимого. На этом этапе естественно использование редактора текста, реализующего принцип WYSIWYG.

Последний тип операций, который должна поддерживать описываемая идеальная программа — это форматная (``красивая'') выдача результатов работы по обработке исходных текстов. Поддержка этого типа операций заключается в использовании адекватных результирующим текстам масштабируемых шрифтов непрерывного типа (или, как минимум, пропорциональных растровых) и соответствующая драйверная поддержка качественных устройств печати.

Список литературы

1. Андрющенко В.М. Концепция и архитектура Машинного фонда русского языка //Машинный фонд русского языка: идеи и суждения. М.: "Наука", 1986.

2. Андрющенко В.М. Лингвистические программно-источниковые пакеты и интегрированные среды //Доклады третьей всесоюзной конференции по созданию Машинного фонда русского языка. М., 1990.

3. Аношкина Ж.Г. Подготовка частотных словарей и конкордансов на компьютере (пособие для филологов) М.: Орехово-Зуевская типография, 1995.

4. Виноградов М.М. Про TEX и немного про других //Мир ПК. 1992. No 1.

5. Гладков С.А., Фролов Г.В. Программирование в Microsoft Windows М.: "Диалог-МИФИ", 1992.

6. Гюнтер Б. Форматы данных Киев: Торгово-издательское бюро BHV, 1995.

7. Данкан Р. Введение в HTML //PC Magazine (russian edition). 1995. No 11.

8. Дейт К. Руководство по реляционной СУБД DB2 М.: "Финансы и статистика", 1988.

9. Злобин К. Aho+Weinberger+Kernighan=AWK //Монитор. 1992. No 6-7.

10. Каратыги С.А., Тихонов А.Ф. Энциклопедия по СУБД Paradox 4.5: в 2-х томах М.: "Мир", 1994.

11. Керниган Б.В., Пайк Р. Unix — универсальная среда программирования М.: "Финансы и статистика", 1992.

12. Кнут Д.Е. Все про TEX Протвино: АО "RDTEX", 1993.

13. Малютин Э.А. Кодовые таблицы персональных компьютеров М.: "Память", 1991.

14. Меделсон Э. Компьютеры без языковых барьеров //PC Magazine (russian edition). 1995. No 1.

15. Миропольский В. Язык PostScript и его конкуренты //КомпьютерПресс. 1990. No 3.

16. Мусин К. Microsoft Word для Windows М.: СП "СЕПТ", 1992.

17. Операционная система MS-DOS. Справочник программиста. М.: "И.В.К. — СОФТ", 1990.

18. Петроченков А.В. Unicode — единый международный стандарт кодирования символов //Мир ПК. 1992. No 1.

19. Петцольд Ч. Шрифт TrueType с расширением Unicode в Windows NT //Мир ПК. 1994. No 2.

20. Петцольд Ч. Unicode, широкие символы и язык C //Мир ПК. 1994. No 2.

21. Петцольд Ч. Ввод символов Unicode с клавиатуры //Мир ПК. 1994. No 2.

22. Рош У.Л. Библия по техническому обеспечению Уинна Роша Минск: МХХК "Динамо", 1992.

23. Сван Т. Форматы файлов Windows М.: "БИНОМ", 1995.

24. Фигурнов В.Э. IBM PC для пользователя М.: "Финансы и статистика", 1990.

25. Фролов А.В., Фролов Г.В. Операционная система MS-DOS М.: "Диалог-МИФИ", 1992.

26. Хант Дж. Вычислительная лингвистика в Летнем Институте Лингвистики //Вопросы языкознания. 1993. No 6.

27. Ярмола Ю. Компьютерные шрифты СПб.: "BHV-СПБ", 1994.

28. Consistent Changes. Users Guide Waxhaw: JAARS, Inc., 1990.

29. Data Structure: Records and Fields. Users' Guide Waxhaw: JAARS, Inc., 1988.

30. ED. Edit Program. Users' Guide Waxhaw: JAARS, Inc., 1988.

31. Goldfarb C.F., Mosher E.J., Peterson T.I. An Online System for Integrated Text Processing //Procedings of the American Society for Information Science. 1970. No 7.

32. Goldfarb C.F. Document Composition Facility Generalized Markup Language: Concepts and Design Guide White Plains: IBM Corporation, 1984.

33. Guidelines for Electronic Text Encoding and Interchange TEI P2, Text Encoding Initiative /Edited by C.M. Sperberg-McQueen and Lou Burnard. Chicago, Oxford: ACH, ACL, ALLC, 1993.

34. Hughes J. A Scheme for Organising Translated Scripture //Notes on computing. Volume 9. 1991. No 2.

35. Information processing — Text and office systems — Standart Generalized Markup Language (SGML) Switzerland: International Organization for Standartisation (ISO), 1986.

36. Johnson C. Fast Interactive Editor of Scripture and Text Analysis Dallas: Summer Institute of Linguistics, Inc., 1989.

37. Manuscripter. Users Guide Waxhaw: JAARS, Inc., 1990.

38. The New Font System Waxhaw: JAARS, Inc., 1987.

39. Printout Tables. Users' Guide Dallas: Summer Institute of Linguistics, Inc., 1990.

40. Reitz A. KeySwap and KeyDef /edited by Priscila M. Kew, Gary F. Simons. //Academic Computing. 1989. No 14

41. Schlabach R.A. Type font control with batch file //Notes on computing. Volume 9. 1991. No 1.

42. Shapes. Character Shapes Program. User Manual. Dallas: Summer Institute of Linguistics, Inc., 1986.

43. Simons G.F. Toward a computing environment for linguistic, literacy, and anthropological research //Notes on computing. Volume 9. 1990. No 4.

44. Special Characters Waxhaw: JAARS, Inc., 1987.

45. Standard Format Markers. User's Guide. Waxhaw: JAARS, Inc., 1990.

46. Software Summaries /edited by B.Frank //Notes on computing. Volume 9. 1990. No 5.

47. WordCruncher Electronic Text Corporation, North University Ave, Provo: Brigham Young University, 1987.

48. Zook K. Character Design Program. Users Guide. Waxhaw: JAARS, Inc., 1985.

ПРИЛОЖЕНИЕ


Программа CC (версия 7.4)

Общая характеристика программы, ее базовые структуры и возможности

Программа CC при вызове загружает файл с таблицами замен и затем, согласно содержащимся в них правилам, производит преобразования данных входного файла, записывая результаты этих преобразований в выходной файл.

Файл таблиц замен может быть как в текстовом (исходник), так и в бинарном (компилированном) формате. Файл таблиц замен в бинарном формате имеет меньший размер и быстрее загружается программой CC. Преобразование из текстового формата в бинарный может осуществляться самой программой CC или программой Manuscripter, а обратное преобразование средствами программ Летнего института лингвистики не обеспечивается.

Текстовый файл таблиц замен может состоять из операторов замены вида ЗАМЕЩАЕМОЕ > ЗАМЕСТИТЕЛЬ (группа операторов замен, которые используются совместно, образуют одну таблицу замен), комментариев и оператора определения группы, в состав которого не входит символ ">". Всего в одном файле замен допускается до 2500 операторов замены.

Замены происходят следующим образом. Входной текстовый файл (подлежащий обработке) читается последовательно от начала до конца, этот процесс можно представить как движение читающего устройства вдоль символов текста. Для каждой фиксированной позиции читающего устройства программа пытается найти совпадения ЗАМЕЩАЕМЫХ, входящих в текущие таблицы операторов замены, с порцией текста, начинающейся с позиции читающего устройства. Если происходит не одно из таких совпадений, а несколько, то выбирается тот оператор замены, ЗАМЕЩАЕМОЕ которого длиннее (в случае совпадения длин выбирается оператор, встретившийся первым). После выбора оператора замены читающее устройство сдвигается на позицию, следующую за концом той порции текста, которая совпала с ЗАМЕЩАЕМЫМ, а в выходной поток (предопределенное направление выходного потока — в выходной файл с результатами замен) записывается текст, определяемый ЗАМЕСТИТЕЛЕМ, и, кроме того, может быть, выполняются некоторые действия, также заданные содержанием ЗАМЕСТИТЕЛЯ. Если не найдется ни одного оператора замены, ЗАМЕЩАЕМОЕ которого совпадало бы с вышеописанной порцией входных данных, то символ с текущей позиции читающего устройства помещается в выходной поток, а само читающее устройство сдвигается на позицию следующего символа, и все повторяется сначала. Работа программы завершается после достижения читающим устройством конца входного файла.

Как ЗАМЕЩАЕМОЕ, так и ЗАМЕСТИТЕЛЬ в общем случае состоят из набора литералов и специальных команд. Литералы и специальные команды могут как следовать непосредственно один за другим, так и быть в целях наглядности разделенными пробелом и/или знаком табуляции (одним или несколькими), а в случае ЗАМЕСТИТЕЛЯ — и концами строк (тоже одним или несколькими, т.е. в ЗАМЕСТИТЕЛЕ допускаются пустые строки). Все содержимое ЗАМЕЩАЕМОГО должно располагаться на одной строке со знаком ">", а содержимое ЗАМЕСТИТЕЛЯ может занимать сколько угодно строк.

Литералы допускают как строковое, так и числовое представление.

Строковый литерал — это последовательность символов, заключенных в двойные или одинарные кавычки (пример строковых литералов: "прекрасная погода", "синий цвет"). Для отображения кавычек того же типа, что и заключающие в себе данную строку символов, в составе самой символьной строки их заключают в кавычки другого типа (пример: телефильм "д'Артаньян и три мушкетера"). Допустимо использование пустого литерала ''.

Числовой литерал — это число, представляющее собой код символа. Числовые литералы дают возможность работать с непечатаемыми (управляющими) символами (пример: 0d9 — это код табуляции в ASCII). Числовые литералы не заключаются в кавычки. Допускаются десятичные, шестнадцатеричные и восьмеричные числовые литералы. Десятичные числовые литералы должны иметь префикс d, D, 0d или 0D; шестнадцатеричные — x, X, 0x, 0X; восьмеричные вводятся без префикса (пример четырех равных друг другу литералов: 0d49, x31, 61, 0X31). Поскольку числовые литералы должны представлять собой код из расширенной таблицы ASCII или кодовой страницы, то их значения могут лежать лишь в десятичном диапазоне от 0 до 255. Кроме того, программа не допускает использования символа с кодом 0, и не гарантирует корректной работы с символами, десятичные коды которых 10, 13 и 26 (для абсолютного большинства программ они означают соответственно: перевод строки, возврат каретки и конец файла).

Последовательность шестнадцатеричных числовых литералов (и только их), может быть сгруппирована в строку с единственным префиксом в начале, при этом каждое шестнадцатеричное число должно состоять из двух цифр (примеры: литерал 0X40444044 эквивалентен строке '@D@D', а литерал 0x0909 эквивалентен двум кодам табуляции — обе эти эквивалентности есть следствия употребления соглашений ASCII).

В сравнении с другой известной программой пакетной обработки текста, в создании которой участвовали такие известные своим вкладом в развитие теории формальных грамматик и построение компиляторов личности, как Б.В. Керниган и Э. Ахо, AWK, программа CC имеет следующие отличия, которые часто можно рассматривать как преимущества: ориентированность на символьные, а не словарные элементы текста; возможность необычайно гибко управлять потоками ввода-вывода; более простой синтаксис для проведения несложной обработки. С другой стороны, CC имеет гораздо меньше возможностей для сложных текстовых обработок. В частности, в CC отсутствует возможность работать с массивами (и тем более ассоциативными, которые поддерживает AWK, и благодаря которым, например, программа построения частотного словаря занимает на этом языке всего несколько строк), а многие операции CC выглядят гораздо более громоздко, чем в AWK.

Краткий обзор команд CC

В следующей далее таблице в первом столбце приводится имя команды с типом параметра на месте параметра; во втором — место команды в операторе замены; в третьем — область приложения команды. Команды должны записываться строчными латинскими буквами.

Тип оператора:

ИОХ — Имя Области Хранения (вместо последовательности одинаковых операторов с разными параметрами ИОХ, допускается использование одного оператора с несколькими параметрами, разделенными запятыми, например, последовательность команд out(first) out(second) эквивалентна команде out(first, second));

ИЛП — Имя Логической Переменной;

ИГ — Имя Группы, в командах с таким параметром допускается использование нескольких параметров ИГ, разделенных запятой;

ИМ — Имя Макрокоманды;

# — десятичное число (без префиксов).

В качестве имени допускается любая последовательность алфавитных символов и цифр, не содержащая символов закрывающей круглой скобки, запятых и пробелов, т.е. именами могут быть и числа. Число (#) должно быть не более 127. Использование следующих друг за другом одинаковых команд с параметром типа # допустимо лишь до тех пор, пока сумма параметров будет не более 300. Заглавные и строчные буквы в именах различаются. ИОХ, ИЛП, ИГ и ИМ образуют независимые области имен, например, ИОХ и ИЛП могут быть одинаковы, но ссылаться они будут на совершенно различные объекты.

Место команды в операторе замены: L — слева от символа > (ясно, что в этой позиции допустима только команда, задающая шаблон для сравнения, или команда, задающая строку-определение, define); R — справа от символа >; D — данная команда может быть употреблена только в определенном контексте.

Области приложения команд описаны в последующих разделах.

'' LR субститут

add(ИОХ) R арифметика

any(ИОХ) L субститут

append(ИОХ) R работа с областями хранения (управление вводом/выводом)

back(#) R управление вводом/выводом

begin L субститут

begin DR управление

caseless DR начальная установка

clear(ИЛП) R логические переменные

cont(ИОХ) L субститут

cont(ИОХ) DR субститут

define(ИМ) L макрокоманды и макроопределения

div(ИОХ) R арифметика

do(ИМ) R макрокоманды и макроопределения

dup R субститут

else DR управление

end DR управление

endfile LR субститут

endif R управление

endstore R работа с областями хранения (управление вводом/выводом)

excl(ИГ) R группы

fol(ИОХ) L субститут

fwd(#) R управление вводом/выводом

if(ИЛП) R управление

ifeq(ИОХ) R управление

ifgt(ИОХ) R управление

ifn(ИЛП) R управление

ifneq(ИОХ) R управление

incl(ИГ) R группы

incr(ИОХ) R арифметика

mod(ИОХ) R арифметика

mul(ИОХ) R арифметика

next R управление

nl LR субститут

omit(#) R управление вводом/выводом

out(ИОХ) R работа с областями хранения (управление вводом/выводом)

outs(ИОХ) R работа с областями хранения (управление вводом/выводом)

prec(ИОХ) L субститут

read R управление вводом/выводом

repeat DR управление

set(ИЛП) R логические переменные

store(ИОХ) R работа с областями хранения (управление вводом/выводом)

sub(ИОХ) R арифметика

unsorted DR начальная установка

use(ИГ) R группы

wd(ИОХ) L субститут

write R управление вводом/выводом

wrstore(ИОХ) R работа с областями хранения (управление вводом/выводом)

Комментарии вводятся символом "c" (латинским), остаток строки после этих символов игнорируется программой CC. Не допускается непосредственного примыкания к "c" (или "C") любых символов кроме пробела, табуляции или конца строки.

Оператор определения группы GROUP(<имя группы>) занимает отдельную строку и по существу является просто маркером. Он указывает, что все операторы замены после него и до следующего оператора определения группы или до конца файла замен относятся к группе с вводимым этим оператором именем. Эта возможность позволяет иметь несколько таблиц замен (до 127) и использовать одновременно только часть их (можно одновременно использовать до 25 групп). Данный оператор не является обязательным. В случае использования в файле таблиц замен только одной группы его употребление излишне.

Определение областей хранения и управление потоком ввода/вывода

Как уже отмечалось выше, предопределенное направление потока вывода — это выходной файл. Программа CC позволяет переопределять это направление в именованные области хранения. Рассмотрим подробно все команды CC, имеющие отношение к данной возможности.

append(ИОХ) — после этой команды поток вывода будет направлен в область хранения с именем ИОХ, причем содержимое этой области хранения не очищается от данных, которые ранее могли быть туда записаны.

endstore — после этой команды направление потока вывода примет предопределенное значение (в выходной файл).

out(ИОХ) — эта команда возвращает направлению потока вывода предопределенное значение (в выходной файл) и сбрасывает содержимое области хранения с именем ИОХ в выходной поток, при этом содержимое самой этой области хранения не изменяется.

outs(ИОХ) — полностью аналогична команде out за исключением того, что она не изменяет текущее направление потока вывода.

store(ИОХ) — полностью аналогична команде append за исключением того, что она удаляет все данные, содержащиеся в данной области хранения до выполнения команды store. Проиллюстрируем возможности данного класса команд на примере инвертирования двуязычного словаря.

Пусть задан размеченный словарь со следующей структурой статей:

\w <слово>
\p <часть речи>
\d <перевод>
\i <иллюстрационное предложение с данным словом>
\t <иллюстрационное предложение с данным переводом>

По нему строим инвертированный словарь с следующей структурой каждой статьи:

\w <перевод>
\p <часть речи>
\d <слово>
\i <иллюстрационное предложение с данным переводом>
\t <иллюстрационное предложение с данным словом>

Например, статья:

\w cat
\p n
\d кот
\i The cat is black.
\t Этот кот — черный.

Должна быть трансформирована в статью:

\w кот
\p n
\d cat
\i Этот кот — черный.
\t The cat is black.

Следующая последовательность правил совершает требуемое:

"\w " > out(def,part,word,trans,ill)
    c выводит инвертированную статью при встрече следующей статьи
    store(trans,ill,def,part,word)
    "\d "
    c очищает области хранения trans, ill, def, part и word и заносит 
    c в последнюю "\d " (входное слово превращается в перевод)
"\p " > store(part) "\p "
"\d " > store(def) "\w "
    с выводит в область сохранения def перевод, снабженные, однако, 
    c маркером слова \w
"\i " > store(ill) "\t "
"\t " > store(trans) "\i "
endfile > out(def,part,word,trans,ill)
    endfile
    c выводит последнюю инвертированную статью при встрече с концом файла

Следующие команды CC также позволяют управлять потоком ввода/вывода.

back(#) — данная команда забирает # символов из выходного потока (файла или области хранения) и помещает их во входной поток, так что позиция читающего устройства отходит на # позиций назад и данные # символов ложатся как раз перед читающим устройством.

fwd(#) — после данной команды # символов из входного потока (входного файла) непосредственно, минуя таблицу замен, помещаются в выходной поток.

omit(#) — после данной команды читающее устройство просто перемещается на # позиций вперед во входном файле, т.е. порция входных данных длиной # символов игнорируется.

read — вводит строку с клавиатуры и помещает ее в текущий поток вывода.

write <строка> — выводит <строку> на экран дисплея, <строка> представляет собой любую комбинацию литералов и nl команд, завершающейся любой командой отличной от субститута.

wrstore(ИОХ) — выводит на экран дисплея содержимое области хранения с именем ИОХ.

Пример 1.

" " > " " back(1)   c заменяет много пробелов на один
" " nl > nl back(1) c убирает все пробелы перед концом строки

Пример 2.

ЗАМЕЩАЕМОЕ > store(4) outs(1) outs(2) outs(3)
c переносит в c область хранения 4 содержимое областей хранения 1, 2 и 3.
ЗАМЕЩАЕМОЕ > store(x) endstore c очистка области хранения x

Субституты

Субститут или шаблон замещает один или множество литералов.

'' — ЗАМЕЩАЕМОЕ, состоящее из одного пустого литерала, совпадает с любыми данными из входного файла; использование пустого литерала в ЗАМЕЩАЕМОМ совместно с другими литералами или в ЗАМЕСТИТЕЛЕ хотя и допустимо, но бессмысленно. Данный субститут должен использоваться (во избежание зацикливания программы) совместно с командами fwd, omit или use. Его можно использовать для проведения замен над всеми символами, не входящими в текущую(ие) таблицу(ы) замен.

Пример:

"s" > "s"         c ставит перед всеми символами, кроме s,
endfile > endfile c знак дефис
"" > fwd(1) '-'

any(ИОХ) — совпадает с любым символом из области хранения с именем ИОХ.

begin — начало файла, используется для начальной установки.

cont(ИОХ) — в ЗАМЕЩАЕМОМ эквивалентен литералу, равному содержимому области хранения с именем ИОХ.

Пример:

begin > store(1) "xyz" endstore c замена последовательности
cont(1) > "abc"                 c символов "xyz" на "abc"

cont(ИОХ) — в ЗАМЕНИТЕЛЕ может быть использован только в командах ifeq, ifneq, ifgt как эквивалент литерала, равного содержимому области хранения с именем ИОХ.

Пример:

"abc" > ifeq(2) cont(4) "xyz" c замена символов "abc" на
       else "uvw"             c "xyzf", если область хранения 2
       endif                  c равна области хранения 4, и
       "f"                    c на "uvwf", если не равна

dup — служит для посылки в выходной поток той порции входных данных, которая совпала с ЗАМЕЩАЕМЫМ.

Пример:

"ab" > dup  c эквивалентно "ab" > "ab"
"big" > "deep"  c замена big на deep, но не
"big bad" > dup  c в сочетании big bad
"big" nl "bad" > dup

endfile — конец файла.

fol(ИОХ) — делает ЗАМЕЩАЕМОЕ эквивалентным ЗАМЕЩАЕМОЕ any(ИОХ) при поиске совпадения во входном файле, однако, при выборе данного оператора замены (содержащего fol), читающее устройство после проведения замены становится на позицию символа, совпавшего с этой добавочной командой any, т.е. этот символ читается только для сравнения и не может, например, быть выведен в выходной поток командой dup. При выборе самого длинного ЗАМЕЩАЕМОГО при совпадении нескольких ЗАМЕЩАЕМЫХ с входной порцией данных считается, что fol, как prec и wd, имеет длину меньше единицы (т.е. длины одного символа или приравненных к нему субститутов, например any), но больше нуля.

nl — перенос строки.

Пример 1.

"дерево" > nl  c замена слова "дерево" во входном
"  *  " nl     c тексте на пиктограмму елки
" *** " nl
"*****" nl

Пример 2.

"горячая пища" > "каша"  c замена через перенос строки
"горячая" nl "пища" > "каша"

prec(ИОХ) — делает ЗАМЕЩАЕМОЕ эквивалентным any(ИОХ) ЗАМЕЩАЕМОЕ при поиске совпадения во входном файле, однако при выборе данного оператора замены (содержащего prec) читающее устройство после проведения замены становится на позицию символа, совпавшего с этой добавочной командой any (с исключением остальных совпавших символов из входного потока), т.е. этот символ читается только для сравнения, и не может, например, быть выведен в выходной поток командой dup.

wd(ИОХ) — делает ЗАМЕЩАЕМОЕ эквивалентным any(ИОХ) ЗАМЕЩАЕМОЕ any(ИОХ) при поиске совпадения во входном файле, однако при выборе данного оператора замены (содержащего wd) читающее устройство после проведения замены становится на позицию символа, совпавшего с первой из этих добавочных команд any (с исключением символов совпавших с ЗАМЕЩАЕМЫМ из входного потока), т.е. эти символы (совпавшие с добавочными командами any) читаются только для сравнения, и не могут, например, быть выведены в выходной поток командой dup.

Пример:

begin > store(delim) ' ' nl '.,";:?!([{}])' endstore
    c запись границ слов (разделителей) в область хранения delim
"man" wd(delim) > "person"
    c замена выделенных разделителями слов
"men" wd(delim) > "people"
    c man и men на person и people соответственно

Логические переменные

CC позволяет использовать логические переменные, которые затем можно использовать в командах if и ifn.

set(ИЛП) — установка значения логической переменной с именем ИЛП, равным true (истина).

clear(ИЛП) — установка значения логической переменной с именем ИЛП, равным false (ложь).

Команды управления

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

begin — начало блока. Эта команда дает возможность вложения операторов if, ifeq, ifgt, ifn друг в друга.

else — после этой команды замены и/или команды выполняются только, если условие при предшествующем if, ifeq, ifgt, ifn или ifneq не истинно.

end — конец блока, начало которого обозначено командой begin.

endif — означает конец действия операторов типа if (if, ifeq, ifgt, ifn, ifneq, else). Такое же действие имеет начало следующего оператора замены.

if(ИЛП) — эта команда сравнивает значение логической переменной с именем ИЛП со значением true (истина). Если сравнение успешно, то выполняются все команды и/или замены, следующие за ней до команд else или endif или, если сама команда if находится в блоке (begin end), end.

Пример:

'x' > if(1)      c замена 'x' на
    begin        c 'a', если значения 1 и 2 true (истина)
      if(2) 'a'  c 'b', если значения 1 true (истина)
      else 'b'   c и 2 false (ложь)
    end else begin
                 c 'c', если значения 1 false (ложь)
      if(2) 'c'  c и 2 true (истина)
      else 'd'   c 'd', если значения 1 и 2 false (ложь)
    end

ifeq(ИОХ) <строка> — эквивалентна команде if во всем, кроме того, что сравнение считается успешным, если содержимое области хранения с именем ИОХ совпадает с содержимым <строки>, <строка> — это либо структура, синтаксис которой приведен в описании команды write, либо команда cont(ИОХ); в последнем случае сравнивается содержимое двух областей хранения. Кроме того, так как CC сначала пытается сначала провести не побайтовое, а числовое сравнение, начальные нули (символы '0') в области хранения игнорируются.

ifgt(ИОХ) <строка> — эквивалентна команде ifeq во всем, кроме того, что сравнение считается успешным, если содержимое области хранения с именем ИОХ больше <строки>. Содержимое строки-1 больше строки-2 в смысле CC, если при побайтовом сравнении обеих строк с их начал, в строке-1 первым встретится символ, ASCII которого больше ASCII соответствующего ему символа из строки-2 или, если строка-1 длиннее строки-2.

ifn(ИЛП) — эквивалентна команде if во всем, кроме того, что сравнение считается успешным, если значение переменной с именем ИЛП ложно. Команды if и ifn могут следовать непосредственно одна за другой. Например, if(ИЛП1) if(ИЛП2) ifn(ИЛП3) if(ИЛП4) — эта последовательность будет эквивалентна одной команде if(ИЛП5), где переменная с именем ИЛП5 имеет значение ИЛП1 and ИЛП2 and not ИЛП3 and ИЛП4.

ifneq(ИОХ) <строка> — эквивалентна команде ifeq во всем, кроме того, что сравнение считается успешным, если содержимое области хранения с именем ИОХ не совпадает с содержимым <строки>.

repeat — позволяет организовывать циклы; после этой команды вновь выполняются все замены и/или команды следующие после команды begin, находящийся перед repeat.

Пример

begin > store(count) '00' endstore 
'x' > begin  c увеличивает число в области incr(count)
             c хранения с именем count до тех 
        ifneq(count) '80'  c пор, пока оно не станет равным 
          repeat  c 80 (простейший цикл) 
      end

next — выполняет правую часть (ЗАМЕСТИТЕЛЬ) следующего оператора замены.

Использование данной команды полезно в тех случаях, когда для различных замещаемых нужно выполнить одинаковые действия, определяемые ЗАМЕСТИТЕЛЕМ.

Пример:

'1' > next c выводит символ 'x' после каждой цифры
'2' > next
'3' > next
'4' > next
'5' > next
'6' > next
'7' > next
'8' > next
'9' > next
'0' > dup 'x'

Арифметика

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

add(ИОХ) <число> — прибавляет к содержимому области хранения <число> (литерал или последовательность литералов, составленный(ые) только из символов десятичных цифр '0', '1'..'9'), и записывает результат обратно в область хранения.

Пример:

begin > store(test) '22' endstore
    add(test) '34'  c в результате в области хранения с 
                    c именем test будет храниться '56'

div(ИОХ) <число> — целочисленно делит содержимое области хранения на <число> и записывает частное обратно в область хранения.

incr(ИОХ) — увеличивает содержимое области хранения на единицу. При этой операции не происходит добавления разрядов к растущему числу, поэтому нужно заранее записать в начало области хранения достаточное количество символов '0'. В отличие от add, div, mod, mul и sub данная команда сохраняет начальные символы '0' в области хранения и может работать с нечисловым содержимым области хранения.

Пример:

begin > store(zork) 'x' incr(zork) out(zork)  c выведет 'y'
begin > store(num) 'b9' incr(num) incr(num) out(num)
    c выведет 'c1'

mod(ИОХ) <число> — целочисленно делит содержимое области хранения на <число> и записывает остаток обратно в область хранения.

mul(ИОХ) <число> — умножает содержимое области хранения на <число> и записывает результат обратно в область хранения.

sub(ИОХ) <число> — вычитает от содержимого области хранения <число> и записывает результат обратно в область хранения.

Команды использования групп

Эти команды позволяют выбирать текущие таблицы замен из общей совокупности таблиц файла замен.

excl(ИГ1, ИГ2, ...) — исключает из совокупности текущих таблиц замены группы с именами ИГ1, ИГ2 и т.д.

Пример:

begin > use(1,2,4)
    use(1,2)  c эта строка может быть заменена командой excl(4)

incl(ИГ1, ИГ2, ...) — включает в совокупность текущих таблиц замены новые группы с именами ИГ1, ИГ2 и т.д.

use(ИГ1, ИГ2, ...) — отменяет все текущие таблицы замен и устанавливает новую совокупность текущих таблиц замены ИГ1, ИГ2 и т.д.

Макрокоманды

Использование макрокоманд позволяет сократить размер файла замен и сделать его более понятным.

define(ИМ) — позволяет определить последовательность команд и/или замен, которую затем можно будет вызывать по имени ИМ.

Пример: define(macro1) > '**' dup '**'

do(ИМ) — вызов последовательности команд и/или замен, ассоциируемых с именем ИМ.

Пример:

define(macro2) > dup '*' dup
'a' > do(macro2)
'b' > do(macro2)

Начальная установка

Дает возможность определить некоторые глобальные характеристики проводимых замен. Команды начальной установки можно использовать только совместно с командой begin в ЗАМЕЩАЕМОМ.

caseless — во входном тексте будут заменятся не только подтексты, целиком совпадающие с тем или иным ЗАМЕЩАЕМЫМ из файла замен, но и подтексты, различающиеся с ЗАМЕЩАЕМЫМ признаком заглавности-строчности первой буквы, при этом однако сам признак не изменится (т.е. "this" > "that", будет эквивалентом двух команд: себя и "This" > "That"). При использовании caseless необходимо, чтобы первый символ ЗАМЕЩАЕМОГО был строчной буквой. Установка командой caseless дает эффект только при приложении к первому символу ЗАМЕЩАЕМОГО и не имеет эффекта, если первый символ не латинская буква.

Пример: begin > caseless

unsorted — используется для указания того, что порядок замен должен быть такой же самый, как и последовательность правил в файле замен. Без использования этой команды замены происходят прежде всего для самых длинных заменяемых.


© Copyright 1998 V.Lidovski

Монография депонирована в ИНИОН РАН (N 53656, 1998).