Сравнение и сопоставление названий продуктов из разных магазинов/поставщиков

Я пытаюсь написать простую программу для сравнения цен на продукцию от разных поставщиков. Различные поставщики могут называть тот же продукт разными вещами.

Например, следующие три строки относятся к одному и тому же продукту:

  • A2 Полный кремовый молочный флакон 2л
  • A2 Milk Full Cream 2L
  • A2 Полное кремовое молоко 2L

Или следующие две строки являются одним и тем же продуктом:

  • Ambi Pur Air Freshener Car Voyage 8mL. Свежий аромат Vanilla Flower. - 1 каждый
  • Ambi Pur Air Freshener Voyage Primary 8ml

Кроме того, некоторые продукты не совпадают, но аналогичны (например, Full Cream 2L Milk может включать в себя различные аналогичные продукты).

Единственными битами информации, которые я имею на каждом продукте, является название и цена.

Какие в настоящее время рекомендуются методы для сопоставления строк продукта следующим образом?

Из моего Googling и чтения других SO-потоков я обнаружил:

  • Некоторые люди рекомендуют использовать байесовские методы фильтрации.
  • Некоторые рекомендуют делать извлечение функции для всех строк продуктов. Таким образом, вы можете извлекать из продуктов такие вещи, как бренды (например, "A2"), "Продукт" ("Молоко") и емкость ("2L"), затем создавать векторы расстояния между продуктами и использовать что-то вроде бинарного классификатора для соответствия продуктам (SVM было упомянуто). Однако, я не уверен, как достичь этого без целого ряда правил или регулярных выражений? Я предполагаю, что, возможно, умнее неконтролируемые методы обучения для атаки на эту проблему? Цена, возможно, была бы еще одной "особенностью", которую мы могли бы использовать для вычисления вектора расстояния.
  • Некоторые люди рекомендовали использовать нейронные сетевые подходы, однако мне не удалось найти много в плане конкретного кода или примеров здесь.
  • Другие рекомендовали использовать алгоритмы сходства строк, такие как расстояние Левенштейна или расстояние Яро-Винклера.

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

Кроме того, кто-нибудь знает какой-либо пример кода или даже библиотеки для такого рода проблем? Кажется, я ничего не нашел.

(Например, я видел, что у некоторых людей были проблемы с производительностью при вычислении расстояния Jaro-Winkler для больших наборов данных. Я надеялся, что может быть распределенная реализация алгоритма (например, с Mahout), но не смог найти ничего бетон).

Ответ 1

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

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

Если у вас нет этой базы данных, я бы сказал, просто. Преобразуйте все в вектор-функцию и выполните поиск ближайшего соседа. Используйте это, чтобы создать инструмент, который поможет вам создать базу данных. IE: вы отмечаете первое "A2 Whole Milk 2L" как "молоко" самостоятельно, а затем видите, являются ли его ближайшие соседи молоком. Дайте себе способ быстро пометить "да" и "нужен обзор", или подобный такой вариант.

Для простых данных, например, вы предложили, где он будет работать в 90% случаев - вы должны легко получить данные. Я сделал аналогичную надпись несколько тысяч документов в день.

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