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

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

Давайте быстро просканируем с того места, где мы остановились.

«Болезненность»: поиск проблемы

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

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

Вот почему цель данной статьи - реализовать идентификацию одинаковых или очень похожих продуктов в разных магазинах.

«Обсуди ходатайства»: объединение информации.

Мы будем использовать информацию о продукте (а именно: код продукта, название продукта, URL-адрес продукта и цену продукта), как указано в нашем наборе данных.

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

Хуже того, мы не можем полагаться и на цены на товары, поскольку цены варьируются от одного магазина к другому.

Это оставляет нам два варианта: название продукта и URL-адрес продукта.

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

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

«Делаем домашнее задание»: предварительная обработка текста

Что такое предварительная обработка?

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

Выполните следующие шаги предварительной обработки кластеризации текста

В отношении данных мы выполняем следующие шаги предварительной обработки:

  • Сначала мы идентифицируем бренды и удаляем их из названия, так что нам остается только название продукта.
  • Затем мы удаляем слова, описывающие цвета, чтобы уменьшить шум данных, поскольку на этом этапе мы хотим классифицировать продукты по цвету. Например, мы хотим создать категорию «Черные туфли Converse All Star 10» и другую категорию «Белые туфли Converse All Star 10.5».
  • После этого мы удаляем числа и единицы измерения (если есть) из заголовка, потому что мы хотим создать группы с очень похожими продуктами, такими как «Кола 330 мл» и «Кола 500 мл».
  • Наконец, мы исключаем слова, то есть удаляем суффикс слова, чтобы найти общий корень, и полностью удаляем стоп-слова.
  • Чтобы передать данные заголовка в алгоритм, мы конвертируем данные в векторы. Для этого мы используем 2 разных векторизатора: CountVectorizer, который создает двоичный вектор с помощью {0,1}, и tf-idf Vectorizer, который назначает вес всем слова, исходя из частоты встречаемости слова во всех векторах. В этом случае мы используем оба векторизатора, чтобы найти тот, который нам больше подходит.

Продолжаем: кластеризация текста

Что такое кластеризация текста?

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

У нас могут быть кластеры, содержащие один единственный продукт, и кластеры, содержащие 10 или более; количество зависит от того, сколько похожих товаров мы сможем найти.

Наши потребности уменьшают наши возможности в мире кластеризации до DBSCAN. DBSCAN - это алгоритм, основанный на плотности, который зависит от того, насколько близки векторы друг к другу, для создания группы.

Группы результатов DBSCAN:

Я знаю, о чем вы думаете: Койот когда-нибудь ловил Road Runner?

Не то? Хорошо, а как насчет:

Почему DBSCAN не может правильно кластеризовать данные?

Название продукта - очень короткое предложение (1–5 слов). Однако векторы, которые мы создаем, очень большие, потому что каждое уникальное слово из наших данных составляет наш словарь. Это будет длина наших векторов, поэтому мы потеряем всю информацию.

Методы уменьшения размерности, такие как PCA и SVD, не помогут решить эту проблему, поскольку каждый столбец матрицы преобразования представляет собой слово.

Следовательно, если вы удалите некоторые столбцы, вы удалите много товаров.

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

Сломайте кроссовки: обучение векторизатору

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

Например, получив «Nike Capri Shoes», векторизатор запоминает только эти 3 слова. Это означает, что при преобразовании всех других продуктов их векторы будут заполнены 0, за исключением тех, которые содержат слово или все слова.

Чтобы определить, насколько похожи два вектора, мы измеряем их сходство с помощью Евклидова расстояния. Чтобы установить 2 слова в одну группу, расстояние должно быть выше нашего порогового значения. Создаваемые нами группы называются категориями.

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

Теперь мы создаем подкатегории для каждого сегмента, снова запуская тот же процесс с более высоким порогом, и создаем подкатегории. Подкатегории - это последние группы, которые мы будем использовать.

Переключение передач: советы по увеличению скорости

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

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

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

Успех! Теперь пробираюсь прочь (с чутьем)

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