Комментарии к коду расширил и перенес на отдельный лист Там не все просто, не все очевидно Если мне дать пол-года, чтобы подзабыть, повторно разбираться буду долго Вообще, не раз замечал, что именно собственные произведения восстанавливаю в памяти с наибольшим трудом. Многое со временем воспринимается как слишком заумное
Комментарии к коду расширил и перенес на отдельный лист Там не все просто, не все очевидно Если мне дать пол-года, чтобы подзабыть, повторно разбираться буду долго Вообще, не раз замечал, что именно собственные произведения восстанавливаю в памяти с наибольшим трудом. Многое со временем воспринимается как слишком заумноеv__step
Скорее всего, основное назначение позднего связывания - обучение (так же, как и использование переменных без объявления типа)
Абсолютно не согласен! Позднее связывание только вредит обучению, т.к. делает код хоть и более коротким, но зато труднее понимаемым. Да и подсказки о свойствах и методах после ввода точки при позднем связывании не показываются... Точно так же как использование переменных без Option Explicit хотя и сокращает код, но сильно повышает вероятность ошибок и затрудняет поиск их причины.
Quote (v__step)
Если мне дать пол-года, чтобы подзабыть, повторно разбираться буду долго Вообще, не раз замечал, что именно собственные произведения восстанавливаю в памяти с наибольшим трудом. Многое со временем воспринимается как слишком заумное
А вот это - таки-да! Именно из-за боязни возникновения затруднений через месяц-два после написания прогаммки при необходимости анализа своего кода (в общем-то, получается - из лени) я всегда и пишу достаточно подробные комментарии в своих процедурах. (Просто лет 15-17 назад у меня был большой облом с халтурой, когда нужно было срочно за хорошие бабки модернизировать собственную программу на ассемблере, а в исходниках комментариев я не писал… Науки, как выяснилось, хватило на всю жизнь...) А по поводу моей любви к позднему связыванию, так это не только из-за сокращения кода, но и из-за того, что я могу при этом надеяться, что написанные мною макросы, будучи выдернутыми (мною же, например) из книги-образца, лежащего в "копилке", и помещёными в другую, рабочую, наверняка продолжат работать.
Quote (v__step)
Скорее всего, основное назначение позднего связывания - обучение (так же, как и использование переменных без объявления типа)
Абсолютно не согласен! Позднее связывание только вредит обучению, т.к. делает код хоть и более коротким, но зато труднее понимаемым. Да и подсказки о свойствах и методах после ввода точки при позднем связывании не показываются... Точно так же как использование переменных без Option Explicit хотя и сокращает код, но сильно повышает вероятность ошибок и затрудняет поиск их причины.
Quote (v__step)
Если мне дать пол-года, чтобы подзабыть, повторно разбираться буду долго Вообще, не раз замечал, что именно собственные произведения восстанавливаю в памяти с наибольшим трудом. Многое со временем воспринимается как слишком заумное
А вот это - таки-да! Именно из-за боязни возникновения затруднений через месяц-два после написания прогаммки при необходимости анализа своего кода (в общем-то, получается - из лени) я всегда и пишу достаточно подробные комментарии в своих процедурах. (Просто лет 15-17 назад у меня был большой облом с халтурой, когда нужно было срочно за хорошие бабки модернизировать собственную программу на ассемблере, а в исходниках комментариев я не писал… Науки, как выяснилось, хватило на всю жизнь...) А по поводу моей любви к позднему связыванию, так это не только из-за сокращения кода, но и из-за того, что я могу при этом надеяться, что написанные мною макросы, будучи выдернутыми (мною же, например) из книги-образца, лежащего в "копилке", и помещёными в другую, рабочую, наверняка продолжат работать.Alex_ST
Это хорошо - меня надо поменьше слушать (на самом деле я кавалер ордена Ивана Сусанина 3-х степеней ) Мне трудно даются импровизации и всякого рода блицы. Особенно на темы подобные раннему связыванию, которые для меня давно закрыты (ну почти закрыты)
Quote (Alex_ST)
лет 15-17 назад ... собственную программу на ассемблере
Вот это класс! А я все никак не второпаю, почему меня здесь всё время вроде бы как видят насквозь Здорово! Лёша, ты гигант!
Quote (nerv)
Жду предложений и идей
Саш, пойми меня правильно, мне надо чуток передохнуть после трудов праведных. Ты предлагаешь красивые, неожиданные и интересные решения, но я сейчас просто не в состоянии их переварить!
Quote (Alex_ST)
Абсолютно не согласен!
Это хорошо - меня надо поменьше слушать (на самом деле я кавалер ордена Ивана Сусанина 3-х степеней ) Мне трудно даются импровизации и всякого рода блицы. Особенно на темы подобные раннему связыванию, которые для меня давно закрыты (ну почти закрыты)
Quote (Alex_ST)
лет 15-17 назад ... собственную программу на ассемблере
Вот это класс! А я все никак не второпаю, почему меня здесь всё время вроде бы как видят насквозь Здорово! Лёша, ты гигант!
Quote (nerv)
Жду предложений и идей
Саш, пойми меня правильно, мне надо чуток передохнуть после трудов праведных. Ты предлагаешь красивые, неожиданные и интересные решения, но я сейчас просто не в состоянии их переварить!v__step
С уважением, Владимир
Сообщение отредактировал v__step - Пятница, 17.02.2012, 22:35
Я никуда не пропадал! У Вас чудесная, глубокая тема Я всё посмотрю, но сразу замечу, что когда немного "вклинился" в Вашу задачку, с большим трудом нащупал тот алгоритм, который подходит для регэкспов И то, чуда не случилось - эффективность революционно не увеличилась Сейчас немного позанимался "фитнесом" - нашёл несколько ошибок, их надо срочно подправить (файл ведь народ качает)
Я никуда не пропадал! У Вас чудесная, глубокая тема Я всё посмотрю, но сразу замечу, что когда немного "вклинился" в Вашу задачку, с большим трудом нащупал тот алгоритм, который подходит для регэкспов И то, чуда не случилось - эффективность революционно не увеличилась Сейчас немного позанимался "фитнесом" - нашёл несколько ошибок, их надо срочно подправить (файл ведь народ качает)v__step
В продолжение темы нечетного поиска и сравнения строк: 1. функция для "сравнения" строк разной длинны 2. функция для поиска наилучшего совпадения
InText ("сравнение" строк разной длинны) Параметры: string1 - строка (обязательный) string2 - строка (обязательный) section - количество символов, по которому определяется совпадение (не обязательный). По умолчанию 3 compare - режим сравнения (не обязательный). По умолчанию vbTextCompare Возвращает: процент вхождения строки меньшей длинны в строку большей длинны.
FindBetterMatch (поиск наилучшего совпадения) Параметры: array/range - массив или диапазон string - строка (обязательный) section - количество символов, по которому определяется совпадение (не обязательный). По умолчанию 3 compare - режим сравнения (не обязательный). По умолчанию vbTextCompare Возвращает: массив, состоящий из двух элементов: 0 - наилучшее совпадение 1 - процент вхождения строки меньшей длинны в строку большей длинны
p.s.: изначально была мысль искать вхождение одной строки в другую с учетом позиции слов. В данной реализации порядок слов не важен, хотя на мой взгляд это не совсем правильно.
UPD: увеличена точность сравнения за счет отсева дублирующих совпадений, добавлены комментарии
Всем привет! )
В продолжение темы нечетного поиска и сравнения строк: 1. функция для "сравнения" строк разной длинны 2. функция для поиска наилучшего совпадения
InText ("сравнение" строк разной длинны) Параметры: string1 - строка (обязательный) string2 - строка (обязательный) section - количество символов, по которому определяется совпадение (не обязательный). По умолчанию 3 compare - режим сравнения (не обязательный). По умолчанию vbTextCompare Возвращает: процент вхождения строки меньшей длинны в строку большей длинны.
FindBetterMatch (поиск наилучшего совпадения) Параметры: array/range - массив или диапазон string - строка (обязательный) section - количество символов, по которому определяется совпадение (не обязательный). По умолчанию 3 compare - режим сравнения (не обязательный). По умолчанию vbTextCompare Возвращает: массив, состоящий из двух элементов: 0 - наилучшее совпадение 1 - процент вхождения строки меньшей длинны в строку большей длинны
p.s.: изначально была мысль искать вхождение одной строки в другую с учетом позиции слов. В данной реализации порядок слов не важен, хотя на мой взгляд это не совсем правильно.
UPD: увеличена точность сравнения за счет отсева дублирующих совпадений, добавлены комментарииnerv
Уважаемые, а почему вы сравниваете по строкам? А если слова идут в разнобой, и сортировка может не выровнять ситуацию. Надо сравнивать по столбцам.
Уважаемые, а почему вы сравниваете по строкам? А если слова идут в разнобой, и сортировка может не выровнять ситуацию. Надо сравнивать по столбцам.Паттттт
Паттттт, покажи, как надо Паттттт, покажи, как надо nerv
Ну вот смотри файл. Там ты ника не отсортируешь столбцы так, чтобы в одной строке находились оба текста для сравнения, и твои проги не принменимы. А таких текстов много.
Quote (nerv)
Паттттт, покажи, как надо Паттттт, покажи, как надо nerv
Ну вот смотри файл. Там ты ника не отсортируешь столбцы так, чтобы в одной строке находились оба текста для сравнения, и твои проги не принменимы. А таких текстов много.Паттттт
Помогите, пожалуйста. У меня есть два столбца с текстом, например В и С(смотрите файл в прикреплении). Текст в столбцах похожий, но всё же отличается. Например В первом столбце (В) в первой ячейке написано "Абито ОАО". Во втором столбце (С) написано "ОАО "Абитоо". Эти два варианта текста одинаковы, только В столбце С ОАО находится перед словом, само слово взято в кавычки, и в нём написана лишняя буква "о". Но всё же эти тексты обозначают одну и ту же компанию Абито, и, следовательно совпадают. Мне нужна функция или макрос VBA которые могли бы сравнить оба столбца определять такие тексты (как описанный выше) как совпадающие (или частично совпадающие с указанием процента совпадения) и желательно, чтобы указывался Порядковый номер ячейки, например, выписывался из столбца А (если левее обоих столбцов в столбце (А) написать порядковые номера ячеек (Пронумеровать ячейки попорядку сверху вниз), наппример в моём файле (файл прикреплён) в столбце (D)(или в выделенном мной столбце) функция или макрос, к примеру, нашли совпадающими тексты "Абито ОАО" в столбце (В) и "ОАО "Абитоо" в столбце (С) и написали в выделенном третьем столбце цифру "1", что означет (Это вам пояснение, а в функцию или макрос это загонять не надо, пусть просто пишет цифры из столбца (А)), что совпадение слову "ОАО "Абитоо" столбца (С) найдено в ячейке 1 столбца (В), цифра 1 взята из столбца (А). Или можно вместо цифр из столбца (А) писать адрес ячейки (в нашем примере вместо цифры "1" можно написать "В3". Помогите, пожалуйста. Файл прикреплён.
А мне надо, чтобы потом я ориентируясь на данные номеров ячеек или их адресов (смотри текст выше), я, например, мог бы сопоставлять по ним цифровые значения в столбцах (С) и (Е)(см. файл в прикреплении) (ну то есть соответствует ли числа в ячейках столбцов (С) и (Е), соседних с ячейками столбцов (В) и (D) в которых были найдены совпадающими тексты (По моему файлу совпадает текст в ячейках (В3) и (D6), следовательно мне надо в выделенный столбец выписать либо цыфру из столбца (А) (в нашем случае "1" или адрес ячейки (В3), чтобы потом функциями эксель сравнить значения ячеек (С3) и (Е6), и потом растянуть функцию, и она срванила бы все числа, соответствующие совпадающим текстам в столбцах (В) и (D) Поэтому я прошу написать функцию или макрос, которые при нахождении совпадения в столбцах (В) и (D) в выделенном столбце писали бы либо номер ячейки столбца (В)(в которой было найдено совпадение текста с текстом в столбце (D)), взятый из столбца (А)(в моём примере "1"), либо адрес ячейки столбца (В)(в которой было найдено совпадение текста с текстом в столбце (D)(в моём пример (В3)) Помогите, пожалуйста.
Помогите, пожалуйста. У меня есть два столбца с текстом, например В и С(смотрите файл в прикреплении). Текст в столбцах похожий, но всё же отличается. Например В первом столбце (В) в первой ячейке написано "Абито ОАО". Во втором столбце (С) написано "ОАО "Абитоо". Эти два варианта текста одинаковы, только В столбце С ОАО находится перед словом, само слово взято в кавычки, и в нём написана лишняя буква "о". Но всё же эти тексты обозначают одну и ту же компанию Абито, и, следовательно совпадают. Мне нужна функция или макрос VBA которые могли бы сравнить оба столбца определять такие тексты (как описанный выше) как совпадающие (или частично совпадающие с указанием процента совпадения) и желательно, чтобы указывался Порядковый номер ячейки, например, выписывался из столбца А (если левее обоих столбцов в столбце (А) написать порядковые номера ячеек (Пронумеровать ячейки попорядку сверху вниз), наппример в моём файле (файл прикреплён) в столбце (D)(или в выделенном мной столбце) функция или макрос, к примеру, нашли совпадающими тексты "Абито ОАО" в столбце (В) и "ОАО "Абитоо" в столбце (С) и написали в выделенном третьем столбце цифру "1", что означет (Это вам пояснение, а в функцию или макрос это загонять не надо, пусть просто пишет цифры из столбца (А)), что совпадение слову "ОАО "Абитоо" столбца (С) найдено в ячейке 1 столбца (В), цифра 1 взята из столбца (А). Или можно вместо цифр из столбца (А) писать адрес ячейки (в нашем примере вместо цифры "1" можно написать "В3". Помогите, пожалуйста. Файл прикреплён.
А мне надо, чтобы потом я ориентируясь на данные номеров ячеек или их адресов (смотри текст выше), я, например, мог бы сопоставлять по ним цифровые значения в столбцах (С) и (Е)(см. файл в прикреплении) (ну то есть соответствует ли числа в ячейках столбцов (С) и (Е), соседних с ячейками столбцов (В) и (D) в которых были найдены совпадающими тексты (По моему файлу совпадает текст в ячейках (В3) и (D6), следовательно мне надо в выделенный столбец выписать либо цыфру из столбца (А) (в нашем случае "1" или адрес ячейки (В3), чтобы потом функциями эксель сравнить значения ячеек (С3) и (Е6), и потом растянуть функцию, и она срванила бы все числа, соответствующие совпадающим текстам в столбцах (В) и (D) Поэтому я прошу написать функцию или макрос, которые при нахождении совпадения в столбцах (В) и (D) в выделенном столбце писали бы либо номер ячейки столбца (В)(в которой было найдено совпадение текста с текстом в столбце (D)), взятый из столбца (А)(в моём примере "1"), либо адрес ячейки столбца (В)(в которой было найдено совпадение текста с текстом в столбце (D)(в моём пример (В3)) Помогите, пожалуйста.Паттттт
2 nerv: Саш, каюсь, это я на Планете дал анониму ссылку на этот топик чтобы он здесь сам подобрал подходящее ему решение. Я думал, что человек разбирающийся и сам сможет прицепить одну из выкладывавшихся здесь процедур к своим целям... А он почему-то решил, что здесь можно что-то у кого-то ПОТРЕБОВАТЬ. Твой вопрос "СКОЛЬКО?" при такой постановке вопроса абсолютно логичен.
2 nerv: Саш, каюсь, это я на Планете дал анониму ссылку на этот топик чтобы он здесь сам подобрал подходящее ему решение. Я думал, что человек разбирающийся и сам сможет прицепить одну из выкладывавшихся здесь процедур к своим целям... А он почему-то решил, что здесь можно что-то у кого-то ПОТРЕБОВАТЬ. Твой вопрос "СКОЛЬКО?" при такой постановке вопроса абсолютно логичен.Alex_ST
Я не пойму, чем Вам не нравится FuzzyVLOOKUP ? Может, Вы просто не умеете ей пользоваться? Тогда смотрите пример. Я не пойму, чем Вам не нравится FuzzyVLOOKUP ? Может, Вы просто не умеете ей пользоваться? Тогда смотрите пример.Alex_ST
Она: 1. Жутко тормозит 2. Имеет не 100% результат. Кстати я хочу предложить свой вариант этой функции. Смотри файл. (чтобы не было путанницы твою функцию я переименовал в ИНТЕЛЛЕКТУАЛЬНОЕ_СРАВНЕНИЕ Обе функции неправильно находят соответствие слову "Новатек", А твоя ещё и неправильно находит соответствие слову "Бобель-Вобель"
Quote (Alex_ST)
Я не пойму, чем Вам не нравится FuzzyVLOOKUP ? Может, Вы просто не умеете ей пользоваться? Тогда смотрите пример. Я не пойму, чем Вам не нравится FuzzyVLOOKUP ? Может, Вы просто не умеете ей пользоваться? Тогда смотрите пример.Alex_ST
Она: 1. Жутко тормозит 2. Имеет не 100% результат. Кстати я хочу предложить свой вариант этой функции. Смотри файл. (чтобы не было путанницы твою функцию я переименовал в ИНТЕЛЛЕКТУАЛЬНОЕ_СРАВНЕНИЕ Обе функции неправильно находят соответствие слову "Новатек", А твоя ещё и неправильно находит соответствие слову "Бобель-Вобель"Паттттт
Идея, что всё должно работать быстро и угадывать мысли пльзователя оригинальностью не блещет.
Quote (Паттттт)
Кстати я хочу предложить свой вариант этой функции.
Так и не понял в чём преимущество вашего варианта.
Но сама задачка в качестве полигона - неплоха, раз оказалась всем функциям не по зубам. По этому поводу довинтил кой-чего в своём варианте textSimilarity(). Ввёл коэффициент "балансировки" F, который регулирует влияние "лишних" (есть только в text2) диад по сравнению с "недостающими" (есть только в text1). При F = 0 textSimilarity() работает как метрика вхождения text1 в text2. При F = 1 работает как прежний вариант, то есть учитывает отличия в обе стороны в равной степени. При этом для любого F < 1 функция должна терять свою симметричность. А поскоьку симметричность была мне дорога, пришлось искусственно её восстанавливать: грубо говоря, за образец всегда берётся меньшая из строк. В ф-циях поиска на базе TxtSimilarityList(), наоборот используется несимметричное сравнение. Поэтому для достоверного отобрахения результата добавил в textSimilarity() режим асимметричного сравнения (при asym = true). В прилагаемом варианте длина Q-граммы Q=2 и балансировочный коэффициент F=0.5
Quote (Паттттт)
1. Жутко тормозит 2. Имеет не 100% результат.
Идея, что всё должно работать быстро и угадывать мысли пльзователя оригинальностью не блещет.
Quote (Паттттт)
Кстати я хочу предложить свой вариант этой функции.
Так и не понял в чём преимущество вашего варианта.
Но сама задачка в качестве полигона - неплоха, раз оказалась всем функциям не по зубам. По этому поводу довинтил кой-чего в своём варианте textSimilarity(). Ввёл коэффициент "балансировки" F, который регулирует влияние "лишних" (есть только в text2) диад по сравнению с "недостающими" (есть только в text1). При F = 0 textSimilarity() работает как метрика вхождения text1 в text2. При F = 1 работает как прежний вариант, то есть учитывает отличия в обе стороны в равной степени. При этом для любого F < 1 функция должна терять свою симметричность. А поскоьку симметричность была мне дорога, пришлось искусственно её восстанавливать: грубо говоря, за образец всегда берётся меньшая из строк. В ф-циях поиска на базе TxtSimilarityList(), наоборот используется несимметричное сравнение. Поэтому для достоверного отобрахения результата добавил в textSimilarity() режим асимметричного сравнения (при asym = true). В прилагаемом варианте длина Q-граммы Q=2 и балансировочный коэффициент F=0.5Формуляр
Саня (Формуляр) , очень здорово работает! Но ты настолько углубился в тему лингвистического анализа вообще и нечёткого поиска в частности, что твой лексикон стал не понятен простым смертным Слова в комментариях типа "Рекурсивное заполнение сортированного списка из двоичного дерева", "Выравнивание двоичного дерева по глубине" и т.д. тебе, я не сомневаюсь, понятны, а для меня, например - набор знакомых слов, сложенных в предложение, не имеющее никакого смысла Аналогично и с
Quote (Формуляр)
Ввёл коэффициент "балансировки" F, который регулирует влияние "лишних" (есть только в text2) диад по сравнению с "недостающими" (есть только в text1)
Ты не мог бы свой замечательный (на самом деле!) файл из крайнего поста почистить от следов разработки и причесать так, чтобы "на виду" была пара основных функций (я так понимаю, что это TextSimilarity и FindBestMatchTxt), а остальные - Private?
Саня (Формуляр) , очень здорово работает! Но ты настолько углубился в тему лингвистического анализа вообще и нечёткого поиска в частности, что твой лексикон стал не понятен простым смертным Слова в комментариях типа "Рекурсивное заполнение сортированного списка из двоичного дерева", "Выравнивание двоичного дерева по глубине" и т.д. тебе, я не сомневаюсь, понятны, а для меня, например - набор знакомых слов, сложенных в предложение, не имеющее никакого смысла Аналогично и с
Quote (Формуляр)
Ввёл коэффициент "балансировки" F, который регулирует влияние "лишних" (есть только в text2) диад по сравнению с "недостающими" (есть только в text1)
Ты не мог бы свой замечательный (на самом деле!) файл из крайнего поста почистить от следов разработки и причесать так, чтобы "на виду" была пара основных функций (я так понимаю, что это TextSimilarity и FindBestMatchTxt), а остальные - Private?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Понедельник, 17.09.2012, 13:42
При F = 0 textSimilarity() работает как метрика вхождения text1 в text2. При F = 1 работает как прежний вариант, то есть учитывает отличия в обе стороны в равной степени.
с лихвой хватит. Все остальное считаю бессмысленным.
стоит в примере заменить Пусконаладочная компания "ПУСК" на Пусконаладочная компания "ПУСК" добавим еще немного слов и функция перестанет работать. Зачем изгаляться, если приблизительная длинна сравниваемых фрагментов нам заранее не известна (и вряд ли будет)?
Более того, исходя из аргумента выше, ставлю под сомнение надобность F = 1. Считаю, что вся эта метрика сводиться к "вхождение меньшей строки в большую". Остальное танцы с бубном
Если кого-то интересует мое мнение, то этого
Quote (Формуляр)
При F = 0 textSimilarity() работает как метрика вхождения text1 в text2. При F = 1 работает как прежний вариант, то есть учитывает отличия в обе стороны в равной степени.
с лихвой хватит. Все остальное считаю бессмысленным.
стоит в примере заменить Пусконаладочная компания "ПУСК" на Пусконаладочная компания "ПУСК" добавим еще немного слов и функция перестанет работать. Зачем изгаляться, если приблизительная длинна сравниваемых фрагментов нам заранее не известна (и вряд ли будет)?
Более того, исходя из аргумента выше, ставлю под сомнение надобность F = 1. Считаю, что вся эта метрика сводиться к "вхождение меньшей строки в большую". Остальное танцы с бубном nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук