Сравнение названий товаров

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сравнение названий товаров

Сообщение drronnie » 08.02.2008 (Пт) 10:16

Господа, суть проблемы:
У разных поставщиков в прайсах название товаров отличаются, например:

Аспирин 200мг шипуч. №10 /Байер/
Аспирин шип. 200 x10

Как их привести к общему виду?
Я пробовал сравнивать по "похожести" строк - довольно криво и долго получается, сейчас пробую при помощи регулярных выражений проиндексировать таблицу с медикаментами, т.е. из этих строк выделить тип, наименование, дозировку и номер (номер для медикаментов - это количество таблеток, ампул или ещё чего-то в упаковке) медикамента. Если затея не загнётся, то можно будет находить такое же название в таблице и в соответствующих полях брать его описание. Вся проблема в том, что не существует уникального идентификатора для какого-либо товара: ни баркод, ни номер регистрации, ни код мориона (есть такое понятие на украинском фармацевтическом рынке), все они не подходят: не все поставщики ими пользуются, они меняются и т.д. и могут быть одинаковыми у разных товаров.

Я не прошу готового решения, просто может быть (да 100 процентов!) кто-то при разработке каких-либо учётных систем сталкивался с проблемой и может поделится опытом, наработками или подсказать где можно прочитать на эту тему.

Заранее спасибо.
Компиляция - перевод словесного поноса в машинный код.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.02.2008 (Пт) 10:32

Каждый поставщик скорее всего придерживается одних и тех же наименований.
Так что создай для каждого поставщика свою таблицу соответствий, приводи их все к нормализованному виду.
Lasciate ogni speranza, voi ch'entrate.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 08.02.2008 (Пт) 12:19

Вот я и спрашиваю про таблицу соответствий, с 10 поставщиков появляется болкее 60 тысяч наименований - руками создавать таблицу нереально... постепенно - тоже, а если новый поставщик появится - снова 4-5 тысяч наименований добавлять...
Компиляция - перевод словесного поноса в машинный код.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.02.2008 (Пт) 13:00

Нужно две таблицы:
DrugID PK
DrugName varchar
...

NameFromPriceID PK
NameFromPrice varchar UX
DrugID FK NULL
...

Первая - таблица с "твоими" лекарствами, референсная, ее записи учавствуют в складской (или какая там у тебя) логике. Во вторую сваливаешь ВСЕ названия из прайсов и делаешь из нее последовательные выборки по известным тебе критериям, допустим ищем тот же аспирин. Нашли:
Аспирин 200мг шипуч. №10 /Байер/
Аспирин шип. 200 x10
Проставляем этим записям DrugID референсного аспирина. Потом ищем другой товар, исключая записи, где DrugID уже имеет значения. Увы, придется это делать руками. Напиши модуль, в котом будет грид, отображающий результат выборки, комбобокс (или другой селектор) с референсными товарами и кнопка, меняющая DrugID у выбранных записей в гриде на ID селектора. Пару тысяч референсных наименований не напрягаясь раскидаешь за 3-4 дня. Добавление нового вида прайса в будущем потребует час-два.

Похожий механизм был выстрадан при доливке в базу юридических лиц данных из разнообразных источников.
Лучший способ понять что-то самому — объяснить это другому.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 10.02.2008 (Вс) 21:25

Antonariy, очень умно.... Как это сделать руками - я знаю, я спрашиваю как этого не делать руками...
Ей богу, если б я был бригадиром в бригаде программеров и дал бы задание кому-нибудь придумать как это сделать, а этот кто-нибудь придумал бы делать это руками, я б его уволил! А где же творческий подход?! Мне тут например подсказали следующее: написать определённую хэш-функцию: она будет убирать гласные, знаки, пробелы и две одинаковые буквы подряд. Подобная идея используется в стенографии.

Исходные данные:
Аспирин 200мг шипуч. №10 /Байер/
Аспирин шип. 200 x10

Дозировку, номер и производителя я убирать научился, получается:
Аспирин шипуч.
Аспирин шип.

Убираем гласные и знаки:

спрншпч
спрншп

По-моему круто получается, хотя на практике ещё не проверял...
Компиляция - перевод словесного поноса в машинный код.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.02.2008 (Вс) 22:11

А теперь:
1) находим Различие Левенштейна для этих двух строк, и если оно ниже некоторого порогового уровня - считаем препараты одинаковыми.
2) сравниваем строки по алгоритму "описанному Oliver [1993]".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.02.2008 (Вс) 23:12

А теперь сравни своим алгоритмом "аспирин UPSA" и "аспирин упса". Или "аспирин шипучий, таблетки" и "аспирин, таблетки, шипучий".
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.02.2008 (Пн) 8:31

Как это сделать руками - я знаю, я спрашиваю как этого не делать руками...
Поручить другому. 8)
Ей богу, если б я был бригадиром в бригаде программеров и дал бы задание кому-нибудь придумать как это сделать, а этот кто-нибудь придумал бы делать это руками, я б его уволил!
Я бы сам ушел от такого бригадира (Удачное название, далекое от интеллекта. Могу заставить копать, могу не заставлять.)), который не ощущает границ возможностей программных средств.
По-моему круто получается, хотя на практике ещё не проверял...
О том и речь. Фантазировать все горазды, а на практике всё упирается в неумение фантазировать компьютера... Когда два аспирина сравниваешь ты, то ты сравниваешь по смыслу (при мгновенном "фоновом" синтаксическом разборе), а компьютер может сравнить только буквы. Чем больше правил сравнения ты опишешь, тем больше исключений останется. Смысловой разбор компьютеру пока не по зубам. Однако если у тебя получится, можешь расчитывать на памятник...
Лучший способ понять что-то самому — объяснить это другому.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 11.02.2008 (Пн) 10:40

