Обработка естественного языка
Named Entity Recognition
Bloomberg обрабатывает 5000 финансовых новостей в час. Из каждой нужно извлечь: компании (Apple, Tesla), их тикеры ($AAPL), упомянутые суммы ($2.3B deal), даты (Q3 2024), персоны (CEO Тим Кук). Это NER. Без него - текст. С ним - структурированные данные для торговых систем, обновляющихся в реальном времени.
- **Bloomberg Terminal NLP**: собственный NER для финансовых сущностей. Распознаёт тысячи компаний, финансовых инструментов, персоналий. Ценовые движения коррелируют с NER-извлечёнными событиями из новостей.
- **Epic Systems (медицинские записи)**: NER для клинической документации. Находит лекарства, дозировки, диагнозы, процедуры. BioBERT-based модели показывают 90%+ F1 на стандартных медицинских benchmark.
- **Amazon Alexa**: NER для разбора команд - 'закажи пиццу в Додо по адресу Тверская 5'. Выделяет: продукт (пицца), компанию (Додо), адрес (Тверская 5). Structured слот-filling поверх NER.
Предварительные знания
- Токенизация и базовый NLP-пайплайн
- Классификация на уровне токенов и понятие разметки последовательностей
- Эмбеддинги слов как входные признаки для моделей
От MUC и CoNLL до BiLSTM-CRF
Распознавание именованных сущностей оформилось как задача на конференциях Message Understanding Conference (MUC) в 1990-х годах, где впервые ввели стандартные категории вроде персон, организаций и локаций. Общая дорожка CoNLL-2003 задала эталонный набор данных и метрики, на которых годами мерили прогресс. В 2001 году Джон Лафферти, Эндрю Маккаллум и Фернандо Перейра предложили условные случайные поля (CRF): модель размечала всю последовательность токенов целиком, учитывая связи между соседними метками, и стала стандартом для NER. В 2015 году Чжихэн Хуан с соавторами объединил двунаправленную LSTM с CRF-слоем: BiLSTM читала контекст слева и справа, а CRF обеспечивал согласованность меток. Эта архитектура задала шаблон для нейросетевого NER вплоть до прихода трансформеров.
NER как задача sequence labeling
**Named Entity Recognition (NER)** - задача присвоения каждому токену тега из заданного набора. Цель: найти именованные сущности - персоны (PER), организации (ORG), локации (LOC), даты (DATE), суммы денег (MONEY) и другие. Применение: извлечение структурированных данных из неструктурированного текста.
**Область применения**: финансовые системы извлекают компании и суммы из новостей для торговых сигналов. Медицинские NLP системы находят лекарства, симптомы, диагнозы в клинических записях. Юридические tech компании извлекают стороны договора, даты, суммы. NER - фундамент Information Extraction.
NER относится к sequence labeling, а не к text classification. Ключевое отличие:
CRF: учёт зависимостей между тегами
**Conditional Random Field (CRF)** - статистическая модель для sequence labeling учитывающая зависимости между соседними метками. Без CRF классификатор присваивает теги независимо. С CRF: если токен помечен как B-PER (начало персоны), следующий скорее I-PER чем B-ORG. Это ограничение улучшает качество.
**CRF в 2024**: современные большие трансформеры часто работают без CRF - они сами учат transition constraints через attention. Но BERT-CRF на малых датасетах (<10K примеров) стабильно лучше BERT-softmax. spaCy 3 использует transition-based NER без явного CRF.
Чем CRF помогает в NER по сравнению с обычным softmax classifer?
BIO схема: начало, внутри, за пределами
**BIO теггинг** - стандарт кодирования именованных сущностей в последовательности токенов: **B** (Beginning) - начало сущности, **I** (Inside) - внутри сущности, **O** (Outside) - не сущность. Каждый тег комбинируется с типом: B-PER, I-PER, B-ORG, I-ORG и т.д.
**Проблема tokenization**: BERT делит слова на subwords. 'Apple' -> ['App', '##le']. Тег B-ORG для 'Apple' нужно назначить только первому sub-token ('App'), '##le' помечается X (ignored). При извлечении предсказаний нужно собирать теги только для first-sub-tokens.
Текст: 'John Smith работает в Google'. BERT tokenizer разбивает 'Smith' на ['Sm', '##ith']. Как правильно назначить теги?
spaCy: production NLP pipeline
**spaCy** - production NLP библиотека с акцентом на скорость и удобство. Полный pipeline: tokenization -> POS tagging -> dependency parsing -> NER -> lemmatization. Включает предобученные модели для 20+ языков. Используется в Prodigy (аннотация), Explosion AI products, многих NLP стартапах.
**spaCy vs Hugging Face Transformers для NER**: spaCy - production ready с полным NLP pipeline, версионирование моделей, быстрый inference. HuggingFace - лучшие pre-trained модели (BERT, RoBERTa), больше гибкости. spaCy 3 поддерживает HuggingFace models через `spacy-transformers` - лучшее из обоих миров.
NER - это просто поиск слов по словарю медицинских терминов
NER учитывает контекст: 'Mercury' может быть планетой, компанией или химическим элементом. Словарь не различает - модель на BERT - различает
Контекстное разрешение неоднозначности (disambiguation) - ключевая возможность нейронных NER моделей. 'Apple' в финансовом контексте - компания. В кулинарном - фрукт. BERT видит контекст, словарь - нет.
Для медицинского NER нужно извлекать лекарства, болезни, дозировки. Какой подход для production?
Ключевые идеи
- **NER = sequence labeling**: тег каждому токену, а не всему тексту. Требует специальной output головы по сравнению с text classification.
- **BIO схема**: B-TYPE (начало), I-TYPE (продолжение), O (вне сущности). BILOU добавляет L и U для точности границ. Subword токены - только первый получает тег.
- **CRF**: моделирует вероятность последовательности тегов, штрафует невалидные переходы (O->I-PER). На малых данных BERT+CRF лучше BERT+softmax.
- **spaCy**: production NLP pipeline для full NLP stack. spacy-transformers интегрирует HuggingFace модели. Стандарт для NLP в industry.
- **Domain adaptation**: общие NER модели не знают domain-specific сущностей. Fine-tuning на медицинских (BioBERT) или финансовых данных обязателен.
Связанные темы
NER - фундамент систем извлечения информации:
- Information Extraction — NER - первый шаг IE: сначала находим сущности, потом отношения между ними
- Классификация текста — Обе задачи используют BERT, но с разными output головами: softmax на [CLS] vs linear layer на каждом токене
Вопросы для размышления
- Медицинский NER должен найти 'Аспирин 500мг три раза в день'. 'Аспирин' - DRUG, '500мг' - DOSE, 'три раза в день' - FREQUENCY. Как спроектировать BIO схему для этих трёх типов?
- NER модель хорошо работает на English, но нужно перенести на казахский с минимальным количеством размеченных данных. Какие стратегии применить?
- Из 10 000 финансовых новостей NER извлекает компании, но с ошибками. Precision 90%, recall 85%. Что важнее для downstream задачи (торговые сигналы) и почему?
Связанные уроки
- nlp-12 — Дообученный BERT с токен-головой вытеснил BiLSTM-CRF
- nlp-20 — NER - первый этап конвейеров извлечения информации
- nlp-07 — NER - классификация на уровне токенов против уровня документа
- prob-09-discrete-dist — CRF моделирует совместное распределение по последовательностям тегов
- cv-10 — Детекция объектов размечает области изображения как NER - спаны
- ml-01-intro