Всем привет! Сегодня мы продолжим рассказ о том, как наша команда Data Science из CleverData начали выделять бренды в строках онлайн-рецептов. Цель этого упражнения — построить отчет для анализа бренда, который мы подробно обсуждали в первая статья на эту тему. Во второй части вы узнаете, как мы обучили нашу собственную модель NER на основе конвейера (сводка с данными) для получения наценки бренда.
Содержание
Почему вы решили разработать собственную модель NER
Получив вдохновляющий отчет, основанный на конвейере, о котором мы говорили в последнем посте (помните, мы использовали предварительно обученные модели NER для тега Organization: Spacy, Natasha, NER Rus_Bert torch (DeepPavlov), NER Ontonotes Bert mult torch (DeepPavlov)), стало понятно, что игра стоит свеч и что она делает смысла разрабатывать собственную модель НЭР. Отчасти наценка была достигнута исключительно за счет этого «мультимодельного» пайплайна. Но мы хотели, чтобы новая модель была прочнее текущих моделей, поэтому доработали разметку. Да, вручную. Да, вся команда. Нет, это не страшно. И даже очень круто.
Помните, что NER (распознавание именованных объектов) — это распознавание именованных объектов. Сущности – это важнейшие фрагменты конкретного предложения (предложения с существительными, глагольные словосочетания и т. д.). По-другому можно сказать, что НЭР — это процесс обнаружения именованных объектов в тексте. Например, имена людей, названия мест, компаний и т. д. В нашем конкретном случае, в отличие от классической задачи NER, мы будем различать только один тип именованных сущностей — бренды.
Для наших экспериментов мы использовали большие данные проверок онлайн-покупок, выполненных изучаемыми сегментами. Для обучения модели в качестве данных были взяты случайные контроли, относящиеся к разным дням недели и разным месяцам года (2022.01.02-2022.01.20, 2022.02.01-2022.02.15, 2022.03.01-2022.03.15) . Общее количество строк составило 415 000.
Модели, которые нужно было протестировать: строчные буквы, рубер-тини2, перефразировать-многоязычный-MiniLM-L12-v2, перегонная база-многоязычный корпус-v1 И DeBERTa-v2.
Как планировался эксперимент
Общий конвейер в первом приближении можно описать следующим образом.
-
Строка управления предварительно обрабатывается токенизатором для правильного разделения слов (и знаков препинания) перед разметкой элемента управления и отправкой на токенизаторы шаблонов.
-
Проверка сопоставляется с последовательностью тегов формата [B — beginning, I — in brand, O — out of brand], в соответствии с выбранными брендами (маркировка). B-бренд означает, что название бренда начинается с текущего токена; I-бренд — текущий токен является продолжением названия предыдущего токена; O — токены, не привязанные к брендам.
-
Данные полностью случайным образом разбиваются на действительные обучающие выборки.
-
Данные [чек — список тэгов] вводятся в предварительно обученную трансформерную языковую модель, над которой размещается классификатор (для каждого элемента последовательности).
-
При обучении рассчитываются метрики (в качестве основной используется взвешенная метрика f1): для каждой последовательности тегов [B, I, …].
Для получения разметки вида «строка прихода — марка(и)» к этим данным применялся пайплайн, описанный в прошлой статье.
После применения пайплайна для обогащения разметки нашими естественными нейронными сетями или методом «бдительного взгляда» мы классифицировали метки, выявленные на уже обработанных данных, на три класса:
-
условно чистые, очевидные (пример: Самсунг, Тефаль, Бирюса) — на всякий случай пересмотрели эти строки, предполагая, что ошибок наверняка не будет;
-
подозрительные и неочевидные (пример: Apple. Похоже на Samsung, но есть и вкусы Green Apple) — пересмотрели и разделили на нужные и ненужные;
-
«хлам» — те, на которые мы вообще не смотрели глазами в первой итерации, потому что они чистый хлам (пример: Сад. Какой сад? Фруктовый? Гигантский? Или сокращение от «сад»? ).
Семена овощей Русский Сад 319029 Огурец Отелло F1 10 шт.

Все так просто
При разметке данных возникли следующие вопросы.
-
Подсвечивать ли марку в чеке, если она не связана с самим товаром (пример: «стекло для Apple iphone» — Apple не является маркой стекла).
-
Какие именованные сущности следует выделить в строках, где указан один и тот же знак на языке оригинала и в русской транслитерации?

