Несмотря на весь прогресс, достигнутый в машинном обучении за последние годы, задачи классификации текстов привлекли к себе большое внимание, и были разработаны интересные решения.

Здесь, в компании Aboutgoods, мы сейчас сталкиваемся с классической проблемой классификации текстов. Классика, не правда ли? ..

Задача - присвоить номеру позиции исчерпывающую категорию, которая присутствует в чеке в основном из супермаркетов.

Например, pineapple juice 1L принадлежит juice категории. И от pineapple extra import до fresh fruit. Или, если вы хотите немного посложнее, какую категорию вы бы отнесли к этому ярлыку DBL GLOUC? (Это был бы сыр двойной глостер 🧀).

Очень похоже на анализ настроений в твиттере. Есть, но давайте посмотрим поближе.

  • Во-первых, мы имеем дело с более чем 70 категориями, так что это действительно проблема классификации текста на несколько классов.
  • Во-вторых, словарь розничной торговли очень специфичен и не может быть точно описан с помощью готовых языковых моделей.
  • И в-третьих, извечное препятствие для науки о данных - очень ограниченный и несбалансированный набор данных. Действительно, в нашем наборе данных мы работаем со 100–4000 меток на категорию / класс. Если задуматься, в квитанции не так уж и много способов описать яйца ...

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

Архитектура нынешней модели включает:

  • кастомная модель word2vec, полученная с нуля;
  • CNN (сверточная нейронная сеть) обучена с использованием фреймворка Keras.

Word2vec: зачем и как.

Как я уже упоминал, язык розничных квитанций очень специфичен. Во-первых, здесь нет глаголов, очень мало артиклей и мало наречий. Вселенная розничной торговли - это все о существительных и прилагательных. Вот почему использование предварительно обученной языковой модели word2vec (например, FastText) в нашем случае не сработало: слишком много слов нам не нужно.

Если вы не знакомы с концепцией Word2vec, вы можете найти здесь отличные объяснения:

Вкратце: Word2vec - это неглубокая нейронная сеть для изучения встраивания слов из необработанного текста. Его ввод - это текстовый корпус, а его вывод - набор векторов: вложения слов. Он превращает текст в числовую форму, которую глубокая нейронная сеть может понять и использовать.

Целью и полезностью Word2vec является группировка векторов похожих слов вместе в векторном пространстве.

Теперь наш интерес к использованию Word2vec очевиден: перед обучением глубокой нейронной сети по категориям мы хотим иметь предварительно обученное векторное пространство слов (представленных встраиваемыми словами), которые уже связаны семантически.

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

В Aboutgoods мы много работали над созданием этого набора данных, поскольку в Европе нет официальной базы данных этикеток и продуктов.

Подготовка набора данных

Предварительная обработка набора данных чрезвычайно важна (как вы, возможно, уже знаете).

К меткам в нашем наборе данных были применены классические преобразования:

  • строчная буква, преобразование юникода
  • удаление стоп-слов (вы никогда не увидите их в квитанции, в строке квитанции учитывается каждая буква)
  • замена всей массы (кг, г и т. д.), объема (л, л и т. д.), упаковки, процентной информации на общие ключевые слова
  • удаление общих слов, не относящихся к какой-либо категории. Например, торговая марка продавца: auchan илиtesco.
  • токены (например, отдельные слова) создаются путем разделения метки пробелом.
“KELLOGG’S BAR.CEREAL 400G” ->
[“kellogg’s”, “bar”, “cereal”,”<UNIT_SOLID>”]

Обучение модели Word2vec

Следующий шаг: обучение модели Word2vec. Используя gensim библиотеку, мы получили модель Word2vec скип-грамм, обучаясь более чем на 70 тыс. Этикеток. В среднем мы получаем словарный запас из 12 тысяч слов.

С проектором Tensorboard мы можем исследовать и по-настоящему круто играть с векторным пространством. Вот некоторые соседи слова espresso ☕️, например, во французской модели Word2vec.

CNN: обучение по категориям.

Как только мы получили представление меток Word2vec, мы можем обучить нейронную сеть (NN), которая может предсказывать категорию данной входной метки. Мы вдохновились этой статьей и использовали предложенную там архитектуру: https://arxiv.org/pdf/1408.5882v2.pdf

Нейронные сети капризны. Они принимают только числовой ввод фиксированного размера. Но у нас есть ярлыки, которые являются строками. И у нас есть их вложения слов из модели Word2vec. К счастью для нас, в библиотеке Keras есть все необходимое, чтобы все это объединить. Он предлагает Embedding слой, который можно использовать в нейронных сетях, обученных на текстовых данных. Он может быть инициализирован случайными весами ИЛИ can also use a word embedding learned elsewhere (похоже на наш случай 🙏).

Мы кодируем метки, используя Tokenizer, а с помощью слоя Embedding сообщаем NN, что слово встраивается из модели Word2vec. Более того, мы позволяем NN изменять вложения во время обучения.

Пока мы обучаем моделей на 3 языках: французском, испанском и итальянском. Средняя точность, полученная на наборе данных проверки, составляет 90%. Кроме того, модели демонстрируют чрезвычайно хорошую специфичность и чувствительность. Как напоминание:

Специфика модели - это мера, используемая для определения доли фактических случаев, не относящихся к этому классу, которые были предсказаны правильно.

В нашем случае мы можем рассматривать это как то, насколько хорошо одна категория отличается от других. Средняя специфичность класса (из более чем 71 класса) 99,5%!

Чувствительность - это мера, используемая для o определения доли фактических случаев этого класса, которые были правильно спрогнозированы.

Если мы рассмотрим результаты с точностью предсказания выше 50%, мы получим среднюю чувствительность 85%.

Некоторые примеры классификации французских этикеток:

Если вам сложно понять эти ярлыки, не волнуйтесь! Иногда они бывают и у нас 😎.

Спасибо, что прочитали, и поделитесь с нами своим опытом работы с задачей классификации коротких текстов!