До этого момента мы научились превращать слова в числа, числа – в векторы, а векторы – в осмысленные пространства. Теперь сделаем следующий шаг.
Представим текст:
"Apple bought a startup in London for $3 million."
Человек мгновенно видит структуру:
$3 million – денежная сумма
Модель же видит последовательность токенов. Задача NER – научить модель выделять сущности внутри текста.
Это уже не просто классификация текста.
Это классификация каждого токена в последовательности.
Что такое NER математически
Пусть текст – это последовательность токенов:
x=(x1,x2,...,xn) Наша цель – предсказать последовательность меток:
y=(y1,y2,...,yn) Каждый yi – класс токена:
Модель оценивает:
P(y1,y2,...,yn∣x1,...,xn) В простейшем варианте – независимо по каждому токену:
P(yi∣x) Но уже видно проблему: метка токена зависит от контекста.
Слово "Apple" может быть:
Контекст решает всё.
Почему Bag of Words здесь не работает
Bag of Words уничтожает порядок слов.
NER же – это задача, где порядок критичен.
Фраза:
"Bank of America"
Если смотреть на слова по отдельности,
"Bank" – это организация,
"America" – география.
Но вместе – это одна сущность ORG.
Поэтому NER требует моделей, которые учитывают последовательность: RNN, LSTM, Transformers. Сегодня – чаще всего Transformers.
Чтобы модель понимала границы сущностей, используется схема BIO:
B-XXX (Beginning) – начало сущности
I-XXX (Inside) – продолжение
O (Outside) – вне сущности
Пример:
Это уже не просто классификация. Это sequence labeling.
Sequence labeling как вероятностная задача
Наивный подход:
yi=argkmaxP(yi=k∣x) Но тогда возможны нелепые последовательности:
Поэтому продвинутые модели (например, CRF) учитывают:
P(yi∣yi−1,x) Это добавляет структуру в предсказание.
Трансформеры часто комбинируют:
Архитектура современной NER-модели
Схема:
Трансформер → контекстуальные векторы
Softmax → вероятности классов
logitsi=Whi+b и
P(yi)=softmax(logitsi) Где hi – контекстный вектор токена.
Практический кейс – NER на PHP
Представим задачу.
Вы пишете CRM для юристов.
Нужно автоматически извлекать из договоров:
Вместо регулярных выражений – используем модель NER.
Мы не обучаем модель.
Мы делаем inference через готовую модель.
Допустим, используем REST API модели NER.
Пример PHP-кода (через HTTP API)
Пример ответа API:
Постобработка BIO-тегов
Если API возвращает токен-level BIO, нужно собрать сущности:
Это превращает sequence labeling в структурированные данные.
До трансформеров:
LSTM учитывали контекст, но плохо масштабировались
дальние зависимости обрабатывались тяжело
С трансформерами:
Self-attention позволяет каждому токену смотреть на все остальные:
Attention(Q,K,V)=softmax(dQKT)V Это означает:
Слово "Apple" может смотреть на "bought" и понять – это компания, а не фрукт.
Где NER полезен в реальном PHP-проекте
NER – это не академическая игрушка.
Это:
автоматическая обработка договоров
финтех (извлечение сумм и дат)
построение knowledge graph
NER – это переход от текста к структуре.
Важно понимать:
модель не "понимает" текст
она оптимизирует вероятности
редкие сущности могут пропускаться
доменная адаптация часто нужна
Для юридического текста – лучше дообучать модель.
Главное понимание
NER – это первый момент в книге, где мы видим:
AI не просто классифицирует
AI структурирует хаос текста
С математической точки зрения: мы предсказываем последовательность меток.
С инженерной точки зрения: мы превращаем строку в данные.
И именно в этом – огромная ценность для PHP-разработчика.