Оптическое распознавание дореформенной орфографии:

дообучение модели Tesseract OCR на материалах газеты «Искра»

Автор

Анастасия Богданова
Ольга Алиева

Дата публикации

28.10.2025

Аннотация
Страница подготовлена в процессе работы над магистерской диссертацией по образовательной программе «Цифровые методы в гуманитарных науках» Факультет гуманитарных наук Национальный исследовательский университет «Высшая школа экономики» (г. Москва).
Научный руководитель — Алиева О.В.


Благодарности

Авторы выражают искреннюю благодарность
за всестороннюю помощь и поддержку — Анастасии Орловой;
за подготовку эталонных данных — студентам магистерской программы «Русская литература и компаративистика» Дарье Бахаровской, Айнур Гасановой, Екатерине Гуреевой, Наталье Лузгановой, Екатерине Можаровской, Полине Трофимовой, Элине Чинкиной.

Основано на материалах курса О.В. Алиевой Программирование на R для филологов и работе Andrés Cruz Fine-tuning Tesseract’s OCR (with some help from R



1 Постановка проблемы

В рамках подготовки магистерской диссертации по атрибуции текстов русской нелегальной печати начала XX века, в частности газеты «Искра» (1900–1905), возникла необходимость создания корпуса текстов предполагаемых авторов и редакторов издания. Поскольку газета «Искра» не оцифрована, а существующие OCR-технологии демонстрируют низкую точность при распознавании дореформенных шрифтов и орфографии, было принято решение о дообучении модели Tesseract на специально собранных данных.


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



2 Tesseract OCR

OCR (Optical Character Recognition) — технология автоматического распознавания печатного текста на изображениях и преобразования его в машинно-читаемый формат. Эта технология позволяет “извлекать” текст из сканированных документов, фотографий, PDF-файлов и других графических форматов.

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

Пакет tesseract в R представляет собой обертку для библиотеки Tesseract, которая позволяет:

  • Распознавать текст с изображений различных форматов (PNG, JPEG, TIFF, PDF);

  • Работать с многостраничными документами;

  • Использовать предобученные модели для разных языков (список);

  • Настраивать параметры распознавания под конкретные задачи;

  • Дообучать модели для улучшения качества распознавания специфических шрифтов или типов документов.

В отличие от онлайн-сервисов OCR, пакет tesseract работает локально, что обеспечивает:

  • Конфиденциальность — данные не передаются третьим лицам;

  • Скорость — нет задержек на передачу данных по сети;

  • Настраиваемость — возможность тонкой настройки под конкретные задачи;

  • Бесшовную интеграцию с экосистемой R для дальнейшего анализа данных.

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



3 Файн-тюнинг

Начиная с версии 4, Tesseract использует нейронную сеть для распознавания текста, что позволяет дообучать модель для конкретных задач. Для дообучения необходимы эталонные данные — фрагменты изображений с соответствующим им текстом. За основу мы возьмем существующую модель для русского языка (rus), создадим новый язык с названием «old rus» (orus) и подготовим обучающие данные для дообучения модели распознаванию дореформенной орфографии.



3.1 Подготовка изображений

Всего для дообучения было подготовлено 36 фрагментов статей из газеты «Искра» (1900-1905). Например, вот такие два изображения с текстами, предположительно принадлежавшими перу Л.Троцкого и Парвуса (И.Л.Гельфанда).

Фрагмент оригинала газеты Рис. 1. [Троцкий] «Искра». 1904. №61.

Фрагмент оригинала газеты Рис. 2. [Парвус] «Искра». 1904. №61.

Создаем папку с именем {язык}-ground-truth/ (например, orus-ground-truth/) для хранения эталонных данных.

dir.create("orus-ground-truth")



3.2 Разметка данных

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

source("./helper_scripts/crop_words.R") # вставьте путь до скрипта на вашем компьютере

Функция crop_words() принимает на входе путь до изображения (обязательный аргумент), название директории, куда будут сохранены слова (по умолчанию words), язык базовой модели (код tesseract, по умолчанию rus) и отступ вокруг слова при обрезке (в пикселях). Аргумент overwrite управляет тем, очищать ли существующие файлы word_*.png в out_dir перед сохранением (по умолчанию FALSE).

Также функция проверяет наличие пакетов magick, tesseract, tidyverse; при отсутствии пытается установить их вместе с зависимостями и затем подключает. Для корректной работы OCR с выбранным языком в системе должны быть установлены языковые данные Tesseract. Функция сохранит в папку изображения, а также вернет таблицу с метаданными.

crop_words(image_path = "./ocr/img_1.png", # подставьте путь к вашему файлу
           out_dir = "./orus-ground-truth",
           lang = "rus",
           pad = 0,
           overwrite = TRUE)



В папке orus-ground-truth появляются изображения подобные этим:



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

# install.packages("remotes")
# remotes::install_github("arcruz0/tesseractgt")
library(tesseractgt)
create_gt_txt(
  folder = "./orus-ground-truth",
  extension = "png", 
  engine = tesseract::tesseract(language = "rus")
)



В директории orus-ground-truth создаются текстовые файлы с расшифровками. Это выглядит примерно так:



Теперь самый важный и трудоемкий этап: корректировка текстовых файлов. Исправить автоматически созданные файлы .gt.txt поможет специальная функция:

correct_gt_txt() 



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



Справочная информация

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

  • Ять: Ѣ (U+0462), ѣ (U+0463)
  • И десятеричное: І (U+0406), і (U+0456)
  • Фита: Ѳ (U+0472), ѳ (U+0473)
  • Ижица: Ѵ (U+0474), ѵ (U+0475)
  • Твёрдый знак, еръ: Ъ (U+042A), ъ (U+044A)



3.3 Процесс дообучения модели Tesseract OCR

Дообучение модели Tesseract OCR выполнялось с использованием специализированного проекта tesstrain, предназначенного для подготовки и обучения языковых моделей. На этом этапе формировались все необходимые материалы для обучения: изображения с разметкой, эталонные тексты и конфигурационные файлы.

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



Для запуска обучения использовалась команда:

gmake training MODEL_NAME=orus START_MODEL=rus FINETUNE_TYPE=Impact LANG_TYPE=Both



Смысл отдельных частей команды:

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

MODEL_NAME=orus — имя новой модели, которая будет создана; в результате появится файл orus.traineddata.

START_MODEL=rus — обучение ведётся не с нуля, а на основе уже существующей русской модели rus, что ускоряет процесс и повышает надёжность.

FINETUNE_TYPE=Impact — «бережное» дообучение: изменяются только части сети, чтобы сохранить сильные стороны базовой модели и адаптировать её под новые тексты.

LANG_TYPE=Both — используется оба набора языковых данных Tesseract (классический и LSTM), что позволяет более полно покрыть правила, словари и примеры для дореформенной орфографии.

В результате была получена экспериментальная модель orus.traineddata, адаптированная под особенности дореформенной орфографии и демонстрирующая улучшенные показатели распознавания по сравнению со стандартной моделью rus.



Подробное описание методики обучения и примеры выполнения команд приведены в материалах курса О.В. Алиевой «Программирование на R для филологов».



4 Результаты и метрики

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


4.1 Метрики точности распознавания OCR

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

Метрика Полное название Что измеряет Интерпретация
CER Character Error Rate Ошибка на уровне символов: (вставки + удаления + замены) ÷ общее число символов Основная метрика OCR. Чем меньше, тем лучше; отражает долю неверно распознанных символов
WER Word Error Rate Ошибка на уровне слов: (вставки + удаления + замены) ÷ общее число слов Показывает, насколько корректно распознаются целые слова; чувствительна к пунктуации и орфографии
BCER Best Character Error Rate Лучшая (минимальная) ошибка символов, достигнутая на обучении Используется при fine-tuning: отражает качество на обучающем наборе
BWER Best Word Error Rate Лучшая ошибка слов на обучающем наборе Аналогично BCER, но на уровне слов
Character Accuracy Точность по символам: 1 − CER Процент правильно распознанных символов; 98 % означает 2 % ошибок
Micro-CER Micro-averaged CER Средняя ошибка символов по всему корпусу (взвешенная по длине строк) Более устойчива к дисбалансу длин строк; хороша для больших наборов
Macro-CER Macro-averaged CER Средняя ошибка символов по отдельным строкам (без взвешивания) Полезна для оценки стабильности модели на коротких фрагментах


💡

Эти метрики используются Tesseract при обучении LSTM-моделей и позволяют количественно оценить эффективность дообучения.
BCER и BWER показывают динамику улучшения модели в процессе обучения,
а CER, WER и Character Accuracy применяются для итоговой оценки точности распознавания на тестовых данных.


4.2 Пример динамики метрик в ходе дообучения

Этап BCER (символы) BWER (слова) Комментарий
Начальные итерации 28.153 % 54.500 % Модель ошибается примерно в каждом третьем символе и более чем в половине слов — типичный старт для новой модели
Промежуточный этап 19.643 % 41.000 % Модель начинает обучаться и постепенно сокращает число ошибок
Финальный этап 4.203 % 8.600 % Ошибка по символам уменьшилась почти в 7 раз; по словам — более чем в 6 раз
Итоговая оценка Micro-CER = 1.94 %
Macro-CER = 3.09 %
Character Accuracy = 98.06 %
Средняя точность распознавания символов превышает 98 %, что указывает на хорошее качество модели для рукописных и сложных OCR-задач


📈

Таким образом, модель показала значительное улучшение: с уровня 28 % ошибок по символам до около 4 %, что подтверждает эффективность обучения и корректность подготовленных данных.


4.3 Прогресс обучения по итерациям

  • Начальные итерации: BCER = 22.5–28.1 %, BWER = 41–54.5 %. Модель почти не распознавала тексты дореформенной орфографии, что ожидаемо для старта fine-tuning.
  • Средние чекпойнты: BCER = 4.2–5.4 %, BWER = 8.6–10.6 %. Ошибка существенно снизилась, сеть становится устойчивой и уверенной в распознавании.
  • Финальные итерации: BCER = 5.374 %, BWER = 10.65 %. Выбрана лучшая модель с минимальной ошибкой на тренировочных данных.


4.4 Метрики на валидационном наборе

Метрика Значение Описание
Micro-CER 1.94 % Средняя доля ошибочных символов по всему корпусу
Macro-CER 3.09 % Средняя доля ошибок по отдельным строкам
Character Accuracy 98.06 % Доля правильно распознанных символов
BCER (train, финал) 5.374 % Ошибка символов на тренировочном наборе
BWER (train, финал) 10.65 % Ошибка слов на тренировочном наборе


4.5 Интерпретация

  • Модель значительно улучшила распознавание по сравнению с начальным состоянием: ошибка символов снизилась почти в 4–5 раз, ошибка слов — более чем в 4 раза.
  • Micro-CER и Macro-CER подтверждают высокую точность на валидационном наборе, а Character Accuracy >98 % демонстрирует пригодность модели для практического использования.
  • Прогресс обучения показывает корректное fine-tuning, при котором модель адаптировалась к особенностям дореформенной орфографии, сохранив сильные стороны базовой модели rus.


4.6 Вывод

Модель orus.traineddata успешно дообучена и готова к применению для распознавания текстов газеты «Искра» (1900–1905) и других текстов в дореформенной орфографии.



5 Как использовать предобученную модель?

Если вы новичок в цифровых методах, чтобы начать работать в R установите R и RStudio, как указано в учебнике О.В. Алиевой Комьпьютерный анализ текста.



5.1 Подготовка


Для работы с tesseractпонадобяться следующие библиотеки:

library(tidyverse)
library(qpdf)
library(tesseract)
library(pdftools)
library(magick)


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

# --- Шаг 1: Определяем и сохраняем переменные для путей к данным
# и папки для сохранения результатов обработки. 
# У нас, например, изображения лежат в папке ["./Iskra_pics_forOCR"], 
# замените на ваши относительные или абсолютные пути к данным ---


# Путь до папки с изображениями для распознавания текста
input_dir <- "./Iskra_pics_forOCR"

# Путь дo папки, куда будут попадать предобраотанные изображения
processed_dir <- "./Iskra_processed_forOCR"

# Путь для папки c распознанными текстами
text_dir <- "./Iskra_text_forOCR"

# Создаем папки, если еще не было
if (!dir.exists(processed_dir)) dir.create(processed_dir)
if (!dir.exists(text_dir)) dir.create(text_dir)

# --- Список всех JPG. Собираем, проверяем ---
jpg_files <- list.files(input_dir, pattern = "jpg$", full.names = TRUE)
jpg_files



5.2 Установка модели

Скачайте нашу предобученную orus модель. Найдите системную папку Tesseract.

tesseract::tesseract_info()$datapath

[1] “/Users/anastasiabogdanova/Library/Application Support/tesseract5/tessdata/”



Скопируйте сюда новую модель orus.trainedata.

# --- Проверьте доступные модели ---

tesseract::tesseract_info()$available

[1] “eng” “orus” “osd” “rus” “snum”



Загрузим скачанную модель и распознаем тексты с ее помощью:

# --- Шаг 2: Загружаем нашу модель для Tesseract ---

orus <- tesseract("orus")
orus



5.3 Предпроцессинг и OCR.

Точность OCR зависит от качества исходного изображения. Часто можно улучшить результат, правильно масштабируя изображение, удаляя шум и артефакты или обрезая область, где находится текст. Отличный пакет {magick} содержит множество полезных функций для улучшения качества изображения. Что можно попробовать:

Если изображение наклонено, используйте image_deskew() и image_rotate(), чтобы выровнять текст по горизонтали. image_trim() обрезает поля с пробельными областями. Используйте image_convert() для преобразования изображения в градации серого. Для изменения размера используйте image_resize(). Функции image_modulate() или image_contrast() подходят для регулировки яркости/контраста. Попробуйте image_reducenoise() для автоматического удаления шума.

# --- Цикл обработки и OCR ---
for (jpg in jpg_files) {
  
  # Читаем изображение с высоким разрешением
  img <- image_read(jpg, density = "300x300")
  
  # --- Предобработка изображения ---
  img_processed <- img |>
   # image_deskew() |> #выравнивает, если изображение наклонено
    image_resize("1500x") |>       
    image_convert(colorspace = "gray") |> # перевод в черно-белое изображение
    image_trim(fuzz = 40)  |> # обрезает однотонные поля вокруг содержимого изображения
    image_modulate(brightness = 120, saturation = 0)  |> # меняет яркость и насыщенность
    image_contrast(sharpen = 1) |> # повышает контраст
    image_normalize() # выравнивает гистограмму — делает светлое светлее, тёмное темнее
  
   # --- Сохраняем обработанное изображение в PNG ---
  processed_name <- sub("\\.jpg$", "p.png", basename(jpg))  # теперь PNG
  processed_path <- file.path(processed_dir, processed_name)
  image_write(img_processed, path = processed_path, format = "png")
  
  # --- OCR на обработанном изображении ---
  text <- ocr(img_processed, engine = orus)
  
  # --- Сохраняем текст ---
  txt_name <- sub("\\.jpg$", ".txt", basename(jpg))
  txt_path <- file.path(text_dir, txt_name)
  writeLines(text, txt_path)
  
  cat("Обработано и распознано:", processed_name, "\n")
}

# --- Проверка ---
list.files(processed_dir)
list.files(text_dir)

Фрагмент оригинала газеты Рис. 3. Оригинальное изображение

Фрагмент оригинала газеты Рис. 4. После предобработки