en ру

Пример решения задачи классификации текстов

Пример решения задачи классификации текстов

Одной из задач, которой мы занимались, был поиск дубликатов о продаже вещей в большой базе порядка 3 миллионов объявлений и 10 миллионов картинок к ним. В правилах доски объявлений для пользователей указано, что размещение дубликатов объявлений запрещено, однако они всё равно применяют различные хитрости для обхода фильтров: измененный текст, фотографии с других ракурсов, другие категории и т.д. Соответственно главной задачей было по паре объявлений быстро и точно определить является ли эта пара одним и тем же объявлением или нет.

Постановка задачи

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

1) Текстовое описание объявлений:
- ID объявления
- Категория
- Название объявления
- Текстовое описание объявления
- Список изображений для данного объявления (не более 20)
- Большой набор дополнительных параметров (подкатегории для различных типов товаров)
- Цена
- Местоположение продавца (город, район)
- Название метро (если есть)
- широта и долгота

2) Набор изображений:
Порядка 10 миллионов изображений, каждое из которых привязано к одному из объявлений. В формате JPG размером 200х150 пикселей.

3) Набор тренировочных пар:
Набор пар (ID объявления 1) - (ID объявления 2), по которым уже проставлен флаг являются ли два эти объявления идентичными или нет. 0 - не являются, 1 - являются.

4) Набор тестовых пар:
Набор пар (ID объявления 1) - (ID объявления 2), по которым мы должны предсказать вероятность того, что объявления идентичны.

Для оценки качества решения используется метрика AUC. Она изменяется на интервале от 0.5 до 1.0, где 0.5 - решение очень плохое, 1.0 - идеальное решение. Чем ближе значение AUC к единице тем точнее классификатор. Существующий классификатор заказчика имел значение AUC на тестовых данных порядка 0.90 и стояла задача увеличить метрику выше этого значения.

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

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

  • Простые свойства (для первого и второго объявления в паре):

    • Число картинок в объявлении
    • Число символов в заголовке, описании и наборе параметров
    • Абсолютная и относительная разница в цене
  • Различные варианты похожести текста описания и названий объявлений:

    • TFIDF cousine sim с русским NLTK стеммером, базой пунктуации и русским набором стоп слов
    • Дистанция Levenshtein
    • Дистанция Damerau Levinshtein
    • Дистанция Jaro Winkler
  • Свойства для картинок:

    • Есть ли одинаковые картинки между объявлениями (использовался хэш MD5 для детекции дубликатов)
    • Минимальное расстояние между картинками в первом и втором объявлении с использованием хешей (ahash, phash, dhash) из библиотеки ImageHash
    • Матрица с последнего Convolution слоя предобученной на ImageNet нейронной сети Inception v3 от Google
  • Географическое расстояние:

    • Евклидова дистанция между широтой и долготой в обоих объявлениях
    • Haversine дистанция между широтой и долготой в обоих объявлениях
  • Большой набор отдельных свойств извлеченных из доп. параметров объявлений

Процесс решения

Модель строилась с помощью языка программирования Python. Основная библиотека для построения модели: XGBoost. Из-за большого объема данных в пике потребление памяти при тренировке модели доходило до 50 Гб. Рассчёт одной модели требовал около суток на 8 ядерном ПК. Финальная модель состоит из ансамбля из 5 отдельных моделей рассчитанных при разных условиях и на разных входных данных (это позволило увеличить эффективность решения).

Результат

Финальная проверка показала что метрика AUC для решения составила порядка 0.94, что значительно выше модели имевшейся у заказчика.

Оставить заявку