Анализ тональности и извлечение именованных сущностей (NER) на русском языке работают, если заранее определены три вещи: к чему относится тональность, что считается сущностью и как проверяется результат на ваших текстах. Без этого модель выдаёт уверенные ответы, которые нельзя ни подтвердить, ни оспорить: «негатив» без ответа на вопрос «о чём» и «организация» без границ названия.

Подводные камни делятся на языковые (падежи, словоформы, сокращения, опечатки), смысловые (сарказм, отрицание, сравнение), организационные (инструкция разметки, согласованность людей) и измерительные (метрики, которые скрывают ошибки). Услуга описана на странице «Разработка NLP-решений на заказ», здесь только то, что стоит учесть до заказа.

Коротко. Прежде чем выбирать модель, зафиксируйте, о чём тональность (аспекты), и напишите инструкцию разметки с примерами. Измеряйте качество по классам и по типам сущностей на выборке своих текстов, а не общей точностью. Для данных ограниченного доступа модели запускают на своих серверах.

Что именно мы определяем: задачи и результаты

Слово «NLP» прячет разные задачи, и у каждой свой вход, выход и цена ошибки.

ЗадачаЧто на входеЧто на выходеДля чего нужна
Тональность текстаОтзыв, обращение, письмоПозитив, негатив, нейтрально (иногда шкала)Приоритизация жалоб, сводка по отзывам
Тональность по аспектамОтзыв, в котором сразу несколько темТональность к каждой теме: доставка, цена, качествоПонять, что именно не нравится, а не только «плохо»
Извлечение сущностей (NER)ТекстФрагменты с типом: организация, человек, место, сумма, датаЗаполнение карточки, поиск, маскирование данных
Связывание со справочникомНайденная сущностьЗапись из справочника: контрагент, товар, городАгрегирование по одному объекту под разными названиями
Извлечение отношений и фактовТекст с сущностямиКто кому что должен, какая дата платежаРазбор писем и договоров

Ошибка чаще всего начинается с формулировки: «определить тональность отзывов» без ответа на вопрос, к чему она относится. Отзыв «Курьер приехал вовремя, но коробка была помята» содержит и позитив, и негатив, и одна метка на весь текст ничего не объяснит. Решение принимается на обследовании: нужна ли оценка всего текста или каждого аспекта.

Почему русский язык создаёт трудности

Русские слова изменяются по падежам, числам и родам, порядок слов свободный, а живые тексты полны сокращений, опечаток и смеси латиницы с кириллицей. Модели, обученные на аккуратных текстах, на таких данных ошибаются заметнее.

  • Словоформы. «Сбербанк», «Сбербанка», «в Сбербанке» одно и то же название. Поиск по справочнику без приведения к начальной форме найдёт только первую форму.
  • Отрицание и порядок слов. «Не плохо», «хуже не бывает» и «лучше, чем у конкурентов» меняют смысл на противоположный относительно отдельных слов. Подсчёт «хороших» и «плохих» слов эту разницу не видит.
  • Сокращения и жаргон. «ТО», «ДЗ», «СЗ», «отгрузка» и «выгрузка» в разных отраслях значат разное. Общая модель этого не знает.
  • Опечатки и письмо без правил. Отзывы из мессенджеров и соцсетей без запятых, с повторяющимися буквами и сленгом отличаются от текстов, на которых обучены многие модели.
  • Смесь алфавитов. Название бренда латиницей, в тексте кириллицей, в другом транслитом: система должна понимать, что это один объект.
  • Буква «ё». В одних источниках она есть, в других заменена на «е». Справочник и текст должны сравниваться с учётом этого.

Лечение известно: нормализация текста, морфологический анализ для сопоставления со справочниками, словарь отраслевых сокращений и, главное, проверка на выборке ваших текстов. Универсальной «русской модели» без проверки на вашем жанре не бывает.

Подводные камни анализа тональности

Тональность выглядит простой задачей, пока не встречаются настоящие тексты.

ЛовушкаПримерПочему ошибаютсяЧто делаем
Отрицание«Не могу сказать, что остался недоволен»Модель видит слово «недоволен»Примеры отрицаний в обучающей и проверочной выборке, отдельная проверка
Сарказм и ирония«Отлично, ждал три недели»Позитивные слова при негативном смыслеРазмечаем примеры, оставляем случаи ниже порога человеку, не обещаем полного распознавания иронии
Несколько аспектовХорошая цена, ужасная доставкаОдна метка на текст усредняет разноеОценка по аспектам или разбиение на предложения
Тональность зависит от отрасли«Долго держит» про аккумулятор и про очередьОдно слово хорошо в одном контексте и плохо в другомВыборка и дообучение на ваших текстах
Фактический негатив«Произошла авария на линии»Событие плохое, но автор не выражает отношенияРазделяем «отношение автора» и «негативное событие» в инструкции
Нейтральный класс«Заказ оформлен 3 числа»Граница между слабым позитивом и нейтральным размытаКритерии нейтрального и примеры в инструкции, смотрим на ошибки между соседними классами
Длинный текстПисьмо с жалобой и благодарностьюИтоговая метка скрывает ключевой фрагментОтчёт со ссылкой на фрагмент текста, а не только с меткой

