Поиск похожих значений

Nixic

Новичок
Добрый день, скоро предстоит решать следующую задачу:

Есть таблица с названиями продукции, названия систематизированы, но их порядка 20 тысяч (электротехническая продукция)
От клиента приходит заявка со 100 позициями в формате xls, ну или csv - не суть, названия конечно же отличаются от названий в БД.
Ну и естественно товарам из заявки нужно присвоить цены, а для этого сопоставить названия товара у нас в БД и в заявке.

Не имею представления что для решения подобной задачи можно использовать.
Направьте в нужную сторону, пожалуйста.
 

AmdY

Пью пиво
Команда форума
у товаров же есть уникальный идентификатор, артикул вроде у нашинских
 

Nixic

Новичок
Ну да, в БД, он есть, в принципе и айдишник можно вместо него использовать, что не есть гуд, конечно.
Но суть в том, что клиенты присылают заявки, используя совсем не наши данные. Набрав в интернете на сайте производителя к примеру, или на сайте других поставщиков. Или вообще ведут весь учет в каком-нибудь SAP, где разработаны их личные принципы названия товаров.
Конечно, можно просто кидать все названия в БД не следя за тем, что различия в названии на один знак, например, дефис. Но тогда нельзя будет провести аналитику, какие товары больше запрашивают, ну и любую другую.

На sql.ru мне посоветовали
> если хотите по-быстрому получить ответ именно на этот вопрос - задайте его тем, кто делал крупные проекты типа price.ru, яндекс-маркет и другие
> там тема такая - тысячи интернет-магазинов дают списки своих товаров, они аггрегируются и по ним возможен поиск по цене, опциям и тп
Ну и попробовать спросить на данном форуме (кстати, ничего такой форум, я даже задумался о том, чтобы начать учить php :))
 

AmdY

Пью пиво
Команда форума
у товаров есть складской номер, у нас это называется артикул, за бугром SKU.
 

Nixic

Новичок
Вы невнимательно читаете. артикул, ску, айди - здесь ни при чем.
Был бы артикул на обеих сторонах, вопросов бы не возникло. Была бы общая схема, которая бы соблюдалась обеими сторонами - тот же ответ.
 

Mols

Новичок
Для оценки похожести строк можно использовать это
http://ua2.php.net/manual/en/function.similar-text.php
Но ИМХО задачу без проверки данных человеком - не решить
Потихонечку создавайте алиасы для названий и по ним ориентируйтесь.
В случае, если не будет найдено точного совпадения среди известных алиасов, то функция .similar_text может немного помочь... но уверенности не будет.
 

A1x

Новичок
или договариваться чтобы клиенты указывали в своих заявках артикул
или можно конечно сделать какой-то полу-автоматический поиск вариантов (я бы делал на сфинксе :)
но в этом случае все равно нужен будет человек (негр) для окончательной проверки

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

Mols

Новичок
A1x
Угу. Лучше всего конечно договориться.
Это наверное единственное действительно грамотное решение.
 

Raziel[SD]

untitled00
Ну да, в БД, он есть, в принципе и айдишник можно вместо него использовать, что не есть гуд, конечно.
Конечно, можно просто кидать все названия в БД не следя за тем, что различия в названии на один знак, например, дефис. Но тогда нельзя будет провести аналитику, какие товары больше запрашивают, ну и любую другую.
в качестве оптимизации можно сравнивать по нормализованным названиям, т.е. все названия приводятся к одному виду и вырезаются мусорные символы, например: точки, запятые, дефисы ...
 

Xupypr

Новичок
как вариант, помимо точек и прочего мусора вырезать все, что меньше скажем 2х символов, дальше уже полученные строки и сравнивать. Другого пути по сути и нет. Сомнительные строки можно выдавать отдельно для анализа человеком, так хоть не всю базу руками перебирать.

хотя товары могут быть вида "Электроника 5", "Электроника 8" и пр.. что по сути разные товары...

мда... интересная задачка.
 

Активист

Активист
Команда форума
Твоя задача - определить модель/марку, лишнее выпилить. (задача легкая)

1. Я бы сделал словарь искл. слов, скажем плеер, плейер, стиральная машина, стиралка, стир.маш etc, они должны выпиливаться из исходных данных при сравнении.
2. Далее, привел бы все товары к виду ABC-1-CD-2-EF, и если там были тире - удалил бы, далее - убрав пробелы, разделив цифры и буквы череp тире (т.е., получил бы SONY DVDR-15-SRBLACK
3. Далее - в тексте нужно найти производителя (их на самом деле не так много), LG, Sony, Any-Data, HUAWAI etc, так вот, производителя бы вынес в начало товара, поставив пробел.

Далее - анализируешь товары, которые невозможно найти (или наоборот - много) и пишешь фильтры/правишь сущевствующие
 

Активист

Активист
Команда форума
Яндекс маркет не идеален - там много людей которые контенщики.
 

AmdY

Пью пиво
Команда форума
Активист
зачем? данная проблема сто лет решена для складов, нужно просто завести номера и пускай те, кто делает эти заявки вписывает артикул товара.
 
  • Like
Реакции: Mols

grigori

( ͡° ͜ʖ ͡°)
Команда форума
например, для помощи тем, кто делает заявки, чтобы с автокомплитом на сайте найти нужный артикул
 
  • Like
Реакции: AmdY

Andreika

"PHP for nubies" reader
На самом деле всё можно решить просто. http://php.net/manual/en/function.levenshtein.php И никакого вмешательства человека.
очень хочется глянуть ваш пример реализации сравнения имеющейся в базе строки $string1 с пришедшей из прайса $string2 - является ли товар одним и тем же
 

ComputerWorm

Новичок
я реализовывал для немного другой цели. но вот код
PHP:
<?php
	$right = file("twl06.txt");
	$file = fopen($argv[1], "r");
	$input = fgets($file);
	fclose($file);
	$input = split(" ", $input);
	
	$mark = 0;
	foreach($input as $val)
	{
		$min = 256;
		$val = strtoupper(trim($val));
		foreach($right as $cool)
		{
			$cool = trim($cool);
			$min = min(levenshtein($val, $cool), $min);
			if($min == 0) break;
		}
		$mark += $min;
	}
	
	print $mark."\n";
?>
фраза с наименьшим значением функции Левенштейна скорее всего и есть тем, что хотел пользователь. В крайнем случае можно сделать что-то вроде выбора
 

Andreika

"PHP for nubies" reader
ну и какой к этому процессору
Процессор Intel Core i7-2600K 3.4GHz 8Mb 2xDDR3-1333 Graf-850/1350Mhz LGA1155 OEM (12.5к руб)

будет левеншейновский аналог -
Процессор Intel Core i7-2600 3.4GHz 8Mb 2xDDR3-1333 Graf-850/1150Mhz LGA1155 OEM (10.5к руб)
или
Процессор Intel Core i5-2500K 3.4GHz 8Mb 2xDDR3-1333 Graf-850/1350Mhz LGA1155 OEM (8.5к руб)
?
 

ComputerWorm

Новичок
Действительно ближе оказался Процессор Intel Core i5-2500K 3.4GHz 8Mb 2xDDR3-1333 Graf-850/1350Mhz LGA1155 OEM (8.5к руб). На реальной задаче я бы предложил оба. :) Есть и другие подобные функции. Возможно одна из этих может помочь. В любом случае нужно проверить:

http://www.php.net/manual/en/function.similar-text.php
 
Сверху