Корректоры

Символьный корректор текста для постобработки результатов OCR.

CharLM

class manuscript.correctors.CharLM(weights=None, vocab=None, lexicon=None, device=None, mask_threshold=0.05, apply_threshold=0.95, max_edits=2, min_word_len=4, max_len=32, **kwargs)[исходный код]

Базовые классы: BaseModel

Символьная языковая модель-корректор на базе ONNX Runtime.

CharLM использует маскированную языковую модель на основе Transformer для исправления OCR-ошибок на уровне символов. Анализирует уверенность в символах и применяет исправления на основе выученных шаблонов замен.

Параметры:
  • weights (str or Path, optional) – Путь или идентификатор для весов модели ONNX. Поддерживает: локальный путь, HTTP/HTTPS URL, GitHub release, Google Drive, имя пресета ("prereform_charlm_g1" или "modern_charlm_g1"), None — автозагрузка пресета по умолчанию (prereform_charlm_g1)

  • vocab (str or Path, optional) – Путь к JSON-файлу словаря. Если None, определяется из расположения весов.

  • lexicon (str, Path, or set, optional) – Список слов для валидации по словарю. Поддерживает: локальный путь, имя пресета ("prereform_words" или "modern_words"), Python set, None — автозагрузка лексикона для пресета модели (prereform_words для prereform_charlm_g1, modern_words для modern_charlm_g1)

  • device ({"cuda", "cpu"}, optional) – Вычислительное устройство. По умолчанию определяется автоматически.

  • mask_threshold (float, optional) – Порог уверенности, ниже которого символы рассматриваются для исправления. По умолчанию 0.05.

  • apply_threshold (float, optional) – Минимальная уверенность модели для применения исправления. По умолчанию 0.95.

  • max_edits (int, optional) – Максимальное количество правок на слово. По умолчанию 2.

  • min_word_len (int, optional) – Минимальная длина слова для попытки исправления. По умолчанию 4.

  • **kwargs – Дополнительные опции конфигурации.

  • max_len (int)

Примеры

>>> from manuscript.correctors import CharLM
>>> corrector = CharLM()
>>> corrected_page = corrector.predict(page)

Методы

__call__(*args, **kwargs)

Вызов объекта как функции.

export(weights_path, vocab_path, output_path)

Экспорт модели CharLM из PyTorch в формат ONNX.

predict(page)

Применить символьное исправление к странице Page.

runtime_providers()

Получить провайдеры выполнения ONNX Runtime в зависимости от устройства.

train([words_path, text_path, pairs_path, ...])

Обучить символьную языковую модель CharLM.

default_weights_name: Optional[str] = 'prereform_charlm_g1'
pretrained_registry: Dict[str, str] = {'modern_charlm_g1': 'https://github.com/konstantinkozhin/manuscript-ocr/releases/download/v0.1.0/modern_charlm_g1.onnx', 'prereform_charlm_g1': 'https://github.com/konstantinkozhin/manuscript-ocr/releases/download/v0.1.0/prereform_charlm_g1.onnx'}
vocab_registry = {'modern_charlm_g1': 'https://github.com/konstantinkozhin/manuscript-ocr/releases/download/v0.1.0/modern_charlm_g1.json', 'prereform_charlm_g1': 'https://github.com/konstantinkozhin/manuscript-ocr/releases/download/v0.1.0/prereform_charlm_g1.json'}
lexicon_registry = {'modern_words': 'https://github.com/konstantinkozhin/manuscript-ocr/releases/download/v0.1.0/modern_words.txt', 'prereform_words': 'https://github.com/konstantinkozhin/manuscript-ocr/releases/download/v0.1.0/prereform_words.txt'}
default_lexicon_for_model = {'modern_charlm_g1': 'modern_words', 'prereform_charlm_g1': 'prereform_words'}
__init__(weights=None, vocab=None, lexicon=None, device=None, mask_threshold=0.05, apply_threshold=0.95, max_edits=2, min_word_len=4, max_len=32, **kwargs)[исходный код]
Параметры:
predict(page)[исходный код]

Применить символьное исправление к странице Page.

Параметры:

page (Page) – Входной объект Page с распознанным текстом.

Результат:

