Реалізація AI-вилучення сутностей з тексту (NER) у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація AI-вилучення сутностей з тексту (NER) у мобільному додатку
Середній
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

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

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація AI-вилучення сутностей з тексту (NER) в мобільному додатку

NER (Named Entity Recognition) — це вилучення структурованих даних з неструктурованого тексту. Користувач вводить «доставити завтра о 18:00 по вулиці Леніна 5, квартира 12» — NER вилучає дату, час, адресу та квартиру як окремі поля. Без NER це або ручний введення в 5 полів, або крихкий regex, який ломиться на першому нестандартному форматі.

Де NER використовується в мобільних додатках

Розумні форми та автозаповнення. Користувач пише повідомлення кур'єру — додаток парсить адресу та час доставки без окремих полів форми.

Пошук з фільтрами. «iPhone 15 Pro 256GB чорний» → {бренд: Apple, модель: iPhone 15 Pro, об'єм: 256GB, колір: чорний}. Структурований запит точніше за повнотекстовий пошук.

Чат-боти та голосові асистенти. Екстракція параметрів зі вільної мови або тексту для заповнення слотів діалогу.

Обробка чеків та документів. OCR-текст з чека → {магазин, сума, дата, позиції}.

Технічні підходи

spaCy + кастомна NER-модель

spaCy — стандарт для production NER. Для англійської мови базова модель en_core_web_lg розпізнає персон, організації, локації, дати. Для доменно-специфічних сутностей (розміри одягу, артикули товарів, медичні терміни) потрібне дообучення.

import spacy
from spacy.training import Example

# Завантаження базової англійської моделі
nlp = spacy.load("en_core_web_lg")

# Додавання кастомних типів сутностей
ner = nlp.get_pipe("ner")
ner.add_label("PRODUCT_SIZE")  # "42", "XL", "M/L"
ner.add_label("PRODUCT_COLOR")  # "чорний", "navy blue"
ner.add_label("ARTICLE")        # "арт. 12345", "SKU-ABC"

# Приклад навчання
TRAIN_DATA = [
    ("Хочу знайти кросівки розмір 42 у синьому кольорі артикул 98765",
     {"entities": [(33, 35, "PRODUCT_SIZE"), (43, 49, "PRODUCT_COLOR"), (59, 64, "ARTICLE")]}),
]

# Навчання на кастомних даних
optimizer = nlp.resume_training()
for text, annotations in TRAIN_DATA:
    doc = nlp.make_doc(text)
    example = Example.from_dict(doc, annotations)
    nlp.update([example], sgd=optimizer)

Трансформерна NER через Hugging Face

Для високої точності на складних доменах: дообучений bert-base-uncased з NER head. Працює повільніше за spaCy (50–200 мс vs 5–20 мс), але краще обробляє складні контексти та довгі сутності.

from transformers import pipeline

ner_pipeline = pipeline(
    "token-classification",
    model="bert-base-cased",
    aggregation_strategy="simple"  # об'єднує B- та I- токени в одну сутність
)

def extract_entities(text: str) -> list[Entity]:
    raw_entities = ner_pipeline(text)
    return [
        Entity(
            text=e["word"],
            label=e["entity_group"],
            confidence=e["score"],
            start=e["start"],
            end=e["end"]
        )
        for e in raw_entities
        if e["score"] > 0.7
    ]

Regex + NER: гібрид для структурованих доменів

Для типізованих сутностей із передбачуваним форматом regex надійніше за ML. Телефони, email, артикули, дати у конкретному форматі — regex. Організації, локації, вільні описи — NER. Гібрид працює краще за кожен підхід окремо.

import re
from typing import NamedTuple

class EntityExtractor:
    PHONE_PATTERN = re.compile(r'(?:\+7|8)[\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}')
    EMAIL_PATTERN = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')
    DATE_PATTERN = re.compile(r'\b(\d{1,2})[./](\d{1,2})(?:[./](\d{2,4}))?\b')

    def extract_all(self, text: str) -> dict:
        # Regex для структурованих форматів
        phones = self.PHONE_PATTERN.findall(text)
        emails = self.EMAIL_PATTERN.findall(text)

        # NER для вільних сутностей
        ner_entities = extract_entities(text)
        locations = [e.text for e in ner_entities if e.label in ("LOC", "GPE")]
        persons = [e.text for e in ner_entities if e.label == "PER"]

        return {
            "phones": phones,
            "emails": emails,
            "locations": locations,
            "persons": persons
        }

Мобільна інтеграція

iOS: NER для розумного заповнення форми

// iOS: NER через серверний API із автозаповненням форми
class AddressFormViewModel: ObservableObject {
    @Published var street = ""
    @Published var building = ""
    @Published var apartment = ""
    @Published var deliveryTime = ""

    func parseFromText(_ userText: String) {
        Task {
            let entities = try await nerApi.extract(text: userText)

            await MainActor.run {
                if let address = entities.first(where: { $0.label == "ADDRESS" }) {
                    parseAddressComponents(address.text)
                }
                if let time = entities.first(where: { $0.label == "TIME" }) {
                    deliveryTime = time.text
                }
            }
        }
    }
}

On-device NER через CoreNLP або TFLite

Для простих доменних сутностей (артикули, розміри, кольори у каталозі конкретного магазину) можна розгорнути компактну TFLite NER-модель (< 20 МБ) прямо на пристрої. Це знімає latency та працює офлайн.

Apple NaturalLanguage.framework з NLTagger вміє базові типи сутностей з коробки: імена, організації, місця — без зовнішніх залежностей:

let tagger = NLTagger(tagSchemes: [.nameType])
tagger.string = userInput

tagger.enumerateTags(in: userInput.startIndex..<userInput.endIndex,
                     unit: .word,
                     scheme: .nameType,
                     options: [.omitWhitespace]) { tag, range in
    if let tag = tag {
        print("Entity: \(userInput[range]), type: \(tag.rawValue)")
    }
    return true
}

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

Процес роботи

Визначення цільових типів сутностей під домен додатка.

Збір та розмітка навчальних даних у BIO-форматі.

Вибір між spaCy, трансформерною моделлю та regex-гібридом.

Інтеграція NER API в мобільний клієнт: розумні форми, пошук, діалог.

Орієнтири за часом

Базова NER з готовою англійською моделлю + API — 3–5 днів. Дообучення на кастомних доменних сутностях — 1–2 тижні. Повна інтеграція в мобільний UI з розумним заповненням форм — 2–3 тижні.