Подтвердить что ты не робот

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

Вот головоломка...

У меня есть две базы данных из тех же 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

Это разные продукты с очень похожими названиями продуктов.

Как мне решить эту проблему?

4b9b3361

Ответ 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".