Сравнение и сопоставление названий продуктов из разных магазинов/поставщиков
Я пытаюсь написать простую программу для сравнения цен на продукцию от разных поставщиков. Различные поставщики могут называть тот же продукт разными вещами.
Например, следующие три строки относятся к одному и тому же продукту:
- 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% случаев - вы должны легко получить данные. Я сделал аналогичную надпись несколько тысяч документов в день.
После того, как у вас есть собственная база данных, решение этих проблем должно быть довольно простым. Вы можете повторно использовать код для создания своей базы данных для обработки "невидимых" данных.