Лучший способ машинного обучения для соответствия строк продукта
Вот головоломка...
У меня есть две базы данных из тех же 50000+ электронных продуктов, и я хочу сопоставить продукты в одной базе данных с другими. Однако названия продуктов не всегда идентичны. Я попытался использовать расстояние Левенштейна для измерения сходства строк, однако это не сработало. Например,
-LG 42CS560 42-Inch 1080p 60Hz LCD HDTV
-LG 42 Inch 1080p LCD HDTV
Эти предметы одинаковы, но их названия продуктов сильно различаются.
С другой стороны...
-LG 42 Inch 1080p LCD HDTV
-LG 50 Inch 1080p LCD HDTV
Это разные продукты с очень похожими названиями продуктов.
Как мне решить эту проблему?
Ответы
Ответ 1
Моя первая мысль - попытаться проанализировать имена в описании функций (компания LG
, размер 42 Inch
, разрешение 1080p
, тип LCD HDTV
). Тогда вы можете сопоставить эти описания друг с другом для обеспечения совместимости; это нормально опустить номер продукта, но плохо иметь разные размеры. Простых совместимых с общими атрибутами может быть достаточно, или вам, возможно, придется писать/изучать правила о том, насколько разные атрибуты могут отличаться и т.д.
В зависимости от того, сколько разных видов продуктов у вас есть и как различаются перечисленные имена, я мог бы начать с того, что вручную определит набор атрибутов и, возможно, просто добавлю определенные слова/регулярные выражения для их соответствия, итеративно увидев, что такое "нет", до сих пор анализируется и добавляет правила для этого. Я бы предположил, что не много двусмысленности в терминах одного словарного запаса, возможно, принадлежащего нескольким атрибутам, хотя, не видя вашей базы данных, я думаю, я не знаю.
Если это не будет осуществимо, это извлечение аналогично полуконтролируемой частичной речи. Однако это несколько отличается тем, что я полагаю, что словарный запас гораздо более ограничен, чем типичный синтаксический анализ, и в том, что пространство имен продуктов более heirarchical: тег resolution
применяется только к определенным видам продуктов. Я не очень хорошо знаком с этой литературой; могут быть некоторые идеи, которые вы могли бы использовать.
Ответ 2
Используйте большой набор примеров обучения. Для каждой возможной пары в этом примере установите:
- Разберите строку для своих компонентов, а именно: компании, size_desc, display_type, make и т.д.
- Найдите расстояние между теми же компонентами между двумя строками пары.
- Создайте кортеж чисел, представляющий расстояние между компонентами.
- Обозначьте кортеж как идентичный/не идентичный на основе строк в паре в качестве части обучающего набора.
- Загрузите кортежи и подготовьте бинарный классификатор (SVM).
Теперь, когда вы получаете пару строк, для которых вы хотите решить, являются ли они такими же или нет, извлеките такие функции, как в учебном наборе, и создайте кортеж чисел для расстояния между различными компонентами строка. Подайте кортеж на обученный SVM и классифицируйте, являются ли они одинаковыми или нет.
Преимущество использования такого подхода обучения заключается в том, что вам не нужно постоянно изменять правила, а также система узнает о различиях между большой парой продуктов, которые являются одинаковыми и разными.
Вы можете использовать пакет LibSVM в WEKA для этого.
Ответ 3
Я не очень разбираюсь в машинном обучении, но знаю, что расстояние Левенштейна - не лучший подход для такого рода проблем.
В настоящее время я работаю над чрезвычайно похожей проблемой и нашел гораздо более точные совпадения, используя самую большую последовательную подпоследовательность (https://www.geeksforgeeks.org/longest-consecutive-subsequence).
Также вам может пригодиться Longest Common Substring (https://www.geeksforgeeks.org/longest-common-substring-dp-29/).
... Или, может быть, даже сочетание обоих!
Левенштейн не очень хорош, потому что он допускает замены, которые могут легко сбрасывать со счетов аналогичные строки, которые имеют дополнительные символы.
Например, "Привет AAAAAA", "Привет" и "BBBBB".
"Привет" и "BBBBB" находятся ближе к расстоянию Левенштейна, хотя вы, вероятно, хотели бы, чтобы "Привет" совпадал с "Привет AAAAAA".
LCS и LSS не допускают замены, поэтому для обоих этих методов "Hello" будет соответствовать "Hello AAAAAA".