Отдельный вопрос: нужна ли тональность вообще. Если от неё ничего не зависит (не меняется очередь, приоритет, отчёт), метка станет цифрой в таблице, на которую никто не смотрит. Для решений полезнее причина обращения и срочность, чем «минус два балла».

Подводные камни извлечения сущностей

NER кажется задачей «найти названия», но трудности в деталях.

  • Границы. «ООО «Ромашка»», «Ромашка» и «компания Ромашка» один объект, но границы фрагмента разные. Если в инструкции не сказано, входит ли форма собственности в название, разметчики поделятся на два лагеря.
  • Неоднозначность. «Орлов» это фамилия сотрудника, название улицы или организации. Тип определяется контекстом, и общая модель ошибается там, где контекст короткий.
  • Вложенные и составные сущности. Название подразделения внутри названия организации, адрес с городом и улицей. Нужно решить, что извлекается: целое, части или оба уровня.
  • Нестандартные типы. Номер договора, артикул, государственный номер, ИНН, номер заказа. Языковая модель общего назначения такие типы не знает, но для них часто лучше правила и регулярные выражения с проверкой контрольных сумм, где они есть.
  • Нормализация. «Первое марта», «01.03», «1 марта» превращаются в одну дату, «сто рублей» и «100 ₽» в одну сумму. Без этого извлечённое нельзя сравнить и просуммировать.
  • Связывание со справочником. Найденное название нужно сопоставить с записью контрагента или товара. Похожие названия легко перепутать, поэтому сомнительные совпадения подтверждает человек. Для поиска кандидатов по смыслу подходит семантический поиск.

Практический вывод: NER почти всегда гибрид. Правила и словари берут то, что устроено строго, модель берёт то, что зависит от контекста, а код проверяет результат.

Как размечать данные и не испортить выборку

Качество модели не превысит качества разметки. Три задачи решаются до обучения.

  • Инструкция с примерами. Для каждого класса и типа сущности записаны определение, граница, три-пять примеров «да» и «нет», спорные случаи и решение по ним. Инструкция растёт по мере разметки.
  • Согласованность людей. Одни и те же тексты размечают минимум двое, и мы считаем долю совпадений. Если люди расходятся, проблема в инструкции или в задаче, а не в модели, и обучать пока рано.
  • Раздел выборки без утечек. Тексты одного автора, одной переписки или одного шаблона не должны попасть и в обучающую, и в проверочную часть. Иначе модель запоминает и результат оказывается завышенным. Для данных, меняющихся во времени, проверочную часть берут из более позднего периода.

Классы почти всегда несбалансированы: нейтральных текстов много, жалоб мало. Редкий класс проверяется отдельно, а выборку для него набирают целенаправленно. Как подготовить данные до начала, описано в статье «Как подготовить данные для ИИ-пилота».

Метрики: что показывают и чем обманывают

Одна цифра «точность» бывает красивой и бесполезной. Выбирайте метрики по цене ошибки.

МетрикаЧто показываетЧем обманываетЧто смотреть вместе с ней
Общая доля верных ответовСколько меток совпало с эталономПри редком классе «жалоба» можно быть правым почти всегда, ни разу не найдя жалобуРезультат по каждому классу отдельно
Полнота по классуКакую долю настоящих жалоб система нашлаВысокая полнота достигается ценой множества ложных срабатыванийТочность по тому же классу
Точность по классуКакая доля найденных жалоб настоящаяВысокая точность может означать, что система находит только очевидные случаиПолнота по тому же классу
Матрица ошибокКакие классы путаются между собойНе обманывает, но требует чтенияПримеры текстов из самых частых ошибок
Для NER: совпадение с границамиФрагмент найден точно, с типом и границамиСтрогая оценка занижает качество, если границы допускают вариацииМягкая оценка: пересечение фрагментов
Для NER: по типамКачество каждого типа сущностиСредняя цифра скрывает слабый типОтдельные цифры по типам и по источникам текстов

Пороги приёмки записываются до работ: какие классы важны, какие ошибки терпимы, сколько текстов уходит на ручной разбор. Принцип работы с порогом разобран в статье «Порог уверенности модели».

Какой подход выбрать: правила, обучение или языковая модель

Подход определяется текстом и ценой ошибки, а не модой.

ПодходКогда годитсяОграниченияКак проверяем
Словари и правилаСущности устроены строго: номера, коды, даты, суммы, известные названияНе понимают контекст и не находят то, чего нет в словареПолнота на выборке и пополнение словарей по ошибкам
Классическое обучениеМного размеченных текстов одного жанра, стабильные классыНужна разметка, хуже переносится на другие жанрыМетрики по классам на разделённой выборке
Дообученная нейросетевая модельНужна хорошая точность на вашем жанре, есть выборкаНужны разметка, обучение и видеокарта, а при смене жанра дообучение повторяютСравнение с базовым подходом на одной выборке
Языковая модель с инструкциейРазнообразные тексты, мало размеченных примеров, нужна быстрая проверка идеиОтветы нестабильны, нужны строгий формат ответа и проверка кодом, скорость и стоимость зависят от объёмаТот же эталон, что и для остальных подходов, плюс повторные прогоны на стабильность