Исправленный объект Page с обновлёнными текстами слов.

Тип результата:

Page

static train(words_path=None, text_path=None, pairs_path=None, charset_path=None, *, exp_dir='exp_charlm', max_words=1500000, max_pairs_edits=3, max_len=32, emb_size=192, n_layers=8, n_heads=6, ffn_size=1024, dropout=0.1, batch_size=256, accumulation_steps=2, use_amp=True, compile_model=False, epochs=50, lr=0.001, weight_decay=0.01, grad_clip=1.0, min_len=3, mask_prob=0.3, span_min=1, span_max=3, spans_min=1, spans_max=2, pairs_ratio=0.8, eval_ratio=0.01, seed=42, checkpoint=None, **extra_config)[исходный код]

Обучить символьную языковую модель CharLM.

Параметры:
  • words_path (str or Path, optional) – Путь к файлу слов (одно слово на строку).

  • text_path (str or Path, optional) – Путь к текстовому файлу для n-граммового датасета.

  • pairs_path (str or Path, optional) – Путь к CSV-файлу с парами неправильный/правильный.

  • charset_path (str or Path) – Путь к файлу набора символов (допустимые символы).

  • exp_dir (str, optional) – Директория эксперимента. По умолчанию «exp_charlm».

  • max_words (int, optional) – Максимальное количество слов из файла. По умолчанию 1_500_000.

  • max_pairs_edits (int, optional) – Максимальное количество символьных правок в парах. По умолчанию 3.

  • max_len (int, optional) – Максимальная длина последовательности. По умолчанию 32.

  • emb_size (int, optional) – Размер эмбеддингов. По умолчанию 192.

  • n_layers (int, optional) – Количество слоёв трансформера. По умолчанию 8.

  • n_heads (int, optional) – Количество голов внимания. По умолчанию 6.

  • ffn_size (int, optional) – Размер feed-forward сети. По умолчанию 1024.

  • dropout (float, optional) – Коэффициент dropout. По умолчанию 0.1.

  • batch_size (int, optional) – Размер батча. По умолчанию 256.

  • accumulation_steps (int, optional) – Шаги накопления градиента. По умолчанию 2.

  • use_amp (bool, optional) – Использовать автоматическую смешанную точность (AMP). По умолчанию True.

  • compile_model (bool, optional) – Использовать torch.compile для ускорения обучения. По умолчанию False.

  • epochs (int, optional) – Количество эпох. По умолчанию 50.

  • lr (float, optional) – Скорость обучения. По умолчанию 1e-3.

  • weight_decay (float, optional) – Затухание весов. По умолчанию 0.01.

  • grad_clip (float, optional) – Отсечение градиента. По умолчанию 1.0.

  • min_len (int, optional) – Минимальная длина слова. По умолчанию 3.

  • mask_prob (float, optional) – Вероятность использования span masking. По умолчанию 0.3.

  • span_min (int, optional) – Минимальная длина span для маскирования. По умолчанию 1.

  • span_max (int, optional) – Максимальная длина span для маскирования. По умолчанию 3.

  • spans_min (int, optional) – Минимальное количество span. По умолчанию 1.

  • spans_max (int, optional) – Максимальное количество span. По умолчанию 2.

  • pairs_ratio (float, optional) – Соотношение OCR-пар в смешанном датасете (0.8 = 80% пар, 20% n-грамм). По умолчанию 0.8.

  • eval_ratio (float, optional) – Доля валидационного набора. По умолчанию 0.01.

  • seed (int, optional) – Случайное зерно. По умолчанию 42.

  • checkpoint (str, optional) – Путь к чекпоинту для продолжения обучения.

  • **extra_config – Дополнительные опции конфигурации.

Результат:

Путь к финальному чекпоинту.

Тип результата:

str

static export(weights_path, vocab_path, output_path, max_len=32, emb_size=192, n_layers=8, n_heads=6, ffn_size=1024, opset_version=14, simplify=True)[исходный код]

Экспорт модели CharLM из PyTorch в формат ONNX.

