Искал я тут давеча OCR для одного англоязычного проекта. И попутно ознакомился с состоянием дел относительно родного языка. Свободной OCR, способной распознавать родную речь, я не обнаружил. Зато наткнулся на проект tesseract. Это бывшая коммерческая многоплатформенная OCR, разработанная Hevlet Packard. Теперь она, во-первых, распространяется под лицензией Apache v.2. А во-вторых, ее можно попытаться обучить какому-нибудь новому языку, что мы и попробуем сделать. Итак, читаем мануал под названием TrainingTesseract:
первым шагом должно быть определение полного набора символов, который будет использован, и создания текстового файла или файла текстового процессора с примерами.
При подготовке тренировочного файла надо помнить следующее:
требуется минимальное количество примеров каждого символа. 10 - хорошо, но 5 - достаточно для редких символов, а для часто встречающихся надо хотя бы 20;
нельзя группировать небуквенные символы все вместе, надо делать текст более реалистичным, например:
в чащах юга жил-был цитрус да но фальшивый экземпляр. 0123456789 !@#$%^&(),.[]{}<>/? - ужасно. Гораздо лучше: в чащах {юга} жил-(был) цитрус, да! но? <фальшивый> $3456.78 экземпляр #90 <апельсин>/помидор' 12.5%неплохо бы растянуть текст с помощью увеличения межстрочного и межсимвольного интервалов;
тренировочные данные должны умещаться на одной странице;
нет необходимости тренироваться на нескольких размерах, достаточно на шрифте размером 10. Но для высоты текста меньше 15 пикселов нужно тренировать отдельно или увеличить изображение до распознавания.
Далее надо напечатать и отсканировать или использовать какой-нибудь другой метод для получения картинки тренировочной страницы. Может быть до 32 страниц использовано. Лучше всего создавать страницы со смешением шрифтов и стилей, включая жирный и наклонный.
Я попробую сделать это только для шрифта Thorndale AMT, который на моем десктопе под SUSE10 в OpenOffice выглядит почти как Times New Roman под Виндой. Итак, делаю отдельный файлик с выше приведенным текстом про цитрус fontfile.odt, печатаю, сканирую и сохраняю в черно-белый BMP fontfile.bmp.
Следующий шаг - это создание файла с координатами прямоугольников, в которых заключен каждый символ. К счастью, tesseract может сделать файл требуемого формата, хоть набор символов и не будет соответствовать нашему. Поэтому потом надо будет поправить файл вручную, введя правильные символы. Итак, делаем:
tesseract fontfile.bmp fontfile batch.nochop makebox
В результате получился файл fontfile.txt, который надо переименовать в fontfile.box
Вот что у меня там:
B 13 137 29 154
Y 46 142 56 154
I 54 137 63 154
Z 67 137 82 154
M 85 132 111 154
Z 114 137 130 154
X 133 137 150 154
{ 170 130 180 162
m 186 137 210 154
r 214 137 228 154
a 233 137 248 154
} 254 130 264 162
M 284 137 306 154
и т.д.
Теперь самая суровая часть - надо этот файлик отредактировать в редакторе, в котором можно заменить неправильные символы на нужные. Я использую Kate.
Опс, похоже, щ заменилось 2-мя символами:
Z 67 137 82 154
M 85 132 111 154
в этом случае надо объединить описывающие прямоугольники следующим образом:
Первый номер (левый) должен быть минимальным из 2-х строк (67)
Второй номер (низ) должен быть минимальным из 2-х строк (132)
Третий номер (правый) должен быть максимальным из 2-х строк (111)
Четвертый номер (верх) должен быть максимальным из 2-х строк (154)
итак: щ 67 132 111 154
Замечание: координатная система, используемая в этом файле, начинается с (0,0) и направлена снизу вверх и слева направо.
Фух, кажется, поправил. Теперь запускаем tesseract в обучающем режиме:
tesseract fontfile.bmp junk nobatch box.train
и смотрим stderr (или tesseract.log под Виндой). Если есть ошибки вида FATALITY,
это значит что tesseract не нашел ни одного образца символа, указанного в координатном файле. У меня он выдал ошибку:
APPLY_BOXES: FATALITY - 0 labelled samples of "%" - target is 2
APPLY_BOXES:
Boxes read from boxfile: 89
Initially labelled blobs: 87 in 3 rows
Box failures detected: 2
Duped blobs for rebalance: 0
"%" has fewest samples: 0
Total unlabelled words: 1
Final labelled words: 87
Generating training data
TRAINING ... Font name = UnknownFont.
Generated training data for 87 blobs
Однако fontfile.tr сгенерился. Ладно, обойдусь пока без знака % Вообще надо было сделать побольше всех символов, хотя бы повторить эту фразу пяток раз.
По идее я должен повторять эту процедуру для разных шрифтов и получить несколько разных файлов, а затем создать прототипы с помощью команд вида:
mftraining fontfile_1.tr fontfile_2.tr ...
в результате должны получиться 2 файла: inttemp (прототипы форм) и pffmtable, затем
cntraining fontfile_1.tr fontfile_2.tr ...
создаст normproto файл (прототипы для нормализации символов?).
Делаю это над одним моим файлом. Что-то получилось. Теперь надо указать tesseract'у множество символов, которое он может вывести. Используем команду unicharset_extractor чтобы сгенерить файл unicharset:
unicharset_extractor fontfile_1.box fontfile_2.box ...
Делаем. В полученном файле необходимо указать тип символа с помощью маски, маска такая: если буква - 1, если маленькая буква - 1, если большая буква - 1, если цифра -1, иначе 0.
Например,
б - маленькая буква. Еее маска 0011 или шестнадцатеричная 3
; - не буква, не цифра. Маска = 0
7 - просто цифра. Маска 1000 или шестнадцатеричная 8.
Ь - большая буква. Маска 0101 или шестнадцатеричная 5
и т.д.
у меня все буквы маленькие. Меняю им маску на 3.
Теперь надо где-то взять два списка, один - часто встречающихся слов, второй - остальных слов и преобразовать их в DAWG-формат с помощью еще одной утилитки:
wordlist2dawg frequent_words_list freq-dawg
wordlist2dawg words_list word-dawg
Я для начала просто набил в каждый по 5 произвольных слов.
Третий файл, user-words обычно пустой.
Последний файл, который надо сделать, называется DangAmbigs В нем описываются случаи ошибочной замены одного файла на другой, например
1 Ш 2 1И
первая цифра - количество символов в первой группе, 2-я - кол-во символов во 2-й.
Эта строка показывает, что 1И может иногда распознаваться неправильно как Ш.
Этот файл тоже м.б. пустым.
Теперь все собираем вместе. Файлы
freq-dawg
word-dawg
user-words
inttemp
normproto
pffmtable
unicharset
DangAmbigs
снабжаем префиксом rus и помещаем в туда, где остальные словари, у меня это /usr/local/share/tessdata
Все!!!
Пробуем распознать какой-нибудь файлик. Я попробую для начала свой про цитрус:
tesseract image.bmp output -l rus
Вот что у меня получилось:
в чыаьах {юга} жшл-(был) цштрус, да! но?
<(1ьалвьшвый> $3456.78 экземпляр #90
капелвсшнм/помшдор' 12.5й
Конечно, не супер, но для первого раза, и столь скудных образца и словаря, я думаю, неплохо!