Принципы "просто" не объединяются. Разные подходы дают разные метрики. По длине больше подходит огурец, а по толщине - баклажан. И как их дальше объединять?Формуляр
Внимательнее прочитай мой последний пост, и полностью. Я там сказал, как объединять принципы (что должно быть в общей функции).
Quote (Формуляр)
Принципы "просто" не объединяются. Разные подходы дают разные метрики. По длине больше подходит огурец, а по толщине - баклажан. И как их дальше объединять?Формуляр
Внимательнее прочитай мой последний пост, и полностью. Я там сказал, как объединять принципы (что должно быть в общей функции).Паттттт
Паттттт, тогда Вам в этой теме вообще нечего делать. Вы достали всех своей навязчивостью. Этот раздел не предназначен для размещения частных заказов. Увижу еще одно(любое!) Ваше сообщение в этой теме - получите минус и от меня.
Quote (Паттттт)
Как я уже писал, я очень плохо разбираюсь в VBA
Паттттт, тогда Вам в этой теме вообще нечего делать. Вы достали всех своей навязчивостью. Этот раздел не предназначен для размещения частных заказов. Увижу еще одно(любое!) Ваше сообщение в этой теме - получите минус и от меня.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Вообще-то, конечно, тут 95% мусора начиная с ЭТОГО поста Но среди мусора есть и пара-тройка нужных вещей: ЭТО от Формуляра (за исключением первых строк с цитатами Праттт'a) ЭТО, ЭТО от него же А остальное - в помойку.
Вообще-то, конечно, тут 95% мусора начиная с ЭТОГО поста Но среди мусора есть и пара-тройка нужных вещей: ЭТО от Формуляра (за исключением первых строк с цитатами Праттт'a) ЭТО, ЭТО от него же А остальное - в помойку.Alex_ST
Я думаю, что надо, чтобы в функции реализовывался принцип сравнения по: 1. сравнение на предмет полного совпадениятекста в стоблцах; 2. если не совпало - принципы анализа по дидам (с выборным Q как у Вас, Формуляр), по ключевым словам (у Вас, Формуляр), первым 3-4 и/или последним 3-4 буквам каждого текста (т.е. поиск искомого текста в столбце по его первым или последним буквам (в количестве 3-4, можно сделать выборную переменную), по словам (ну например северо-запад ищется поочереди сначала по слову север, затем - по слову запад), по расшифровке (МГУ надо искать как по сокращённому варианту (МГУ), так и по полному (Московский Государственный Университет)(с учётом падежей), с возможностью поиска по точному сопадению искомого слова со словом из столбца, в котором ищем (скажем если мы ищем КС, то нужно иметь возможность задать совпадение так, чтобы оно совпало с ООО "КС", а не с, например, ОАО "Ксенофон"), с отбросом в обоих текстах (искомом и столбце, в котором ищем) знаков препинания и лишних пробелов (т.е. фразы сравниваются так, будто в них удалены все знаки препинания и лишние пробелы). Вы же всё-равно пишете, что все решения надо дорабатывать. Может что-то получится с учётом моего мнения.Паттттт
И чем вам не нравится это мнение?
Quote (Паттттт)
Я думаю, что надо, чтобы в функции реализовывался принцип сравнения по: 1. сравнение на предмет полного совпадениятекста в стоблцах; 2. если не совпало - принципы анализа по дидам (с выборным Q как у Вас, Формуляр), по ключевым словам (у Вас, Формуляр), первым 3-4 и/или последним 3-4 буквам каждого текста (т.е. поиск искомого текста в столбце по его первым или последним буквам (в количестве 3-4, можно сделать выборную переменную), по словам (ну например северо-запад ищется поочереди сначала по слову север, затем - по слову запад), по расшифровке (МГУ надо искать как по сокращённому варианту (МГУ), так и по полному (Московский Государственный Университет)(с учётом падежей), с возможностью поиска по точному сопадению искомого слова со словом из столбца, в котором ищем (скажем если мы ищем КС, то нужно иметь возможность задать совпадение так, чтобы оно совпало с ООО "КС", а не с, например, ОАО "Ксенофон"), с отбросом в обоих текстах (искомом и столбце, в котором ищем) знаков препинания и лишних пробелов (т.е. фразы сравниваются так, будто в них удалены все знаки препинания и лишние пробелы). Вы же всё-равно пишете, что все решения надо дорабатывать. Может что-то получится с учётом моего мнения.Паттттт
Паттттт, я делаю последнее предупреждение. Если я ещё раз увижу хотя бы один Ваш офф пост, который может вызвать дискуссию, то больше отмены бана Вы не дождётесь
Паттттт, я делаю последнее предупреждение. Если я ещё раз увижу хотя бы один Ваш офф пост, который может вызвать дискуссию, то больше отмены бана Вы не дождётесьSerge_007
Дата: Понедельник, 22.10.2012, 12:05 |
Сообщение № 128
Группа: Гости
Здравствуйсте, уважаемые, вы тут конечно хороших вещей понавыписывали, но мне понадобилось получить результат сравнения не в виде одной строчки, а все возможные совпадения с определенным процентом. Допустим, пишется Имя Фамилия, и необходимо найти все совпадения, для которых процент похожести 99-97%. Пример списка:
Здравствуйсте, уважаемые, вы тут конечно хороших вещей понавыписывали, но мне понадобилось получить результат сравнения не в виде одной строчки, а все возможные совпадения с определенным процентом. Допустим, пишется Имя Фамилия, и необходимо найти все совпадения, для которых процент похожести 99-97%. Пример списка:
Вот что у меня получилось (см. архив). Надеюсь, кто-нибудь из экспертов сможет предложить варианты по улучшению процесса. А то перебирать 7000 вариантов вручную мне очень не хочется. Дело в том, что в списке довольно много неправильных фамилий, отличающихся от правильной только на одну букву. Хотелось бы найти такие фамилии и избавиться от них.
Вот что у меня получилось (см. архив). Надеюсь, кто-нибудь из экспертов сможет предложить варианты по улучшению процесса. А то перебирать 7000 вариантов вручную мне очень не хочется. Дело в том, что в списке довольно много неправильных фамилий, отличающихся от правильной только на одну букву. Хотелось бы найти такие фамилии и избавиться от них.
в списке довольно много неправильных фамилий, отличающихся от правильной только на одну букву. Хотелось бы найти такие фамилии и избавиться от них.
Как определить, какие "правильные", а какие нет? Файл с обменника качать не могу. 7000 фамилий никому не нужны. Сделайте короткий пример с описанием нужного результата и принципа работыи выкладывайте сюда.
Quote (n158)
в списке довольно много неправильных фамилий, отличающихся от правильной только на одну букву. Хотелось бы найти такие фамилии и избавиться от них.
Как определить, какие "правильные", а какие нет? Файл с обменника качать не могу. 7000 фамилий никому не нужны. Сделайте короткий пример с описанием нужного результата и принципа работыи выкладывайте сюда.Формуляр
В том то и дело, что определять надо на глаз. Коэффициент похожести может быть от 0.4 до 0.99, поэтому хотелось бы получить несколько вероятных значений. Для определения правильности я прикрутил ссылки на гугл. Например, фамилии Черкасов и Чераксов. Коэффициент 0.4444, после проверки в гугле, видим, что это один и тот-же автор. Я думаю, что для эффективной работы необходимо для каждой строчки получить 15 первых значений, отсортированных по коэффициенту похожести. Осталось придумать, как это реализовать, чтобы не надо было бы каждый раз значение в поле поиска вписывать и сортировать потом.
В том то и дело, что определять надо на глаз. Коэффициент похожести может быть от 0.4 до 0.99, поэтому хотелось бы получить несколько вероятных значений. Для определения правильности я прикрутил ссылки на гугл. Например, фамилии Черкасов и Чераксов. Коэффициент 0.4444, после проверки в гугле, видим, что это один и тот-же автор. Я думаю, что для эффективной работы необходимо для каждой строчки получить 15 первых значений, отсортированных по коэффициенту похожести. Осталось придумать, как это реализовать, чтобы не надо было бы каждый раз значение в поле поиска вписывать и сортировать потом.n158
Для поиска совпадений с образцом используем TextSimilarity() в асимметричном режиме: TextSimilarity(образец, целевая ст-ка, , 1) в константах модуля TextSim коэфф-т F = 0
Quote (n158)
для эффективной работы необходимо для каждой строчки получить 15 первых значений, отсортированных по коэффициенту похожести.
Похожести на что? На остальные 7000 строк? Что это даст? Как вы 15*7000 значений анализировать собираетесь?
Для поиска совпадений с образцом используем TextSimilarity() в асимметричном режиме: TextSimilarity(образец, целевая ст-ка, , 1) в константах модуля TextSim коэфф-т F = 0
Quote (n158)
для эффективной работы необходимо для каждой строчки получить 15 первых значений, отсортированных по коэффициенту похожести.
Похожести на что? На остальные 7000 строк? Что это даст? Как вы 15*7000 значений анализировать собираетесь?Формуляр
Необходимо понять, как я ищу сходства: без выборки мне пришлось сравнивать каждый файл с 7к файлов (т.е. 7к*7к), а после выборки 15 файлов, каждый файл сравнивается только с 15 файлами (7к*15). Надеюсь, так понятней.
К самому алгоритму поиска претензий нету. Все, что мне нужно, это получить для каждой строчки отдельный массив из 15-ти записей, отсортированных от максимального коэффициента к минимальному.
Quote (Формуляр)
Похожести на что? На остальные 7000 строк?
Именно так. В принципе, сортировка уже реализована в зачаточном виде в приложенном файле. Необходимо только реализовать автоматику.
Необходимо понять, как я ищу сходства: без выборки мне пришлось сравнивать каждый файл с 7к файлов (т.е. 7к*7к), а после выборки 15 файлов, каждый файл сравнивается только с 15 файлами (7к*15). Надеюсь, так понятней.
К самому алгоритму поиска претензий нету. Все, что мне нужно, это получить для каждой строчки отдельный массив из 15-ти записей, отсортированных от максимального коэффициента к минимальному.
Quote (Формуляр)
Похожести на что? На остальные 7000 строк?
Именно так. В принципе, сортировка уже реализована в зачаточном виде в приложенном файле. Необходимо только реализовать автоматику.n158
Кто ищет, тот найдет. Office 2007 RU Portable
Сообщение отредактировал n158 - Понедельник, 22.10.2012, 17:57
Начал разбираться в коде, заметил функцию TxtSimilarityList. Можно ее использовать для вывода результатов на страницу? Если да, то какое значение указывать для переменных topList() и listLim?
Некоторые наработки по моей проблеме:
Запуск продпрограммы кликом на определенную ячейку:
[vba]
Code
Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "" 'здесь Ваша процедура End If End Sub
В нашем случае, если клик в столбце с данными, то нужно скопировать содержимое выделенной ячейки в ячейку поиска.
Автоматическая сортировка:
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub [A1].CurrentRegion.Sort [A1], xlAscending, Header:=xlYes End Sub
Пока не тестировал, но предполагаю, что сортировка включится после того, как будет скопирована выделенная ячейка.
Начал разбираться в коде, заметил функцию TxtSimilarityList. Можно ее использовать для вывода результатов на страницу? Если да, то какое значение указывать для переменных topList() и listLim?
Некоторые наработки по моей проблеме:
Запуск продпрограммы кликом на определенную ячейку:
[vba]
Code
Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "" 'здесь Ваша процедура End If End Sub
В нашем случае, если клик в столбце с данными, то нужно скопировать содержимое выделенной ячейки в ячейку поиска.
Автоматическая сортировка:
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub [A1].CurrentRegion.Sort [A1], xlAscending, Header:=xlYes End Sub
TxtSimilarityList стоит использовать, если пишете свой собственный макрос. А так - есть готовая UDF TxtSimilarityRating: [vba]
Code
Public Function TxtSimilarityRating(lookup_value As Variant, lookup_array As Variant, _ listLim As Integer, Optional minLev As Double = 0) As Integer() 'Формирует список номеров строк, в порядке убывания сходства с образцом 'lookup_value - искомая строка (образец) 'lookup_array - массив поиска 'listLim - максимальная длина заполняемого списка 'minLev - минимальный уровень сходства
[/vba] Вводить - массивом.
Quote (n158)
Похожести на что? На остальные 7000 строк? Именно так.
И что будет означать отсутствие совпадений? У вас что, все фамилии должны обязательно повторяться?
TxtSimilarityList стоит использовать, если пишете свой собственный макрос. А так - есть готовая UDF TxtSimilarityRating: [vba]
Code
Public Function TxtSimilarityRating(lookup_value As Variant, lookup_array As Variant, _ listLim As Integer, Optional minLev As Double = 0) As Integer() 'Формирует список номеров строк, в порядке убывания сходства с образцом 'lookup_value - искомая строка (образец) 'lookup_array - массив поиска 'listLim - максимальная длина заполняемого списка 'minLev - минимальный уровень сходства
[/vba] Вводить - массивом.
Quote (n158)
Похожести на что? На остальные 7000 строк? Именно так.
И что будет означать отсутствие совпадений? У вас что, все фамилии должны обязательно повторяться?Формуляр
Именно то что я хотел. И сортировка не понадобилась. Осталось прикрутить изменение поисковой фразы при переходе с ячейки на ячейку и можно запускать обработку. Когда закончу, прикреплю, что получилось.
Именно то что я хотел. И сортировка не понадобилась. Осталось прикрутить изменение поисковой фразы при переходе с ячейки на ячейку и можно запускать обработку. Когда закончу, прикреплю, что получилось.n158
[/vba]в модуле SimText не думал, что кому-то понадобится столько ...
PS: Можно ещё выставить Q=3 для лучшей избирательности, если там нет фамилий короче 3х букв Впрочем, если и есть, врядли в них будет много ошибок.
Забыл ещё поправить [vba]
Code
Dim theTopList(1 To 10) As aSmlrtRes
[/vba]на [vba]
Code
Dim theTopList(1 To 15) As aSmlrtRes
[/vba]в модуле SimText не думал, что кому-то понадобится столько ...
PS: Можно ещё выставить Q=3 для лучшей избирательности, если там нет фамилий короче 3х букв Впрочем, если и есть, врядли в них будет много ошибок. Формуляр
Excel 2003 EN, 2013 EN
Сообщение отредактировал Формуляр - Вторник, 23.10.2012, 12:09
После тестирования оказалось, что 15 записей многовато будет, сократил до 10. Прикрутил автоматизацию, получилось весело. Правда не знаю, как зафиксировать области так, чтобы и результат был постоянно на виду и сортировка по записям работала. Разобрался уже с фиксированием. Сортировка нужна для того, чтобы после удаления записей не было пустых ячеек в массиве. Еще надо приделать кнопку остановки автоматического копирования, иначе трудно будет вставить новые данные (можно вставить, когда макросы отключены или перекинуть из другой колонки).
Фамилии и имена из трех букв и меньше присутствуют, так-что алгоритм не буду менять. Кстати, алгоритм не такой уж и медленный. Для проверки одной строчки по всему списку из 6866 элементов требуется всего 5с, проверял с таймером.
Выкладываю то, что получилось.
После тестирования оказалось, что 15 записей многовато будет, сократил до 10. Прикрутил автоматизацию, получилось весело. Правда не знаю, как зафиксировать области так, чтобы и результат был постоянно на виду и сортировка по записям работала. Разобрался уже с фиксированием. Сортировка нужна для того, чтобы после удаления записей не было пустых ячеек в массиве. Еще надо приделать кнопку остановки автоматического копирования, иначе трудно будет вставить новые данные (можно вставить, когда макросы отключены или перекинуть из другой колонки).
Фамилии и имена из трех букв и меньше присутствуют, так-что алгоритм не буду менять. Кстати, алгоритм не такой уж и медленный. Для проверки одной строчки по всему списку из 6866 элементов требуется всего 5с, проверял с таймером.