Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 24.09.2008, 17:16   #1
Konstantin_Z
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 65
По умолчанию Коэффициент похожести

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

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

вот формула:

=МИН(СУММПРОИЗВ(КОДСИМВ(ПСТР(ПРОПИС Н(C68);СТРОКА(ДВССЫЛ("1:"&ДЛСТР(C68 )));1)))*КОДСИМВ(ПРОПИСН(ЛЕВСИМВ(C6 8)));СУММПРОИЗВ(КОДСИМВ(ПСТР(ПРОПИС Н(D68);СТРОКА(ДВССЫЛ("1:"&ДЛСТР(D68 )));1)))*КОДСИМВ(ПРОПИСН(ЛЕВСИМВ(D6 8))))/МАКС(СУММПРОИЗВ(КОДСИМВ(ПСТР(ПРОПИС Н(C68);СТРОКА(ДВССЫЛ("1:"&ДЛСТР(C68 )));1)))*КОДСИМВ(ПРОПИСН(ЛЕВСИМВ(C6 8)));СУММПРОИЗВ(КОДСИМВ(ПСТР(ПРОПИС Н(D68);СТРОКА(ДВССЫЛ("1:"&ДЛСТР(D68 )));1)))*КОДСИМВ(ПРОПИСН(ЛЕВСИМВ(D6 8))))

понятно, что сравниваемые тексты, в данном случае находятся в C68 и D68.

Формула делает следующее:
1. суммирует все коды символов первой ячейки
2. то что получилось умножается на код первого символа

то же для второй ячейки

Далее находиться отношения минимума к максимуму.


Хотелось бы услышать конструктивную критику экспертов по:
1. усовершенствованию формулы
2. упрощению формулы
Konstantin_Z вне форума
Старый 24.09.2008, 17:17   #2
Konstantin_Z
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 65
По умолчанию

для простоты все символы делаются прописными, т.е. формула, как говориться "не чувствительна к регистру"
Konstantin_Z вне форума
Старый 24.09.2008, 22:13   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

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

и позвольте небольшое лирическое отступление - как-то занимался автоматизацией - понадобилось реструктуризировать БД потребителей - из адреса, написанного "ручками" выделить название улицы (переулка/бульвара и т.д.), номер дома, строение, индекс, квартиру...
Это потребовало около двух (подчёркиваю ДВУХ) недель на обработку 100 тыс. записей. 90% работы было ручное.
Например, название улицы "Дзержинского" было написано 14 (четырнадцатью) различными вариантами...

Поэтому, как гласит один из законов Мерфи:
"Защиту от дурака можно сделать, но только от дурака неизобретательного!"
Serge_Bliznykov вне форума
Старый 25.09.2008, 12:03   #4
Konstantin_Z
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 65
По умолчанию

формула то простая
тем более, что я написал, что она делает

Спасибо, Serge_Bliznykov, Ваше мнение, как несомненного профи, для меня очень важно.
Konstantin_Z вне форума
Старый 25.09.2008, 12:05   #5
Konstantin_Z
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 65
По умолчанию

Приглашаю высказаться и других экспертов
Konstantin_Z вне форума
Старый 25.09.2008, 12:29   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

тема древняя. всплывает тут раз в неделю.
Я понимаю, что делает формула, но не понимаю вложенной в нее логики.
написал в ячейки
"WL520gc" и "Роутер WL520gc"
мой мозг понимает, что это одно и то же, причем это 100% совпадение, без малейших сомнений.
а формула выдает коэффициент схожести 0,109662235.

Мое мнение - только ВБА, причем довольно неоднозначно.
Хорошая мысль вычилять коэффициент от 0 до 1.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 25.09.2008, 16:07   #7
Konstantin_Z
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 65
По умолчанию

IgorGO
Как же это так "100% совпадение" ??
Ведь во втором случае в ячейке на 1 слово и пробел больше...
соответственно сумма кодов всех символов у второго варианта больше, соответственно, имеем 0,10966...
Konstantin_Z вне форума
Старый 25.09.2008, 16:20   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

100% совпадение, это значит, что я на 100% уверен что в разных прайсах речь идет об одном и том же товаре. Вот такие 100%.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 26.09.2008, 01:28   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я полностью согласен с IgorGO.
Поймите, что в 99% случаев без человеческого участия просто не обойтись ;-( Ваш подход позволяет лишь помочь человеку найти похожие... А дальше ручками-глазками-мозгом оператора надо пользоваться... Без человека - никуда... ;-(

вот, посмотрите:
Код:
0.46107963	Тройной	zW01 Роутер
0.441648423	Роутер zW01	zW01 Роутер
одно и то же (переставлены слова) совпадает на 44%
а "тройной" совпал на 46% :-)

а как Вам такой казус?:
Код:
0.815784939	ТРОН	zW01 Роутер
а такой?:
Код:
0.15199035	ТРОН	TPOH
Так что - как ВСПОМОГАТЕЛЬНОЕ (для человека) средство Вашу формулу использовать можно. Но вот строить пары (или объединять значения) на основании результатов её работы - я бы лично поостерёгся.. ;-(

удачи!
Serge_Bliznykov вне форума
Старый 29.09.2008, 10:39   #10
Konstantin_Z
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 65
По умолчанию

я ж об этом же! как раз речь о том, что добавить/удалить/изменить в формуле "коэффициента похожести", чтобы он считался более корректно?

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

Бесспорно, что после обработки формулами (в любом случае!) придется немного покопаться руками.
Konstantin_Z вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить коэффициент сопротивления ξ движущейся в воздушной среде сферической частиц Noor Общие вопросы C/C++ 1 27.05.2007 00:34