Лучший способ сопоставить строку с массивом возможных похожих строк?

Каждый день я получаю несколько файлов Excel от разных компаний с информацией о продукте, и единственный способ сопоставить продукты с моей собственной базой данных — через название продукта. Эти компании не организованы, названия продуктов набираются от руки и могут отличаться в одном файле Excel.

Каков наилучший способ найти наиболее близкое соответствие к моему списку товаров? Иногда компания А может называть продукт «Игрушечная машина 100», где мне все равно, какой это номер, я просто называю этот «Игрушечный автомобиль». Однако иногда они могут называть это чем-то другим, например, «Предоставление для игрушек, которые являются автомобилями», и тогда мне нужно сопоставить это с моим продуктом «Игрушечная машина».

Каков наилучший способ сделать это сопоставление строк, в основном я хочу сопоставить строки, которые являются наиболее похожими.

Моя текущая реализация включает в себя написание многих операторов if, подобных этому, создание новых операторов if, когда вариация не может быть правильно сопоставлена.

foreach ($prodset as $p) {
if (strpos(strtolower($dd['offer_name']), strtolower($p['prod_info'])) !== false && $p['active'] == 1) {
$dd['product_id'] = $p['prod_id'];
$result = $dd;
return $result;
}
}

0

Решение

Ты можешь использовать similar_text функция, которая вычисляет сходство между двумя строками.

<?php

$base = 'Toy car';

$variations = array(
'Provision for toy that is a car',
'Toy that looks like a car',
'Toy Car',
'Toy CAR'
);

foreach($variations as $variation) {
echo "{$base} and {$variation} = " . similar_text($base, $variation);
}

Таким образом, он будет сопоставлять символы с учетом регистра, вы можете strtolower обе строки для лучших результатов.

Обратите внимание, что сложность O(N**3) где N — длина самой длинной строки.

1

Другие решения

Это возможно и с помощью strpos (), вам просто нужно добавить дополнительное условие, сколько слов вы хотите проверить. Логика что-то вроде этого,

$str = "Toy car";
$splits = split(" ",$str);

if ( strpos($splits[0]) !== false && strpos($splits[1]) !== false ){
echo "found";
}
0

По вопросам рекламы [email protected]