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