![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 14.04.2017
Сообщений: 8
|
![]()
Доброго времени суток!
Я не программист, но очень нужно решение для следующей задачи. В SQL Server 2014 (возможен перевод не в SQL) есть база с данными: ID | Категория продукта | название продукта | описание | комментарий | Продукту может соответствовать несколько описаний, он может находится в нескольких категориях: 1 | Категория1 | продукт1 | описание1 | комментарий | 2 | Категория2 | продукт1 | описание2 | комментарий | 3 | Категория1 | продукт2 | описание3 | комментарий | 4 | Категория3 | продукт2 | описание4 | комментарий | Описание – вариант комплектации в виде P123;654+O156;987;654+K.., где буква - код составляющей, цифры - варианты моделей через «;», например, принтер - P12345;22222;7007. Составляющих несколько (P+P+O+K+…). Необходимо в рамках одной категории найти продукты, совпадающие по комплектации более чем на 70%, с выводом процента совпадения. Совпадением считается совпадение любой модели составляющей, т.е. P12345;22222;7007 = P12345;22222;15987;47777 = P22222;60006;5555 - совпадение 1, независимо от кол-ва совпавших моделей. Возможно рассматривать в качестве совпадения полное совпадение составляющей P12345;22222;7007 = P12345;22222;7007. Результат желателен в виде: 1 | Категория1 | продукт1 | описание1 | комментарий | 3 | Категория1 | продукт2 | описание3 | комментарий | 72% Буду благодарна за частичное решение либо направление для поиска. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Тому, такую структуру данных создал единица. Направление поиска - хранимые процедуры, курсоры, временные таблицы, символьные функции
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
задачка очень непростая. и не быстрая.
фактически, тут декартово произведение - каждый элемент нужно сверять с каждым. поэтому, если в таблице есть 1000 записей, то сравнений будет 1000*1000 = миллион. а если в исходной таблице миллион записей? более того, что значит "процент совпадения" ? допустим, один продукт состоит из трёх элементов 222,333,444 другой продукт состоит из пяти элементов 222, 333, 555, 777, 999 сколько здесь процент совпадения? |
![]() |
![]() |
![]() |
#4 | |||
Регистрация: 14.04.2017
Сообщений: 8
|
![]() Цитата:
![]() Спасибо! Цитата:
![]() Цитата:
Спасибо) P.S. Была мысль попробовать нечеткое сравнение, дистанцию Левенштейна, понимаю, что погрешность очень большая... Последний раз редактировалось lnatalya; 22.08.2017 в 18:42. Причина: дополнение ответа |
|||
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Можно пойти таким путем - во временную таблицу выгрузить эти P123;654+O156;987;654+K в таком виде:
Категория1 Продукт1 P 123 Категория1 Продукт1 P 654 Категория1 Продукт1 O 156 Категория1 Продукт1 O 987 и т.д, Для этого создать курсор и в цикле разобрать описание каждой записи. Ну а потом уже возможно и запросом получится, а может и нет, возможно опять курсор потребуется. В зависимости от того что же это такое тот процент
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#6 |
Регистрация: 14.04.2017
Сообщений: 8
|
![]()
Что если разбить составляющие на части? Разделить на столбцы, взяв их количество из максимально большой составляющей. У более коротких описаний часть из них будет пустая или «0». И сравнивать между собой, приняв за 100% большее непустое кол-во ячеек в паре (до 0/0):
|P12;34 | P111;22;555 | P333;44 |O77;888 | 0 | 0 | |P12;34 | P12;444;666 | S222;999 | 0 | 0 | 0 | 100% - 4 ячейки И теперь сравнивать, пары P – 0 – соответственно, не совпадают. Если по полному совпадению, то в данной паре 25%, если по частичному (наличие любой части, ограниченной «;») – 50. Такой вариант реализуем? Последний раз редактировалось lnatalya; 23.08.2017 в 10:35. Причина: редактирование табл. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
я абсолютно не понимаю, что Вы за задачу решаете и зачем это Вам нужно.
но, если уж разделять, то разделять надо правильно. нужно разделять по комплектующим, эти комплектующие писать в отдельную таблицу (можно временную/курсор, можно и просто обычную таблицу сделать). в эту таблицу записывать ID | ID_продукта (FK на таблицу с данными) | Ingridient разбивать до минимальной составляющей (атома). я предполагал, что минимальным будет P12 P34 P111 P22 P555 O77 O888 и т.д. потом нужна функция - ей передавать два ID_продукт она возвращает количество совпадений составляющих (после разбиения это сделать просто) по полученному количеству совпадений и считать процент. ну, например, (количество_совпавших*2 + количество_не_совпавших)/количество_составляющих_всего формулу можно менять в зависимости от ваших потребностей |
![]() |
![]() |
![]() |
#8 |
Регистрация: 14.04.2017
Сообщений: 8
|
![]()
Я подумала, что разбивать совсем мелко не стоит. Не программер я, решила, что так тоже можно.
Зачем: Есть большое количество предметов, отличающихся нюансами составляющих. Необходимо отловить чрезмерное сходство (условно приняли более 70%), проверить и оставить «уникальные». Например, P1;2;3 и P3;6;7 это P c 3 вариантами бантиков «белый;бежевый;молочный» и «молочный;экрю;сливочный». Цвета разные, но, по сути, это P с «беленьким» бантиком. Спасибо за помощь, буду разбираться дальше ) |
![]() |
![]() |
![]() |
#9 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
компьютер не умеет "думать" (ИИ и нейронные сети во внимание не берём). Он чётко выполняет заложенную в него программу (алгоритм). Вот представьте. у вас есть бумажные карточки. на них записанные некие данные о составе. Вы усаживаете тупого работника, который делает строго только то, что Вы ему скажете. Вы говорите ему, возьми первую карточку выпиши на листик по строчкам эти слова. возьми вторую карточку, подсчитай, сколько на ней есть совпадений слов (чётко - вот это и это - это совпадение, а вот это и это - нет - объясняете, как совпадение отличить от несовпадения. теперь количество совпадений раздели на вот это число (показали, как подсчитать число, на которое надо делить). Если в результате этого деления получилось значение больше, чем 0.7 то ты запиши номера этих карточек и результат деления в журнал. Теперь вторую карточку откладывай в стопку, бери следующую (третью, четвёртую) карточку и повторяй, пока карточки не закончатся. Потом выкинь первую карточку. Возьми стопку. Возьми первую карточку и повтори весь процесс. повторять до тех пор, пока в откладываемой стопке более одной карточки. вот и всё. и если Вы это сделаете, то написать программу - это уже исключительно "дело техники" - нужно просто переложить на ЯВУ этот алгоритм. вообще ничего не понимаю... Цитата:
Откуда компьютер должен понять, что это "по сути, это P с «беленьким» бантиком"? если белого цвета во втором случае вообще нет! Он (компьютер) должен сам это "понять"?! И какой в данном случае процент совпадения? На мой взгляд 1/3 ~ 0.333 ~ 33% ох, то ли я Вас не понимаю, то ли Вы странного хотите... Последний раз редактировалось Serge_Bliznykov; 25.08.2017 в 15:24. |
||
![]() |
![]() |
![]() |
#10 |
Регистрация: 14.04.2017
Сообщений: 8
|
![]()
Это я невнятно объясняю )
Первоначально была мысль сравнивать по одному совпадению, т.е. если в P1;2;3 и P3;6;7 есть Р и 3, то считаем это совпадением. В процессе поняла, что сама толком задачу не сформулировала, соответственно и не могу объяснить, что и как. Урок мне на будущее )) Но, учитывая, что только начала разбираться с sql, надеюсь на снисхождение. Очень понятно (для тупого работника) описан процесс, по нему я и буду писать. Надеюсь, что справлюсь. Спасибо! |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблемы с выводом пустых значений | zimmion | PHP | 2 | 28.07.2012 16:46 |
Задачи на обработку строк: удалить каждую 3-ю букву, найти кол-во гласных, кол-во цифр в строке,совпадения в 2-х строках | Ирина93 | Паскаль, Turbo Pascal, PascalABC.NET | 6 | 05.11.2011 22:10 |
Поиск на совпадение значений | chandrasecar | Microsoft Office Excel | 1 | 04.07.2010 19:22 |
stringgrid,сравнение двух столбцов на совпадения и не совпадения | betirsolt | БД в Delphi | 7 | 19.01.2010 15:09 |