Анализ похожих названий

programmer_2006

Новичок
Анализ похожих названий

Делаю магазин по продаже мобильных телефонов. У нас есть несколько поставщиков (примерно 5), данные они предоставляют в виде xml (структуры разные).
И проблема в названиях телефонов.

Пример:
Nokia N97, Nokia-N97, Nokia n-97. Nokia.N97, Nokia N 97

Мне надо как то точно определить, что это именно Nokia n97 независимо от стиля написания. Как можно решить подобную задачку.

Пока ед. вариант который пришел в голову это написать максимально общую регулярку, но если появятся др. поставщики придется править регулярку, может можно как то красивее сделать?
Да и на каждый телефон не напишешь регулярку, так как телефонов тысячи. Должен быть какой то универсальный алгоритм.

Заранее благодарен за ответы.
 

Духовность™

Продвинутый новичок
Должен быть какой то универсальный алгоритм.
не должен.

в конкретном случае м.б. попробовать удалять все символы за исключением [a-zA-Z0-9] и по получившемуся значению определять модель.
 

xamelyon

Новичок
я к примеру использую FULL TEXT (mysql) + несколько функции для обработки названии. если не находит по FULL TEXT ищу так к примеру %N%o%k%i%a%N%9%7% (LIKE).

-~{}~ 26.05.10 11:30:

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

programmer_2006

Новичок
Автор оригинала: xamelyon
я к примеру использую FULL TEXT (mysql) + несколько функции для обработки названии. если не находит по FULL TEXT ищу так к примеру %N%o%k%i%a%N%9%7% (LIKE).

-~{}~ 26.05.10 11:30:

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

xamelyon

Новичок
programmer_2006
написать максимально общую регулярку можно будет только после долгих исследований разных названий, я к примеру убираю цвета (black, red ...)

-~{}~ 26.05.10 11:38:

нужно создать в mysql колонку где хранятся названия товаров и добавить к ней индекс FULLTEXT.
ищем так:
--------------------------------------
SELECT model_id,
MATCH (full_name) AGAINST ('Nokia n-97') AS score
FROM products_models_full
WHERE MATCH (full_name) AGAINST ('Nokia n-97')
HAVING score>='9' limit 1
--------------------------------------
full_name у меня FULLTEXT.
если ничего не нашел ищем так:
----------------------------------------
select model_id from products_models_full where full_name like '%".only_name_like_long('Nokia n-97')."%'"
--------------------------------------------
function only_name_like_long($string){
$string = str_replace(' ','%',$string);
$string_l = trim($string);

for($i=0;$i<strlen($string_l);$i++){
$string_l.=$string_l[$i].'%';
}
$string_l=rtrim($string_l,"%");

return $string_l;
}
примерно так. у меня там больше функции для обработки названии, но основные этапы эти.

-~{}~ 26.05.10 11:40:

programmer_2006

а с такой задачей не сталкивался ?
http://phpclub.ru/talk/showthread.php?s=&threadid=119340&rand=18

никто не хочет помочь.

-~{}~ 26.05.10 11:45:

или можешь так
$string = ereg_replace('[^a-zA-Z0-9]',' ',$string);
$string = ereg_replace(" +", " ", $string);
$string = str_replace(' ','%',$string);
для like поиска
 

Gremboloid

инженера Гр...
может корректнее будет добавить таблицу-справочник по названиям в виде двух-уровнего дерева:
первый уровень основное название выбранное тобой
второй уровень входящие вариации названий

результатом выборки будут элементы первого уровня.

Из минусов избыточность и затраты на формирование справочника.
 
Сверху