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