Параметры:
  • weights_path (str or Path) – Путь к чекпоинту PyTorch (.pt файл).

  • vocab_path (str or Path) – Путь к JSON-файлу словаря.

  • output_path (str or Path) – Путь для сохранения модели ONNX.

  • max_len (int, optional) – Максимальная длина последовательности. По умолчанию 32.

  • emb_size (int, optional) – Размер эмбеддингов. По умолчанию 192.

  • n_layers (int, optional) – Количество слоёв трансформера. По умолчанию 8.

  • n_heads (int, optional) – Количество голов внимания. По умолчанию 6.

  • ffn_size (int, optional) – Размер feed-forward сети. По умолчанию 1024.

  • opset_version (int, optional) – Версия opset ONNX. По умолчанию 14.

  • simplify (bool, optional) – Применить упрощение ONNX. По умолчанию True.

Тип результата:

None

Обзор

CharLM — это символьный корректор на основе маскированной языковой модели, использующий архитектуру Transformer для исправления OCR-ошибок. Анализирует контекст на уровне символов и применяет исправления на основе выученных паттернов.

Ключевые возможности:

  • Исправление на символьном уровне на основе Transformer

  • Настраиваемые пороги уверенности

  • Поддержка пользовательских словарей и лексиконов

  • Инференс через ONNX Runtime для быстрого исправления

  • Опциональная фильтрация лексиконом для сохранения известных слов

Доступные пресеты

Доступны следующие предобученные модели:

Имя пресета

Описание

prereform_charlm_g1

Дореформенный русский текст (по умолчанию)

modern_charlm_g1

Современный русский текст

Быстрый пример

Используйте create_page_from_text для быстрой проверки исправления текста:

from manuscript.utils import create_page_from_text
from manuscript.correctors import CharLM

# Create page from text with potential OCR errors
page = create_page_from_text(["Привѣтъ міръ", "Тестовая строка"])

# Apply correction (using default prereform model)
corrector = CharLM()
corrected = corrector.predict(page)

# Extract corrected text
for line in corrected.blocks[0].lines:
    text = " ".join(w.text for w in line.words)
    print(text)

Базовое использование

from manuscript import Pipeline
from manuscript.correctors import CharLM

# Create corrector with default preset
corrector = CharLM()

# Create corrector with specific preset
corrector = CharLM(weights="modern_charlm_g1")

# Use in pipeline
pipeline = Pipeline(corrector=corrector)
result = pipeline.predict("document.jpg")

Расширенная конфигурация

from manuscript.correctors import CharLM

# Fine-tune correction behavior
corrector = CharLM(
    weights="prereform_charlm_g1",
    mask_threshold=0.05,      # Characters with confidence below this are corrected
    apply_threshold=0.95,     # Model must be this confident to apply correction
    max_edits=2,              # Maximum edits per word
    min_word_len=4,           # Minimum word length to attempt correction
    device="cuda"             # Use GPU for inference
)

Использование пользовательского лексикона

Вы можете предоставить лексикон (список слов) для предотвращения исправления известных слов:

from manuscript.correctors import CharLM

# From preset
corrector = CharLM(
    weights="prereform_charlm_g1",
    lexicon="prereform_words"  # Use preset lexicon
)

# From file
corrector = CharLM(
    weights="prereform_charlm_g1",
    lexicon="path/to/words.txt"
)

# From set
my_words = {"слово1", "слово2", "слово3"}
corrector = CharLM(
    weights="prereform_charlm_g1",
    lexicon=my_words
)

Обучение пользовательской модели

Вы можете обучить CharLM на своих данных:

from manuscript.correctors import CharLM

# Train with OCR pairs dataset
checkpoint_path = CharLM.train(
    pairs_path="ocr_pairs.csv",      # CSV with incorrect,correct columns
    charset_path="charset.txt",       # Allowed characters
    exp_dir="my_charlm_exp",
    epochs=50,
    batch_size=256,
)

# Train with word list (self-supervised)
checkpoint_path = CharLM.train(
    words_path="words.txt",           # One word per line
    charset_path="charset.txt",
    exp_dir="my_charlm_exp",
)

Экспорт в ONNX

from manuscript.correctors import CharLM

# Export trained model to ONNX
CharLM.export(
    weights_path="exp/checkpoints/charlm_epoch_50.pt",
    vocab_path="exp/vocab.json",
    output_path="my_model.onnx",
)