Автоматична класифікація документів за типом: реалізація на ML

Реалізація автоматичної класифікації документів за типом

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1003

Реалізація автоматичної класифікації документів за типом

Класифікація документів — перший етап у Document Processing Pipeline. Перш ніж витягувати дані, система повинна зрозуміти, що за документ перед нею: рахунок-фактура, накладна, паспорт чи акт. Для кожного типу потрібен свій екстрактор, помилка на цьому етапі ламає весь ланцюжок. Ми реалізували мультимодальний класифікатор, який одночасно аналізує візуальні та текстові ознаки. Такий підхід дає точність до 97% на українських документах — це на 5–7% вище за чисто текстові рішення. Економія часу на ручному сортуванні сягає 80%. Зниження витрат на обробку документів — до 70%, середній термін окупності — 6–12 місяців.

У статті розберемо побудову системи класифікації, вибір моделі та типові помилки. Опишемо реальний кейс впровадження. Гарантуємо якість на кожному етапі — від розмітки до деплою.

Чому ми обрали мультимодальний підхід?

Чисто текстова класифікація на основі OCR дає точність 85–90%. Додавання візуальних ознак піднімає планку до 94–97%. Це критично для документів з однаковим текстом, але різним оформленням. Наприклад, рахунок від банку та рахунок від постачальника виглядають по-різному, хоча містять схожі поля. Візуальний аналізатор вловлює розташування логотипу, таблиці, кольорові блоки. Мультимодальний підхід LayoutLMv3: Multi-modal Pre-training в 1.5 рази точніший на складних документах.

Мультимодальна класифікація

Найкращий підхід — одночасно використовувати візуальні та текстові ознаки. Нижче — приклад на базі LayoutLMv3:

from transformers import LayoutLMv3ForSequenceClassification, LayoutLMv3Processor import torch import torch.nn as nn class DocumentClassifier: def __init__(self, model_path: str, doc_types: list[str]): self.processor = LayoutLMv3Processor.from_pretrained(model_path) self.model = LayoutLMv3ForSequenceClassification.from_pretrained( model_path, num_labels=len(doc_types) ) self.doc_types = doc_types self.model.eval() @torch.no_grad() def classify(self, image_path: str) -> dict: from PIL import Image image = Image.open(image_path).convert('RGB') encoding = self.processor( image, return_tensors='pt', truncation=True, max_length=512 ) outputs = self.model(**encoding) probs = torch.softmax(outputs.logits, dim=-1).squeeze() top_idx = probs.argmax().item() return { 'document_type': self.doc_types[top_idx], 'confidence': float(probs[top_idx]), 'all_scores': { self.doc_types[i]: float(probs[i]) for i in range(len(self.doc_types)) } } 

Навчання без LayoutLM: EfficientNet + BERT

Для швидкого прототипу без доступу до великих моделей використовуємо комбінацію EfficientNet (візуальний енкодер) та RuBERT (текстовий). Цей підхід дає 91–94% точності на 15 класах — поступається LayoutLMv3, але потребує на порядок менше ресурсів. Код легко адаптувати:

import timm from transformers import AutoTokenizer, AutoModel class LightweightDocClassifier(nn.Module): def __init__(self, num_classes: int): super().__init__() # Visual encoder self.visual = timm.create_model('efficientnet_b2', pretrained=True, num_classes=0) # Text encoder self.text_encoder = AutoModel.from_pretrained('DeepPavlov/rubert-base-cased') self.tokenizer = AutoTokenizer.from_pretrained('DeepPavlov/rubert-base-cased') # Fusion vis_dim = self.visual.num_features # 1408 text_dim = 768 self.fusion = nn.Sequential( nn.Linear(vis_dim + text_dim, 512), nn.GELU(), nn.Dropout(0.3), nn.Linear(512, num_classes) ) def forward(self, image_tensor, input_ids, attention_mask): vis_features = self.visual(image_tensor) text_out = self.text_encoder(input_ids, attention_mask) text_features = text_out.pooler_output # [CLS] token combined = torch.cat([vis_features, text_features], dim=-1) return self.fusion(combined) 

Типові класи документів

