Лучшая техника машинного обучения для сопоставления строк продукта

Вот загадка...

У меня есть две базы данных с одинаковыми 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 Тег применяется только к определенным видам товаров. Я не очень знаком с этой литературой; Там могут быть некоторые идеи, которые вы могли бы использовать.

Используйте большой набор обучающих примеров. Для каждой возможной пары в этом примере установлено:

  1. Разобрать строку для ее компонентов, а именно. компания, size_desc, display_type, make и так далее.
  2. Найти расстояние между одинаковыми компонентами между двумя строками пары.
  3. Создайте набор чисел, представляющих расстояние между компонентами.
  4. Пометьте кортеж как идентичный / неидентичный на основе строк в паре как части обучающего набора.
  5. Накормите кортежи и обучите двоичный классификатор (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".

Другие вопросы по тегам