Размити търсене - макроси и VBA програма - Статии Directory - - Excel един перфектен ексел
Проблемът с размита търсене
Когато ние се занимаваме с текста, въведен от човек, то е неизбежно неволни грешки. Вместо "писалка. Гогол" Хората могат да набират "платно. Nogolya", просто защото promahnotsya на желания клавиш и преси за следващата. С оглед на това, предизвикателството е да се сложи в ред въведената дума речника думата, която е най-подобен на това, което влезе на потребителя. Класическият проблем - проверката на имената на улици, селища и т.н. Стандартно търсене тук безсилен, тъй като думата липсва в речника липсва. Стандартно търсене само в състояние да установи този факт, но не е в състояние да предложи на потребителя да избере най-близката. Нуждаете се от изпълнението на размита търсене.
Това, което предлагаме
За тези, които бързат, да обяви веднага, че ако темата е от значение, а след това ви предлагам да използвате функцията обичай лист, който се нарича FS_GetClosestWord и има 2 задължителни параметри и по желание 4.
Call формат: = FS_GetClosestWord (Какво, къде [NumItem] [MinLen] [Сравнете] [DBG]). когато:
[NumItem] - в процеса на разследване е колекция от най-подходящите думи, които се класират според определен алгоритъм. NumItem определя броя на думи върнати от тази колекция има. NumItem = 1 се връща най-близкото съвпадение според думата алгоритъм, използван. Ако споменатия брой е твърде голям и получената Колекцията съдържа такъв брой елементи, след което се връща грешка # N / A;
[MinLen] - минималната дължина на символния низ, в която една дума от речника, и които след това се търси в словото на какво. Не може да има по-малко от 3. Ако посочите три или по-малко не се уточнява, стойността 3 ще бъдат използвани;
[Сравнете] - тип струни сравняване: малки и големи букви или без счетоводство. 0 - включва случаите, 1 - нечувствителен;
[DBG] - ако посочите тук число по-голямо от 1, а след това включете режима за отстраняване на грешки, както и в зависимост от това, че сте тук ukazhaete, ще можете да:1 - поведението по подразбиране за връщане най-близкото слово Къде;
2 - съчетани низ;
3 - гласове намери речника думите;
4 - разликата в модул между реплика и е установено, думата за търсене, който се използва за класиране на откритите от нивото на сходство с оригинала думата (по-малката разлика, толкова по-подобни се считат за думата) думи.
Най-много потребители ще ръководят първите два параметри.
Изтеглете файла с функцията
Ако ще носи в ръцете си проект Excel VBA, не забравяйте да допълнение модул размита, също да прехвърляте клас Search.
Теорията на размита търсене
С изучаването на въпроса в началото погледнах към Николай Павлов това е неговата рецепта. Дори и той откри грешки. Въпреки това, от самото начало беше ясно, че предложеният алгоритъм за най-общия случай е недопустимо поради бавната скорост, така че са продължени проучвания. Един отличен преглед на размитите алгоритмите, дадени в тази статия. За неговото изпълнение, аз избрах метода на N-гр, с участието на хеширане на подписване да се оцени опциите намерени.
Да предположим, че имаме дума в речника домати. Моят алгоритъм разделя думата по дължина низ от 7 до 3 знака. 7 - ширината, в този случай, комбинация от символи по-кратък от три знака да се използва никакво специално значение.
7 символи - един вариант (домати)
6 знака - 2 вариант (домати ,, OMIDOR)
5 символа - 3 варианти (домати ,, Omidi, Мидори)
4 характер - 4 изпълнение (PDMI, Omidi Mido, IDOR)
3 символи - 5 опции (РОМ, Международната морска, МФП, IDO, DOR)
Като цяло сме получили от думата ДОМАТ 15 различни комбинации от букви.
Всички тези 15 комбинации сложих в речника. Същата Речникът съдържа всички нови комбинации образувани от други думи от речника. На следващо място, думата за търсене е взето и по същия начин разделен на поднизове, и е принуден да се организира мач с речник на комбинации от букви. Всички операция се записват в събирането и подредени по степента на сходство.
Проблеми на реализацията на размита търсене
По мое мнение основният проблем тук - скоростта на търсене. Трябва да се отбележи, че преди да се кодът, който ви предлагаме, аз написах една статия за ефективността на междинни структури от данни и се опитах много опции за посредническите структури и алгоритми.
Тъй като всички извършени под формата на формула на работния лист, основният начин за подобряване на производителността - че всяка формула не се разчита колекцията си от писмо лексика комбинации и използва резултатите от работния ден. Това беше направено чрез глобалната структура. Все пак, всичко това означава, че формулата не проследява промените в случаите, когато масива. Това означава, че се смята, че границите Когато статичното и рядко се променя.
Надявам се да намерите тази функционалност полезно. Ако имате това решение по някаква причина не дойде, или се нуждаят от сериозна промяна, а след това да ме уведомите, може би ще го промените като доста интересна тема.