В общем появилась задачка на подумать. Реализовать могу и сам, а вот реализовать то что... Кучу вариантов передумал, и везде одно и то же, слишком медленно, или слишком дыряво.
В общем в таблице продуктов (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
слов, цитат, не получилось разобраться, может я дурак...
Может есть у кого идея, как лучше всего это реализовать? Или если есть пример какой, особенно для Сфинкса, если он лучше подойдет к моей задаче.
Для этих целей,я думаю, специальная функция PHP similar_text() Единственно все упирается в быстродействие. Я бы посадил некий скрипт на крон, который для всех новых записей будет искать похожие. Т.е. определяем некую заданную степень похожести и погнали по всему списку. Нашли товар - записали в специальную таблицу эту пару. Таким образом и у старого товара добавится похожий и у нового они будут
Я когда то решал чем похожую задачу, и решил через levenshtein
http://php.net/manual/ru/function.levenshtein.php.
Получайте все нужные поля товаров, склеивайте их в нужном порядке и сравнивайте с искомой строкой, у кого будет наименьшее расстояние Левенштейна - тот и наиболее похож.
Я конечно не знаю сколько там у вас товаров, поэтому архитектурно что-то посоветовать не могу, через крон это делать или как то еще. Проведите тесты и на их основании уже работайте дальше.
ЗдравствуйтеВозникла проблема, дело в том что хочу чтобы в yii\grid\SerialColumn был не input с типом text, а dropdown, чтобы можно было выбрать только конкретные...
В php можно создать многомерный массив и добавить в него ключ со значением без указания типа, а как такое сделать в c#?