2Хакер, если сравнивать по нескольким алгоритмам я думаю будет довольно точно...
2alibek, ну если предварительно обработать это название, т.е. все "шип." и "шипуч." заменить на "шипучий", а "тб." и "табл." на "таблетки" (не так уж и много этих сокращений, я думаю не больше трёх сотен), а затем в названии отсортировать все слова по алвавиту, то результат будет нормальный.
2Antonariy, дело не в названии... как-будто названием что-то определяется... А вот пока ты будешь видеть границы и мыслить шаблонами, то всё будет делатся именно руками...
Ну а если будет 1 000 000 записей, их тоже руками провязывать? А 2 миллиона, а 3, 4, 5? Да, машина по смыслу не сравнивает и любой алгоритм может может отработать не верно, но согласись, после недели такой нудной работы вероятность, что человек допустит ошибку тоже очень велика!

Господа с появлением огромного числа супермаркетов и вообще введении компьютерного учета во многих отраслях я думаю проблема очень актуальна. Неужели никто не сталкивался? Или тоже всё делали руками?
Компиляция - перевод словесного поноса в машинный код.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.02.2008 (Пн) 12:07

А вот пока ты будешь видеть границы и мыслить шаблонами, то всё будет делатся именно руками...
Что ж, безграничный ты наш, попробуй реализовать хотя бы такой шаблон: нахождение значащих блоков в строке.
Аспирин 200мг шипуч. №10 /Байер/
Аспирин шип. 200 x10
Лучший способ понять что-то самому — объяснить это другому.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 11.02.2008 (Пн) 13:55

Antonariy А что там пробовать?

Вот шаблоны дозировок:
((\d+(\.|,)\d+)|(\d+))\s*мг
((\d+(\.|,)\d+)|(\d+))\s*мкг
((\d+(\.|,)\d+)|(\d+))\s*мл
((\d+(\.|,)\d+)|(\d+))\s*мг\W*((\d+(\.|,)\d+)|(\d+))\s*мл
((\d+(\.|,)\d+)|(\d+))\s*г\W*((\d+(\.|,)\d+)|(\d+))\s*мл
((\d+(\.|,)\d+)|(\d+))\s*г\W*\+\W*((\d+(\.|,)\d+)|(\d+))\s*г
((\d+(\.|,)\d+)|(\d+))\s*г
((\d+(\.|,)\d+)|(\d+))\s*мл\W*((\d+(\.|,)\d+)|(\d+))\s*мг


Вот шаблоны номеров:
№\s*\d+(\s*[xх\+\*]\s*\d+)?
#\s*\d+(\s*[xх\+\*]\s*\d+)?
\Wn\s*\d+(\s*[xх\+\*]\s*\d+)?
x\s*\d+ 0
х\s*\d+ 0


Если дозировки нету и встречается число - значит оно и есть дозировка...

\Wшип\W -> шипучий
\Wшипуч\W -> шипучий


Ну и как прокомментируете, ограниченный наш?
Компиляция - перевод словесного поноса в машинный код.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 11.02.2008 (Пн) 16:43

2 drronnie

Да как ни крути, все равно будут исключения. Шаблонами такую задачу не решить, знаю по опыту - проблема была схожая только в место лекарст в была Аудио - Видео продукция, и поскольку полной автоматизации добиться не удалось, проще было вообще отказаться от приведения к общему списку. (каждый поставщик гнет свою палку) да еще и в каком формате приходили прайсы - это был вообще ужос.

Я бы на твоем месте в парламент внес бы предложение , "О присвоении уникальных идентификаторов лекарственным препаратам" - вдруг осознают всю важность сего вопроса и примут!

з.ы. Почему-то вспомнился один из мастеров ассесс - тоже ведь пытается что то сравнивать и в итоге сидиш потом ручками таблицу корректируеш, муть;

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.02.2008 (Пн) 17:00

Если применять эти регэкспы как маски, вырезающие соответствующий текст и одновременно проставляющие получаемые значения в свойства (доза, фасовка и т.д.), то после нескольких проходов оставшийся текст будет идентифицироваться проще. Ручной работы будет меньше.
Лучший способ понять что-то самому — объяснить это другому.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 11.02.2008 (Пн) 18:48

Antonariy, я ж тебе о чем и толкую, о том, чтобы руками меньше работы было...
Dmitriy2003, да в общем этой проблемой занимается издательство МОРИОН, их идентификатор так и называется код Мориона, но им не все пользуются и далеко не все препараты они идентифицировали :(
Компиляция - перевод словесного поноса в машинный код.

alex_gearbox
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 09.01.2008 (Ср) 21:34
Откуда: г. Волгоград

Сообщение alex_gearbox » 12.02.2008 (Вт) 23:29

Надеюсь, в тему.

Утилита нечёткого сравнения строк.
Вложения
Similar.zip
Исходники, руководство
(21.5 Кб) Скачиваний: 78

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 8:14

alex_gearbox
Баян
Лучший способ понять что-то самому — объяснить это другому.

alex_gearbox
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 09.01.2008 (Ср) 21:34
Откуда: г. Волгоград

Сообщение alex_gearbox » 13.02.2008 (Ср) 20:45

drronnie писал(а):Я пробовал сравнивать по "похожести" строк

Извиняюсь, пропустил при чтении.

Про б@ян...
Вложения
FC_vis_S.png
Небольшое сравнение точности функций FuzzyCompare и Simil
FC_vis_S.png (14.87 Кб) Просмотров: 797


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 27

    TopList