Поразмыслив, при перепроверке разметки руководствовались двумя принципами: перечислить все марки, которые указаны в строке, и оставить только основную марку (чтобы не попасть в строки).
После обработки набора данных мы получили следующие данные: 101336 строк (без дубликатов, зачищенных от «спорных» строк для разметки), содержащих более тысячи уникальных меток (1064).
| С отметкой | Безымянный | Общий |
Линии, тыс. | 75,6 | 25,7 | 101,3 |
Делиться, % | 74,64 | 25,3 | 100 |
Токенизация
Перед внедрением в модель данные пройдут стадию токенизации, потому что модели не работают напрямую с текстами. В то же время, в зависимости от токенизатора, смежные письменные элементы могут рассматриваться как один токен. Например, 4,5% можно считать уникальным токеном (как и 1% и т.д.), а сам знак % может быть информационным токеном и должен рассматриваться (формироваться) отдельно от связи с конкретным числом.
Для того, чтобы наши данные токенизировались до нужного уровня вне зависимости от самого принципа работы токенизатора, мы решили сделать такое разделение на этапе препроцессинга. Для такого корректного разделения текстов на слова и символы рассматривались четыре разных токенизатора. Мы выбрали nltk.tokenize.wordpunct_tokenize, потому что он хорошо справляется с разделением, в том числе при наличии специальных символов (таких как ®).


Таким образом, мы достаточно рассмотрели, на наш взгляд, количество строк. И в первой итерации мы получили самые высокие показатели по всем моделям.
Опыт №1
В качестве образца для пробного обучения был взят набор данных из 30 000 строк. Первая итерация обучения для всех моделей показала метрики 0,99+ f1 для обучающих/проверочных/тестовых выборок.

При этом модели могли обучаться более десяти эпох без признаков переобучения на проверочном наборе. Подозрительно, подумали мы. Это привело нас к следующим вопросам.
-
Должны ли неизвестные бренды из обучающей выборки быть включены в проверочную/тестовую выборку?
-
Достаточно ли используемой метрики f1 (по токенам) для оценки модели?
-
Нужно ли пересматривать/перепроверять данные?
Ведь в тренировочном и тестовом наборах есть довольно похожие строчки:

Анализ ошибок эксперимента №1
К чему они пришли.
-
Вам нужно найти бренды, которые не выделяются на конвейере, и добавить их в разметку.
-
Одной из наших целей является выявление в том числе меток, которые не наблюдались в обучающей выборке. Поэтому проведем два теста: один стратифицированный (набор брендов в соответствии с распределением в обучающей и проверочной выборках), другой — неизвестный (только марки, которых нет в обучающей и проверочной выборках) подтверждения).
-
Метки, которые не детектируются конвейером, являются многословными и содержат символы (внимательный читатель, наверное, уже задался вопросом, что подразумевается под «словом» в понятии «многословный»).
-
Добавьте построчную метрику качества, т.е. имеет смысл смотреть не только взвешенную по тегам оценку F1, но и метрику, отражающую точность всей спрогнозированной строки (построчная точность). Даже одна ошибка в определении строковых тегов повлияет на конечный результат: либо мы получим лишние отметки (если неправильно определим О), либо пропустим настоящую отметку (плохое определение В), либо зафиксируем только часть названия бренда (ошибка определения I-tag).
Чтобы вернуться
Пришлось вернуться к разметке. И это было очень интересно. Возникли проблемы со словесными и символьными знаками? Вместо того, чтобы пытаться идентифицировать их, давайте пойдем в противоположном направлении.
-
Разберемся с построением многословных брендов (Dr.…, Mr…, person_1&person_2, пример — Dolce & gabbana).
-
Используя эвристику, полученную в пункте 1, найдем покупки, соответствующие этим брендам.
Опыт №2
Итак, мы учим.
Состав Дадасеты:
Форма | Проверка | Тест 1 (неизвестные марки для модели) | Тест 2 (стратификация по брендам) | |
Срок, % | 70 | 15 | 6 | 9 |
Бренды, % | 90 | 33 | десять | 44 |
Пример поведения метрики:

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

Результаты
После исправления разметки мы протестировали несколько предварительно обученных моделей с разными гиперпараметрами. Лучшие результаты для каждой из моделей в таблице ниже.
Модель | Тест «Неизвестные бренды» | Стратифицированный тест | |||
f1 (по меткам) | Точность | f1 (по меткам) | Точность | Время вывода для 10 000 строк (GPU) | |
Майкрософт/mdeberta-v3-база | 0,98 | 0,84 | 0,998 | 0,98 | 1 мин 16 с |
перефразировать-многоязычный-mpnet-база-v2 | 0,92 | 0,71 | 0,999 | 0,96 | 3мин 1с |
коинтегрированный/rubert-tiny2 | 0,91 | 0,58 | 0,999 | 0,986 | 12,4 с |
перефразировать-многоязычный-MiniLM-L12-v2 | 0,91 | 0,53 | 0,998 | 0,98 | 1 мин 15 с |
Деберта показала лучшие результаты, идеально идентифицировав 84% последовательностей в строках брендов, которые она никогда не видела — отличный показатель для такой сложной задачи. Для стандартного стратифицированного теста показатель составил 98%, что тоже очень хорошо и более чем достаточно для решения нашей задачи: создать отчет по анализу бренда.
Если вы хотите следить за новостями CleverData, присоединяйтесь к нашему телеграмм канал.
Соавтор статьи — @Alex643