Сначала измеряется простое решение, и более сложное выбирается, если оно даёт заметный выигрыш на вашей выборке. Языковая модель часто удобна для разметки первого черновика, который проверяют люди, но итоговый конвейер лучше собрать из простых частей. Общие принципы создания моделей описаны на странице «Разработка модели машинного обучения».

Где обрабатывать тексты клиентов

Отзывы, письма и обращения содержат имена, телефоны и обстоятельства, поэтому для них действуют требования к персональным данным. Персональные данные граждан России обычно должны храниться на серверах в России, а передача текстов во внешний сервис требует решения вашей службы безопасности и юриста.

Для данных ограниченного доступа облачные сервисы распознавания смысла чаще всего не подходят по требованиям заказчика. Поэтому модели тональности и NER запускают на ваших серверах: небольшие специализированные модели работают на скромном оборудовании, а языковые модели большего размера требуют видеокарт. Перед отправкой в модель имена и номера можно маскировать, а в отчётах показывать агрегаты. Как развернуть модель в закрытом контуре, описано на странице «Развернуть языковую модель на своём сервере».

Что делаем мы и с чего начать

Начинаем с обследования: 200 000 ₽ и 2–3 недели за одну задачу и один источник текстов (например, отзывы или обращения), 350 000 ₽ и 3–4 недели, если тексты приходят из нескольких систем. На выходе формулировка задачи, инструкция разметки, план замера на вашей выборке и вилка бюджета. Стоимость вычитается из первого этапа, если продолжаете с нами.

Дальше лёгкий пилот (150 000–400 000 ₽, 2–8 недель): размечаем выборку, сравниваем простой и сложный подходы, показываем метрики по классам и типам. Если нужны встраивание в вашу систему и выход в эксплуатацию, это тяжёлый пилот (400 000–1 200 000 ₽, 2–3 месяца) и этапы от 1 500 000 ₽. На любой ступени можно остановиться. Мы делаем конвейер для конкретной задачи, а не универсальный анализатор текста, не дежурим круглосуточно, и исходники лежат в вашем репозитории с первого коммита. Цены и сроки на странице «Тарифы», описание услуги на странице «Разработка NLP-решений на заказ». Если тексты это расшифровки звонков, смотрите речевую аналитику.

Частые вопросы

Можно ли анализировать тональность русских отзывов без разметки?

Для первой оценки можно, например, взять языковую модель и просмотреть результаты вручную. Для работы в процессе нужна размеченная выборка ваших текстов хотя бы для проверки: без неё вы не узнаете, ошибается ли модель на вашем жанре и в каких классах.

Сколько текстов нужно размечать?

Универсального числа нет. Нужно столько, чтобы в выборке было достаточно примеров каждого важного класса, в том числе редкого. Объём определяем на обследовании по числу классов, разнообразию текстов и допустимой ошибке; расширять разметку можно по ходу пилота.

Чем NER на русском сложнее, чем на английском?

Главная разница в словоформах: одно название встречается в разных падежах, и справочник надо сопоставлять с приведением к начальной форме. Добавляются свободный порядок слов, сокращения, смесь латиницы и кириллицы. Тем не менее на подготовленной выборке хорошие результаты достижимы, это вопрос проверки.

Нужна ли для NER языковая модель?

Не всегда. Для строго устроенных сущностей (номера, коды, даты) лучше работают правила. Для названий, зависящих от контекста, подойдут обученная модель или языковая модель с проверкой. Выбор делаем по результатам сравнения на одной выборке.

Как распознать сарказм?

Полностью не распознать, и обещать это нельзя. Помогают примеры иронии в разметке, оценка по аспектам и порог: неуверенные тексты уходят человеку. Размер потерь на сарказме оценивается на выборке ваших текстов.

Можно ли обработать тексты на собственном сервере?

Да. Модели тональности и NER запускаются на вашем оборудовании, тексты клиентов не уходят наружу. Облачные сервисы для данных ограниченного доступа чаще не подходят по требованиям заказчика. Мощность оборудования считаем на обследовании.

Как связать найденные сущности со справочником контрагентов?

Через нормализацию названия, поиск кандидатов по справочнику и подтверждение. Уверенные совпадения принимаются автоматически, сомнительные идут человеку. Решение сохраняется, и повторное название сопоставляется без вопросов.

Сколько стоит разработка NLP-решения?

Обследование стоит 200 000 ₽ за одну задачу и 350 000 ₽ при нескольких системах. Лёгкий пилот — 150 000–400 000 ₽, тяжёлый — 400 000–1 200 000 ₽, вывод в эксплуатацию от 1 500 000 ₽ этапами по 300 000–700 000 ₽, сопровождение от 20 000 ₽ в месяц. Точная цена называется после обследования.