Домен Класи документів
Бухгалтерія Рахунок, накладна, акт, рахунок-фактура, договір, довіреність
KYC/AML Паспорт, ІПН, РНОКПП, права, закордонний паспорт
Медицина Направлення, рецепт, виписка, результат аналізу
Юриспруденція Позовна заява, рішення суду, договір, довіреність
Логістика Накладна, CMR, митна декларація, коносамент

Колекція ознак для класифікації

Для підвищення точності додаємо структурні та текстові ознаки. Вони особливо корисні для розділення схожих типів, наприклад рахунок vs рахунок-фактура:

def extract_document_features(image_path: str, ocr_text: str) -> dict: return { # Структурні ознаки 'has_table': detect_tables(image_path), 'has_signature': detect_signature_zone(image_path), 'has_stamp': detect_stamp(image_path), 'has_photo': detect_person_photo(image_path), # Текстові патерни (регулярні вирази) 'has_inn': bool(re.search(r'\bІПН\b', ocr_text)), 'has_kpp': bool(re.search(r'\bКПП\b', ocr_text)), 'has_passport_series': bool(re.search(r'\d{4}\s\d{6}', ocr_text)), 'has_invoice_number': bool(re.search(r'№\s*\d+', ocr_text)), # Метадані 'aspect_ratio': get_aspect_ratio(image_path), 'orientation': detect_orientation(image_path), } 

Як впровадити класифікацію за 5 кроків?

Процес впровадження розбитий на чіткі етапи:

  1. Аналіз документообігу — вивчаємо типи документів, їх обсяг, джерела надходження, поточні помилки.
  2. Збір та розмітка датасету — збираємо від 2000 зразків на клас, розмічаємо тип. Використовуємо активне навчання для зниження витрат.
  3. Вибір та навчання моделі — на основі аналізу обираємо LayoutLMv3 або EfficientNet+RuBERT.
  4. Валідація та тестування — перевіряємо на реальних сканах, вимірюємо Top-1 Accuracy та Macro F1.
  5. Інтеграція та деплой — пакуємо модель у REST API, надаємо документацію.
Метрики на українських документах

Типова точність на корпусі українських документів (25 класів):

Метрика Значення
Top-1 Accuracy 94–97%
Macro F1 92–96%
Recall на рідкісних класах 85–91%

Складні випадки: документи одного типу в різних форматах, погана якість сканів, ламіновані документи. Використовуємо аугментацію та ансамбль моделей — приріст Recall 3–5%.

Реальний кейс: логістична компанія

До нас звернулася логістична компанія з проблемою: 40% документів (накладні, CMR, митні декларації) надходили в неправильні папки через ручну сортування. Ми впровадили мультимодальний класифікатор на базі LayoutLMv3. Результати:

  • Точність класифікації зросла з 82% до 96%.
  • Час обробки одного документа скоротився з 8 секунд до 1.2 секунди.
  • Помилки сортування зменшилися на 80%.
  • Компанія заощадила 70% витрат на обробку документів протягом 8 місяців після впровадження.

Типові помилки при класифікації

  • Ігнорування мультимодальності — чистий текст дає низьку точність на візуально схожих документах.
  • Маленька навчальна вибірка — менше 500 зразків на клас веде до перенавчання.
  • Відсутність аугментації — модель не узагальнює на повернуті або засвічені скани.

Також часта проблема — неврахування нових класів. Ми вбудовуємо механізм metric learning для додавання класів без перенавчання.

Що входить у нашу роботу?

Ми пропонуємо впровадження під ключ:

  • Аналіз документообігу та виділення типів документів.
  • Збір та розмітка датасету (від 2000 зразків на клас).
  • Вибір та навчання моделі (LayoutLMv3 / EfficientNet+RuBERT).
  • Валідація та тестування на реальних сканах.
  • Інтеграція через REST API (документація, приклади коду).
  • Навчання операторів та супровід 3 місяці.

Ми спеціалізуємося на NLP та Computer Vision більше 7 років, виконали 15+ проектів для банків, страхових та логістичних компаній. Наші моделі сертифіковані на українських документах. LayoutLMv3: Multi-modal Pre-training — основа багатьох рішень.

Отримайте консультацію щодо вашого документообігу. Зв'яжіться з нами — оцінимо проект за 2 дні. Для типового проекту (5–10 класів) результат через 2–3 тижні. Замовте пілотний проект і переконайтеся в точності класифікації.