Основная идея
За счет чего это можно сделать? Некоторые ошибки (назовем их «хорошими») допустимо исправлять автоматической заменой ошибочного слова на правильное, например: «собераюсь» ‡ «собираюсь». Однако далеко не все ошибки таковы. Предположим, неправильно написано «садится» вместо «садиться» — оба эти слова есть в русском языке, поэтому автоматически заменять одно на другое нельзя. Или, скажем, «оптека» — непонятно, что же должно быть на самом деле, то ли «оптика», то ли «аптека».
Так вот, если написать программу, исправляющую хотя бы наиболее распространенные «хорошие» ошибки, то объем ручной работы заметно сократится. Ведь чтобы исправить одну ошибку вручную, нужно выполнить целую последовательность действий, например: подвести курсор к нужному месту текста, удалить неправильный или лишний символ и/или вставить правильный. Бывают ошибки и в двух символах, переставленных местами, и еще более сложные. Особенно полезной такая программа будет при обработке текстов с большим количеством ошибок.
Разумеется, если в тексте с какой-то целью присутствуют слова, специально написанные неправильно (как, например, в этой статье), то нужно либо отказаться от автоисправления ошибок, либо получившийся после него текст сравнить с исходным, проверяя, не произошло ли ненужных исправлений.
Первые шаги
Для начала я написал простейшую программу на Perl (этот язык весьма удобен для работы с текстами), которая читала исходный текстовый файл, исправляла часть ошибок с помощью замен неправильных слов на правильные и записывала результат. Для простоты я решил ограничиться обработкой таких текстовых файлов, где не используются переносы слов.
Участок программы, исправляющий ошибки, представлял собой последовательность операторов поиска-замены следующего вида:
Здесь конструкция «(?
Чтобы программа была эффективной, она должна исправлять как можно больше ошибок. А значит, нужно было добавлять в нее операторы для исправления новых ошибок. Я это делал прямо в процессе редактирования текста. Дабы меньше отвлекаться от этой своей основной задачи, я, исправив очередную «хорошую» ошибку, добавлял оператор для ее исправления, только если она встречалась достаточно часто.
Следующим шагом было некоторое упрощение добавления информации для исправления ошибок. Я изменил программу так, чтобы пары из неправильного и правильного слов содержались не непосредственно в операторах поиска-замены, а в отдельном файле-словаре в виде «неправильное слово ‡ правильное слово». Программа читала содержимое этого словаря и в соответствии с ним выполняла замены. Добавить новую пару в словарь было несколько проще, чем добавить новый оператор поиска-замены в программу.
Хотелось бы, однако, пополнять словарь так, чтобы вовсе не приходилось отвлекаться от редактирования текста. Например, сначала отредактировать текст, а потом, в удобное время, сравнить исходный текст с отредактированным, находя исправленные слова и добавляя в словарь «хорошие» пары слов (т. е. соответствующие «хорошим» ошибкам). Но это процесс трудоемкий, и выполняя его вручную, легко что-нибудь пропустить.
Автоматизация пополнения словаря
К счастью, возникла идея почти полной автоматизации этого процесса. Пусть специальная программа сравнивает исходный текст с отредактированным, находя исправленные слова. Найденные пары слов (слово с ошибкой и исправленный вариант) она будет предъявлять пользователю, который и вынесет вердикт: является ли данная пара «хорошей» или нет. «Хорошие» пары программа добавит к словарю.
То есть тут человек берет на себя именно ту часть работы, которую компьютеру выполнить затруднительно: оценивает, является ли очередная пара слов «хорошей». А все остальное делается автоматически.
Руководствуясь вышеизложенным, предстояло разработать алгоритм и написать требуемую программу для пополнения словаря.
О разработке алгоритма создания и дополнения словаря, написании соответствующей программы и работе с ней вы можете прочесть в полной версии статьи на “Мир ПК-диске».