Поиск похожих строк

411
03 сентября 2017, 03:49

В общем появилась задачка на подумать. Реализовать могу и сам, а вот реализовать то что... Кучу вариантов передумал, и везде одно и то же, слишком медленно, или слишком дыряво.

В общем в таблице продуктов (MySQL products), есть товар, у него есть поле title, в котором примерно записано следующее:

Сервер Dell PowerEdge R430 (210-ADLO-172)<1xE5-2650v4 1x16Gb 2RRD x8 2.5" RW H730 iD8En+PC 1G 4P 1x550W>

Есть таблица похожих продуктов ws_products, в которой есть поля art, title, description. Среди похожих продуктов, находится товар, имеющий примерно похожие название (Dell R430), номер (скажем 210.ADLO.172), описание (описание к примеру более развернутое, но так же присутствуют фразы 16GB H730 550W). Всё, больше ничего, никаких ключевых слов, оформления у товаров абсолютно разные.

Задача взять товар из таблицы похожей продукции и найти максимально похожий товар из таблицы оригиналов, или близкий к оригиналу

Сам пытался делать все через like, предварительно разбивая строку на целые слова без спец-символов (заменял на пробелы, брал слова больше чем два символа), и искал список всех похожих. Потом проходился по ним, брал шинглы, сравнивал размеры crc32, сортировал в порядке убывания кандидатов (по проценту вхождения одинаковых кусков), и получалась белиберда в общем, очень долго, товаров тьмень, что там, что там, и вешал в итоге сервак такими махинациями...

Пытался заюзать Сфинкс, и не вышло, строки изначально не разбиты, не имеют одинаковых оформлений, что в первой таблице, что во второй. По итогу нужны matches слов, цитат, не получилось разобраться, может я дурак...

Может есть у кого идея, как лучше всего это реализовать? Или если есть пример какой, особенно для Сфинкса, если он лучше подойдет к моей задаче.

Answer 1

Для этих целей,я думаю, специальная функция PHP similar_text() Единственно все упирается в быстродействие. Я бы посадил некий скрипт на крон, который для всех новых записей будет искать похожие. Т.е. определяем некую заданную степень похожести и погнали по всему списку. Нашли товар - записали в специальную таблицу эту пару. Таким образом и у старого товара добавится похожий и у нового они будут

Answer 2

Я когда то решал чем похожую задачу, и решил через levenshtein http://php.net/manual/ru/function.levenshtein.php.

Получайте все нужные поля товаров, склеивайте их в нужном порядке и сравнивайте с искомой строкой, у кого будет наименьшее расстояние Левенштейна - тот и наиболее похож.

Я конечно не знаю сколько там у вас товаров, поэтому архитектурно что-то посоветовать не могу, через крон это делать или как то еще. Проведите тесты и на их основании уже работайте дальше.

READ ALSO
Ошибка при запуске casperjs

Ошибка при запуске casperjs

Пытаюсь запустить casperjs из кода php:

337
Вывод краткой и полной новости

Вывод краткой и полной новости

ЗдравствуйтеЯ сохраняю новость, как html страницу

336
Сделать dropdown в yii\grid\SerialColumn Yii2

Сделать dropdown в yii\grid\SerialColumn Yii2

ЗдравствуйтеВозникла проблема, дело в том что хочу чтобы в yii\grid\SerialColumn был не input с типом text, а dropdown, чтобы можно было выбрать только конкретные...

371
Многомерные массивы c# с разными типами

Многомерные массивы c# с разными типами

В php можно создать многомерный массив и добавить в него ключ со значением без указания типа, а как такое сделать в c#?

400