Данная тема возникла как результат эволюции Простой метрики сходства текстовых строк. В процессе развития задача изменилась, область примененя сместилась, а сама процедура уже никак не вписывается в категорию "простой". Итак, на данный момент мы имеем UDF TxtSimIndex_Nx2(), которая находит в указанном списке (списке поиска) наиболее подходящие ключевые словосочетания из другого списка (справочника). В качестве результата выдаёт таблицу с номером самого подходящего ключа и степень его сходства для каждой строки списка поиска.
В файле SimTextIdx_Vlad - решение под конкретную задачу от Vlad_i_mir, где индексирование запускается кнопкой. В файле SimTextIdx - другие вариации на ту же тему: реализация как макросом, таки непосредственным вводом UDF в ячейку. На последнем листе проверочный расчёт метрики сходства для отдельно взятой пары строк. При желании можно поэкспериментировать с настройками.
Принцип работы и настроечные параметры описываются в старой теме, а также в обрывочных коммениариях в файле. Прописывал всё, честно признаться, очень сумбурно. Сомневаюсь, что найдётся много желающих углубляться внутрь. Ну а на пользовательском уровне, разобраться, думаю, можно. Спрашивайте, если где чего непонятно.
Данная тема возникла как результат эволюции Простой метрики сходства текстовых строк. В процессе развития задача изменилась, область примененя сместилась, а сама процедура уже никак не вписывается в категорию "простой". Итак, на данный момент мы имеем UDF TxtSimIndex_Nx2(), которая находит в указанном списке (списке поиска) наиболее подходящие ключевые словосочетания из другого списка (справочника). В качестве результата выдаёт таблицу с номером самого подходящего ключа и степень его сходства для каждой строки списка поиска.
В файле SimTextIdx_Vlad - решение под конкретную задачу от Vlad_i_mir, где индексирование запускается кнопкой. В файле SimTextIdx - другие вариации на ту же тему: реализация как макросом, таки непосредственным вводом UDF в ячейку. На последнем листе проверочный расчёт метрики сходства для отдельно взятой пары строк. При желании можно поэкспериментировать с настройками.
Принцип работы и настроечные параметры описываются в старой теме, а также в обрывочных коммениариях в файле. Прописывал всё, честно признаться, очень сумбурно. Сомневаюсь, что найдётся много желающих углубляться внутрь. Ну а на пользовательском уровне, разобраться, думаю, можно. Спрашивайте, если где чего непонятно.Формуляр
Саня, спасибо! Такой вопрос: если увеличить константы "FRAG_REPT_LIM_1" и "WORD_NUM_LIM_1" это приведёт только к увеличению времени расчёта и потребляемых ресурсов или это отразиться ещё на чём-то?
Саня, спасибо! Такой вопрос: если увеличить константы "FRAG_REPT_LIM_1" и "WORD_NUM_LIM_1" это приведёт только к увеличению времени расчёта и потребляемых ресурсов или это отразиться ещё на чём-то?Vlad_i_mir
Сами константы влияют только на ресурсы. Но в реальности я пока ни разу в их ограничение не упирался. Думаю, справочник на несколько тыс. записейможет потянуть. Если нет, нужно будет, видимо, группировать по городам. Время увеличится, когда увеличится объём самой информации в справочнике. Пустые записи просто игнорируются.
Сами константы влияют только на ресурсы. Но в реальности я пока ни разу в их ограничение не упирался. Думаю, справочник на несколько тыс. записейможет потянуть. Если нет, нужно будет, видимо, группировать по городам. Время увеличится, когда увеличится объём самой информации в справочнике. Пустые записи просто игнорируются.Формуляр
Доброго времени суток, перешел с ветки про нечеткий поиск за помощью:
В приложенном файле нужно на первый лист подтянуть значения аналитики (вторая колонка) со второго листа. Попробовал разобраться с помощью =fuzzylookup, но, ввиду очень большого справочника (больше, чем массив поиска), обработка файла оказалась ооочень долгой и результаты оказались совсем неоднозначные.
С функцией TxtSimIndex_Nx2 не пойму как работать. Получится ли использовать эту функцию в данном случае?
Очень рассчитываю на вашу помощь
Доброго времени суток, перешел с ветки про нечеткий поиск за помощью:
В приложенном файле нужно на первый лист подтянуть значения аналитики (вторая колонка) со второго листа. Попробовал разобраться с помощью =fuzzylookup, но, ввиду очень большого справочника (больше, чем массив поиска), обработка файла оказалась ооочень долгой и результаты оказались совсем неоднозначные.
С функцией TxtSimIndex_Nx2 не пойму как работать. Получится ли использовать эту функцию в данном случае?
Использовать можно. Только сперва нужно справочник в порядок привести: выкинуть всякий мусор и оставить реально ключевые слова (ну или номера), по которым происходит сравнение. Справочник в нынешнем виде со страшной силой жрёт память (поэтому в прилагаемом файле ограничен первыми 333 строками) и снижает качество сравнения за счёт огромного числа случайных несущественных совпадений.
PS: прошу извинить за замедленную реакцию, как-то пропустил ваш пост, а потом наткнулся случайно.
Использовать можно. Только сперва нужно справочник в порядок привести: выкинуть всякий мусор и оставить реально ключевые слова (ну или номера), по которым происходит сравнение. Справочник в нынешнем виде со страшной силой жрёт память (поэтому в прилагаемом файле ограничен первыми 333 строками) и снижает качество сравнения за счёт огромного числа случайных несущественных совпадений.
PS: прошу извинить за замедленную реакцию, как-то пропустил ваш пост, а потом наткнулся случайно.Формуляр
Формуляр, Александр, прошу помочь в разрешении следующей задачки. Во вложенном файле пример базы с которой работаю при помощи FindBestMatchTxt. Наша база увеличилась в разы и на данный момент в ней более 10000 контрагентов с разными адресами. Очень часто контрагенты располагаются на одной улице но в разных домах, скажем ул. Комсомола, 12 и ул. Комсомола, 14, TextSimilarity считает это 100% совпадением, но это не так. Как настроить более точно и тонко поиск по адресу. Спасибо
ЗЫ. Программирования касался косвенно поэтому прошу объяснить более доступно.
Формуляр, Александр, прошу помочь в разрешении следующей задачки. Во вложенном файле пример базы с которой работаю при помощи FindBestMatchTxt. Наша база увеличилась в разы и на данный момент в ней более 10000 контрагентов с разными адресами. Очень часто контрагенты располагаются на одной улице но в разных домах, скажем ул. Комсомола, 12 и ул. Комсомола, 14, TextSimilarity считает это 100% совпадением, но это не так. Как настроить более точно и тонко поиск по адресу. Спасибо
ЗЫ. Программирования касался косвенно поэтому прошу объяснить более доступно.biokir
Вставил более свежую версию FindBestMatchTxt(). Добавлено сравнение цифр и фрагментов короче 2-х символов. Сравнение стало точнее, не уверен, правда, что от этого лучше. Но со скоростью сложнее... В качестве слабой меры можно убрать условное форматирование и пресчёт TextSimilarity(). Давно подбирался к задаче сравнения адресов через индексирование по справочникам. Сейчас довольно занят. В течение недели что-нибудь придумаем.
Вставил более свежую версию FindBestMatchTxt(). Добавлено сравнение цифр и фрагментов короче 2-х символов. Сравнение стало точнее, не уверен, правда, что от этого лучше. Но со скоростью сложнее... В качестве слабой меры можно убрать условное форматирование и пресчёт TextSimilarity(). Давно подбирался к задаче сравнения адресов через индексирование по справочникам. Сейчас довольно занят. В течение недели что-нибудь придумаем.Формуляр
Ещё вопросы: База сравнения, значит, порядка 10000, а какой длины обрабатываемый список на 1ом листе? Нужно ли его каждый раз обрабатывать целиком? Или в него добавляются отдельные записи и всё пересчитывать не нужно?
biokir, ну тогда попробуйте F=1.
Ещё вопросы: База сравнения, значит, порядка 10000, а какой длины обрабатываемый список на 1ом листе? Нужно ли его каждый раз обрабатывать целиком? Или в него добавляются отдельные записи и всё пересчитывать не нужно?Формуляр
Формуляр, F=1 пробовал все вернулось к первоначальной проблеме, остановился на 0.2, так как это оптимально.
Ответы: Список бывает и больше самой базы. Каждый раз он обрабатывается целиком. Пересчитывать необходимо каждый раз по новому (специфика работы).
Александр, нашел на форуме еще одно Ваше творение SimTextX, там проводится поиск по аббревиатурам и это здорово, так как у меня тоже есть похожие проблемы. Вчера тестировал на базе и столкнулся с тем, что в списках бывает несколько контрагентов расположенных по одному и тому же адресу, но наименование их разные. Попробовал сцепить наименование и адрес, но результат только ухудшился. При сравнении отдельно адреса и наименования ничего не изменилось, только увеличилось время на обработку. Как можно сделать так чтобы первостепенно проверялся адрес, при нахождении нужного проверялось наименование контрагента как в SimTextX. Кстати столкнулся еще с такой вещью, после обработки списка при выполнении в нем манипуляций с фильтрами он пересчитывается заново, мне кажется было бы удобнее добавить "баттончик" при клике на который производилась операция сверки посредством макроса. Как думаете?
Формуляр, F=1 пробовал все вернулось к первоначальной проблеме, остановился на 0.2, так как это оптимально.
Ответы: Список бывает и больше самой базы. Каждый раз он обрабатывается целиком. Пересчитывать необходимо каждый раз по новому (специфика работы).
Александр, нашел на форуме еще одно Ваше творение SimTextX, там проводится поиск по аббревиатурам и это здорово, так как у меня тоже есть похожие проблемы. Вчера тестировал на базе и столкнулся с тем, что в списках бывает несколько контрагентов расположенных по одному и тому же адресу, но наименование их разные. Попробовал сцепить наименование и адрес, но результат только ухудшился. При сравнении отдельно адреса и наименования ничего не изменилось, только увеличилось время на обработку. Как можно сделать так чтобы первостепенно проверялся адрес, при нахождении нужного проверялось наименование контрагента как в SimTextX. Кстати столкнулся еще с такой вещью, после обработки списка при выполнении в нем манипуляций с фильтрами он пересчитывается заново, мне кажется было бы удобнее добавить "баттончик" при клике на который производилась операция сверки посредством макроса. Как думаете?biokir
столкнулся с тем, что в списках бывает несколько контрагентов расположенных по одному и тому же адресу, но наименование их разные.
Будем решать проблемы в порядке поступления. В принципе, если база упорядочена по адресам, можно отслеживать число повторов и в них потом искать по наименованию.
после обработки списка при выполнении в нем манипуляций с фильтрами он пересчитывается заново, мне кажется было бы удобнее добавить "баттончик" при клике на который производилась операция сверки посредством макроса.
Мысль абсолютно правильная. На больших объёмах я так обычно и делаю. Можно, впрочем, просто отключить автоматический пересчёт.
столкнулся с тем, что в списках бывает несколько контрагентов расположенных по одному и тому же адресу, но наименование их разные.
Будем решать проблемы в порядке поступления. В принципе, если база упорядочена по адресам, можно отслеживать число повторов и в них потом искать по наименованию.
после обработки списка при выполнении в нем манипуляций с фильтрами он пересчитывается заново, мне кажется было бы удобнее добавить "баттончик" при клике на который производилась операция сверки посредством макроса.
Мысль абсолютно правильная. На больших объёмах я так обычно и делаю. Можно, впрочем, просто отключить автоматический пересчёт.Формуляр
biokir, Стоит отметить, что база адресов поддерживается в весьма аккуратном состоянии. (Если не считать хаотически разбросанных включений типа "НЕТ ТЕРРИТОРИАЛЬНОГО ОТДЕЛЕНИЯ"). Но, с точки зрения формального поиска, в ней много лишних "букав", которые не только съедают вычислительные ресурсы, но и снижают точность сравнения. Я написал UDF, которая оставляет только "уличную" часть адреса, её и будем использовать при индексировании списка. [vba]
Код
Public Function StreetAdr(adrStr As String) As String StreetAdr = Trim$(Mid$(adrStr, InStrRev(adrStr, ",", InStrRev(adrStr, "д.") - 3) + 1, 99)) End Function
[/vba] Прошу обработать ею весь ст-ц C вашей базы, экспортировать в обычный текстовый формат, зазиповать и выложить. Думаю, в 100К должно уместиться. Если не влезет, выложите, сколько получится. Мне это нужно для отладки на реальном объёме с реальнной спецификой данных.
biokir, Стоит отметить, что база адресов поддерживается в весьма аккуратном состоянии. (Если не считать хаотически разбросанных включений типа "НЕТ ТЕРРИТОРИАЛЬНОГО ОТДЕЛЕНИЯ"). Но, с точки зрения формального поиска, в ней много лишних "букав", которые не только съедают вычислительные ресурсы, но и снижают точность сравнения. Я написал UDF, которая оставляет только "уличную" часть адреса, её и будем использовать при индексировании списка. [vba]
Код
Public Function StreetAdr(adrStr As String) As String StreetAdr = Trim$(Mid$(adrStr, InStrRev(adrStr, ",", InStrRev(adrStr, "д.") - 3) + 1, 99)) End Function
[/vba] Прошу обработать ею весь ст-ц C вашей базы, экспортировать в обычный текстовый формат, зазиповать и выложить. Думаю, в 100К должно уместиться. Если не влезет, выложите, сколько получится. Мне это нужно для отладки на реальном объёме с реальнной спецификой данных.Формуляр
Оставить только улицу для того чтобы сэкономить ресурсы это правильно, но как же быть с городом, ведь контрагенты в разных городах. А как знаешь ул. Ленина есть в каждом городе РФ
Формуляр, Александр, добрый день!
Попробую, сейчас завалили работой, пока не когда.
Оставить только улицу для того чтобы сэкономить ресурсы это правильно, но как же быть с городом, ведь контрагенты в разных городах. А как знаешь ул. Ленина есть в каждом городе РФ biokir
Ну я же не предлагаю уничтожить их как класс. Просто для поиска они ни к чему, тем более выяснилось, что могут быть контрагенты с абсолютно одинаковыми адресами. Тут хоть Ленина, хоть Тюленинина, придётся 2ым слоем по названию искать.
Ну я же не предлагаю уничтожить их как класс. Просто для поиска они ни к чему, тем более выяснилось, что могут быть контрагенты с абсолютно одинаковыми адресами. Тут хоть Ленина, хоть Тюленинина, придётся 2ым слоем по названию искать.Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Понедельник, 06.10.2014, 21:00
Формуляр, Александр, понятно что контрагенты с абсолютно одинаковыми адресами, не получится ли так что контрагент на улице Тюленина 1 в городе Н и на той же улице в городе М будет иметь один адрес по улице, но разный по городам... Или ты хочешь делать все последовательно, город, улица, дом, наименование.
Формуляр, Александр, понятно что контрагенты с абсолютно одинаковыми адресами, не получится ли так что контрагент на улице Тюленина 1 в городе Н и на той же улице в городе М будет иметь один адрес по улице, но разный по городам... Или ты хочешь делать все последовательно, город, улица, дом, наименование.biokir
biokir, абсолютной гарантии быть, конечно, не может, но мне кажется, вероятность полного совпадения и "уличной части" адреса и названия контрагента пренебрежимо мала. По крайней мере, значительно меньше вероятности всех прочих ошибок, которые всё равно придётся контролировать и исправлять руками.
biokir, абсолютной гарантии быть, конечно, не может, но мне кажется, вероятность полного совпадения и "уличной части" адреса и названия контрагента пренебрежимо мала. По крайней мере, значительно меньше вероятности всех прочих ошибок, которые всё равно придётся контролировать и исправлять руками.Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Вторник, 07.10.2014, 21:51
Формуляр, Александр, ожиданный результат в принципе)))) Может не будем думать о времени обработки пока, и вернем в адрес город. А то в противном случае мне придется не только нашу базу причесывать, но и базу которая необходимо проверить (пришедшую).
убирать форму собственности нельзя, так как есть много контрагентов отличающихся только этой формой. Например: ООО Стоматология №1 ОАО Стоматология №1 МУЗ Стоматология №1 ЗАО Стоматология №1 и это не предел
Формуляр, Александр, ожиданный результат в принципе)))) Может не будем думать о времени обработки пока, и вернем в адрес город. А то в противном случае мне придется не только нашу базу причесывать, но и базу которая необходимо проверить (пришедшую).
убирать форму собственности нельзя, так как есть много контрагентов отличающихся только этой формой. Например: ООО Стоматология №1 ОАО Стоматология №1 МУЗ Стоматология №1 ЗАО Стоматология №1 и это не пределbiokir
убирать форму собственности нельзя, так как есть много контрагентов отличающихся только этой формой.
И что, у них при этом совпадает "уличный" адрес? Сравнение по названию происходит после поиска по адресу. К тому же, я писал "за исключением случаев, когда она является дифференцирующим признаком." В 99% случаев это не так. Я, при этом, говорю про столбец базы, по которому производится поиск. Никто не запретит иметь в той же таблице други ст-цы с любой бесполезной или полезной информацией.
убирать форму собственности нельзя, так как есть много контрагентов отличающихся только этой формой.
И что, у них при этом совпадает "уличный" адрес? Сравнение по названию происходит после поиска по адресу. К тому же, я писал "за исключением случаев, когда она является дифференцирующим признаком." В 99% случаев это не так. Я, при этом, говорю про столбец базы, по которому производится поиск. Никто не запретит иметь в той же таблице други ст-цы с любой бесполезной или полезной информацией.Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Среда, 08.10.2014, 17:01
Ситуации бывают такие, что контрагент имел форму МУЗ, но потом изменил на ООО. У нас в базе исправлено, а в приходящей еще нет. А адреса совпадают и к сожалению таких не маленький процент.
Ситуации бывают такие, что контрагент имел форму МУЗ, но потом изменил на ООО. У нас в базе исправлено, а в приходящей еще нет. А адреса совпадают и к сожалению таких не маленький процент.biokir