Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Копирование адреса из текста - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование адреса из текста (Макросы/Sub)
Копирование адреса из текста
emkub Дата: Суббота, 19.03.2016, 19:23 | Сообщение № 21
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
StoTisteg, повторюсь, данные берутся из разных источников (ходовых сайтов), и на выходе я получаю две колонки: "заголовок объявления" и "текст объявления". Адрес может находиться и там, и там. А может не находиться нигде :)
Говоря ОЧЕНЬ образно - задался целью сделать "интеллектуальную" систему распознавания адреса внутри любого текста. И да, я прекрасно понимаю всю несовершенность такой системы. Но СЕЙЧАС интересна не конечная цель, доведённая до совершенства, а сама реализация.
 
Ответить
СообщениеStoTisteg, повторюсь, данные берутся из разных источников (ходовых сайтов), и на выходе я получаю две колонки: "заголовок объявления" и "текст объявления". Адрес может находиться и там, и там. А может не находиться нигде :)
Говоря ОЧЕНЬ образно - задался целью сделать "интеллектуальную" систему распознавания адреса внутри любого текста. И да, я прекрасно понимаю всю несовершенность такой системы. Но СЕЙЧАС интересна не конечная цель, доведённая до совершенства, а сама реализация.

Автор - emkub
Дата добавления - 19.03.2016 в 19:23
StoTisteg Дата: Суббота, 19.03.2016, 19:37 | Сообщение № 22
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
emkub, подозреваю, что VBA — не ПРОЛОГ и не Lisp и под написание систем ИИ не очень заточен :D


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
Сообщениеemkub, подозреваю, что VBA — не ПРОЛОГ и не Lisp и под написание систем ИИ не очень заточен :D

Автор - StoTisteg
Дата добавления - 19.03.2016 в 19:37
StoTisteg Дата: Суббота, 19.03.2016, 19:39 | Сообщение № 23
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
А чисто алгоритмически — нужно считать количество признаков адреса в строке и искать минимальную подстроку, которая их все содержит...


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеА чисто алгоритмически — нужно считать количество признаков адреса в строке и искать минимальную подстроку, которая их все содержит...

Автор - StoTisteg
Дата добавления - 19.03.2016 в 19:39
emkub Дата: Суббота, 19.03.2016, 19:59 | Сообщение № 24
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
StoTisteg
что VBA — не ПРОЛОГ и не Lisp и под написание систем ИИ не очень заточен :D

Это да! :) Тут, как говорится, "что имеем" :)
А чисто алгоритмически — нужно считать количество признаков адреса в строке и искать минимальную подстроку, которая их все содержит...

Думаю идти от обратного, т.к. "общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры. Хочу попробовать убрать "лишнее" из той части текста, где МОЖЕТ содержаться номер дома. Сейчас улица выносится легко, а добавив щепотку регулярок, она (улица) будет вытаскиваться из текста, независимо от падежа.
Однако, от помощи умных людей не откажусь.
Если интересно, приложу файлик, что имею на данный момент.
 
Ответить
СообщениеStoTisteg
что VBA — не ПРОЛОГ и не Lisp и под написание систем ИИ не очень заточен :D

Это да! :) Тут, как говорится, "что имеем" :)
А чисто алгоритмически — нужно считать количество признаков адреса в строке и искать минимальную подстроку, которая их все содержит...

Думаю идти от обратного, т.к. "общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры. Хочу попробовать убрать "лишнее" из той части текста, где МОЖЕТ содержаться номер дома. Сейчас улица выносится легко, а добавив щепотку регулярок, она (улица) будет вытаскиваться из текста, независимо от падежа.
Однако, от помощи умных людей не откажусь.
Если интересно, приложу файлик, что имею на данный момент.

Автор - emkub
Дата добавления - 19.03.2016 в 19:59
StoTisteg Дата: Суббота, 19.03.2016, 20:19 | Сообщение № 25
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
"общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры

Всё зависит от того, что мы назовём признаком адреса. Ваш Капитан Очевидность :) Я бы ввёл элементы обучаемости и пусть сама себе паттерны ищет...


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
Сообщение
"общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры

Всё зависит от того, что мы назовём признаком адреса. Ваш Капитан Очевидность :) Я бы ввёл элементы обучаемости и пусть сама себе паттерны ищет...

Автор - StoTisteg
Дата добавления - 19.03.2016 в 20:19
emkub Дата: Суббота, 19.03.2016, 20:36 | Сообщение № 26
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Паттерны, обучаемость...
эх... был бы я такой умный... не задавал бы тут глупых вопросов :) А так, кроме желания сделать что-то интересное, нет ничего (в смысле знаний). Но это уже оффтоп.
 
Ответить
СообщениеПаттерны, обучаемость...
эх... был бы я такой умный... не задавал бы тут глупых вопросов :) А так, кроме желания сделать что-то интересное, нет ничего (в смысле знаний). Но это уже оффтоп.

Автор - emkub
Дата добавления - 19.03.2016 в 20:36
Wasilich Дата: Суббота, 19.03.2016, 21:17 | Сообщение № 27
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Я тут подумал и придумал, если перебирая адреса искать их в массиве строк то проблему можно решить. Пусть не так быстро как в примере, но не вручную. Смотрим идею.
[vba]
Код
Sub poisk()
  Dim ps&, ul$, ok As Range
  With Sheets("Улицы")
    For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
      ul = .Cells(i, 1)
      Set ok = Range("L:L").Find(what:=ul, LookIn:=xlValues, lookat:=xlPart, MatchCase:=True)
      If Not ok Is Nothing Then Cells(ok.Row, ok.Column - 1) = ul
    Next
  End With
End Sub
[/vba]
[p.s.]Пока курил, понял одну загвоздку, если улицы в текстах будут повторяться увы, следующая найдена не будет.[/p.s.]
К сообщению приложен файл: 7503033.rar (30.5 Kb)


Сообщение отредактировал Wasilich - Суббота, 19.03.2016, 22:12
 
Ответить
СообщениеЯ тут подумал и придумал, если перебирая адреса искать их в массиве строк то проблему можно решить. Пусть не так быстро как в примере, но не вручную. Смотрим идею.
[vba]
Код
Sub poisk()
  Dim ps&, ul$, ok As Range
  With Sheets("Улицы")
    For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
      ul = .Cells(i, 1)
      Set ok = Range("L:L").Find(what:=ul, LookIn:=xlValues, lookat:=xlPart, MatchCase:=True)
      If Not ok Is Nothing Then Cells(ok.Row, ok.Column - 1) = ul
    Next
  End With
End Sub
[/vba]
[p.s.]Пока курил, понял одну загвоздку, если улицы в текстах будут повторяться увы, следующая найдена не будет.[/p.s.]

Автор - Wasilich
Дата добавления - 19.03.2016 в 21:17
StoTisteg Дата: Суббота, 19.03.2016, 21:21 | Сообщение № 28
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Всё не так ужасно, как звучит. Просто берём большую базу объявлений из одного НП, берём список названий его улиц (только названий, без родовых названий, например, ул. Ленина --> Ленина) и составляем список ближайших окружений, т. е. цепочек символов без разрывов и цифр. Напускаем программу, снабжённую этим списком, на другую большую базу объявлений. На строки, где улица не найдена, снова напускаем генератор признаков и так до тех пор, пока программа не научится находить улицы везде.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеВсё не так ужасно, как звучит. Просто берём большую базу объявлений из одного НП, берём список названий его улиц (только названий, без родовых названий, например, ул. Ленина --> Ленина) и составляем список ближайших окружений, т. е. цепочек символов без разрывов и цифр. Напускаем программу, снабжённую этим списком, на другую большую базу объявлений. На строки, где улица не найдена, снова напускаем генератор признаков и так до тех пор, пока программа не научится находить улицы везде.

Автор - StoTisteg
Дата добавления - 19.03.2016 в 21:21
emkub Дата: Суббота, 19.03.2016, 21:33 | Сообщение № 29
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
StoTisteg, я не программист. Честно говоря, мне тяжело даже понять то, что вы написали :(
Wasilich, просмотрел текст макроса, запустил его в том же файле примера... и... он сделал тоже самое, что и вложенный в пример макрос - просто извлёк названия улиц. На счёт скорости, вроде даже медленнее "родного" (не уверен, может повлияло неотключенное обновление экрана).
Уточните пожалуйста идею словами.


Сообщение отредактировал emkub - Суббота, 19.03.2016, 21:35
 
Ответить
СообщениеStoTisteg, я не программист. Честно говоря, мне тяжело даже понять то, что вы написали :(
Wasilich, просмотрел текст макроса, запустил его в том же файле примера... и... он сделал тоже самое, что и вложенный в пример макрос - просто извлёк названия улиц. На счёт скорости, вроде даже медленнее "родного" (не уверен, может повлияло неотключенное обновление экрана).
Уточните пожалуйста идею словами.

Автор - emkub
Дата добавления - 19.03.2016 в 21:33
Wasilich Дата: Суббота, 19.03.2016, 21:39 | Сообщение № 30
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
он сделал тоже самое, что и вложенный в пример макрос
А я не видел макроса! В примере 13 модулей. Ща посмотрю.
[p.s.]И да, нашел, в 12-м модуле. И вроде чуть быстрее. Напрасно трудился. :D [/p.s.]


Сообщение отредактировал Wasilich - Суббота, 19.03.2016, 22:07
 
Ответить
Сообщение
он сделал тоже самое, что и вложенный в пример макрос
А я не видел макроса! В примере 13 модулей. Ща посмотрю.
[p.s.]И да, нашел, в 12-м модуле. И вроде чуть быстрее. Напрасно трудился. :D [/p.s.]

Автор - Wasilich
Дата добавления - 19.03.2016 в 21:39
emkub Дата: Суббота, 19.03.2016, 22:11 | Сообщение № 31
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Ребят, если не затруднит, помогите красиво вписать формулу и регулярку в макрос цикла. За одно увидите, на каком этапе идёт процесс. Всё необходимое находится в прикреплённом файле.
К сообщению приложен файл: __.xlsm (82.7 Kb)
 
Ответить
СообщениеРебят, если не затруднит, помогите красиво вписать формулу и регулярку в макрос цикла. За одно увидите, на каком этапе идёт процесс. Всё необходимое находится в прикреплённом файле.

Автор - emkub
Дата добавления - 19.03.2016 в 22:11
abtextime Дата: Воскресенье, 20.03.2016, 01:10 | Сообщение № 32
Группа: Проверенные
Ранг: Ветеран
Сообщений: 828
Репутация: 117 ±
Замечаний: 0% ±

Excel 2010
Постараюсь простым языком изложить идею с самообучающейся системой.

1. База знаний объекта накапливается в двухмерной символьной матрице NхM. M - максимально число знаков в объявлении (условные строки длиной в M столбцов), N - растет с пополнением базы (собственно сами строки).
2. Каждая строка матрицы представляет собой символьный паттерн, описывающий в формализованном виде "строение" символьной строки после названия улицы. При этом каждая буква и каждая цифра имеет в этой строке одинаковый код, к примеру все буквы заменяются на "а", все цифры на "0". Остальные символы остаются без изменений. В эту же матрицу (для этого есть разные методы) прописываются 2 числа, описывающие начало и конец подстроки, формирующей номер дома.
3. Для начала проводится первоначальное обучение. Например, обработав имеющуюся информацию разработанным макросом, о котором тут идет речь, заполняется начальное состояние вышеупомянутой матрицы.
4. Дальнейшее обучение производится следующим образом: а) если система некорректно выявляет номер дома, которого реально в строке нет, то данный паттерн удаляется из матрицы, б) если система в строке не выявляет номер дома, а реально он есть, то путем выделения этого адреса паттерн добавляется в матрицу.

Всё. Правда, есть нюанс. N теоретически может составлять L^M, где L - число разных символов в паттерне. Кажется, что страшно, но на практике каждый новый паттерн добавляет всего M байтов. Даже 1000 паттернов в сутки дает плюс M килобайтов. Неприятно, но терпимо. За три года - M мегабайтов.
 
Ответить
СообщениеПостараюсь простым языком изложить идею с самообучающейся системой.

1. База знаний объекта накапливается в двухмерной символьной матрице NхM. M - максимально число знаков в объявлении (условные строки длиной в M столбцов), N - растет с пополнением базы (собственно сами строки).
2. Каждая строка матрицы представляет собой символьный паттерн, описывающий в формализованном виде "строение" символьной строки после названия улицы. При этом каждая буква и каждая цифра имеет в этой строке одинаковый код, к примеру все буквы заменяются на "а", все цифры на "0". Остальные символы остаются без изменений. В эту же матрицу (для этого есть разные методы) прописываются 2 числа, описывающие начало и конец подстроки, формирующей номер дома.
3. Для начала проводится первоначальное обучение. Например, обработав имеющуюся информацию разработанным макросом, о котором тут идет речь, заполняется начальное состояние вышеупомянутой матрицы.
4. Дальнейшее обучение производится следующим образом: а) если система некорректно выявляет номер дома, которого реально в строке нет, то данный паттерн удаляется из матрицы, б) если система в строке не выявляет номер дома, а реально он есть, то путем выделения этого адреса паттерн добавляется в матрицу.

Всё. Правда, есть нюанс. N теоретически может составлять L^M, где L - число разных символов в паттерне. Кажется, что страшно, но на практике каждый новый паттерн добавляет всего M байтов. Даже 1000 паттернов в сутки дает плюс M килобайтов. Неприятно, но терпимо. За три года - M мегабайтов.

Автор - abtextime
Дата добавления - 20.03.2016 в 01:10
StoTisteg Дата: Воскресенье, 20.03.2016, 01:23 | Сообщение № 33
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Всё ещё менее страшно, если приплюсовать сокращение паттернов. Если один паттерн является подстрокой другого, то при ошибке false positive удаляем короткий, а при false negative — длинный. И да, при достаточно большой и достаточно похожей на "боевые" базе для обучения оно закончится довольно быстро.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеВсё ещё менее страшно, если приплюсовать сокращение паттернов. Если один паттерн является подстрокой другого, то при ошибке false positive удаляем короткий, а при false negative — длинный. И да, при достаточно большой и достаточно похожей на "боевые" базе для обучения оно закончится довольно быстро.

Автор - StoTisteg
Дата добавления - 20.03.2016 в 01:23
Wasilich Дата: Воскресенье, 20.03.2016, 10:04 | Сообщение № 34
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Как вариант. Если № дома написан сразу после улицы.
К сообщению приложен файл: DOM.xls (27.0 Kb)
 
Ответить
СообщениеКак вариант. Если № дома написан сразу после улицы.

Автор - Wasilich
Дата добавления - 20.03.2016 в 10:04
emkub Дата: Воскресенье, 20.03.2016, 11:57 | Сообщение № 35
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Wasilich, интересное решение. Правда есть несколько серьёзных "НО". Нельзя менять синтаксис в исходной ячейке (убирать запятые).
Можете словами написать, как именно он работает?
 
Ответить
СообщениеWasilich, интересное решение. Правда есть несколько серьёзных "НО". Нельзя менять синтаксис в исходной ячейке (убирать запятые).
Можете словами написать, как именно он работает?

Автор - emkub
Дата добавления - 20.03.2016 в 11:57
Wasilich Дата: Воскресенье, 20.03.2016, 12:03 | Сообщение № 36
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Нельзя менять синтаксис в исходной ячейке (убирать запятые)
Ну это исправимо.
Можете словами написать, как именно он работает?
Кто "он"? Макрос?
 
Ответить
Сообщение
Нельзя менять синтаксис в исходной ячейке (убирать запятые)
Ну это исправимо.
Можете словами написать, как именно он работает?
Кто "он"? Макрос?

Автор - Wasilich
Дата добавления - 20.03.2016 в 12:03
emkub Дата: Воскресенье, 20.03.2016, 12:08 | Сообщение № 37
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Да, по какому принципу работает макрос?
 
Ответить
СообщениеДа, по какому принципу работает макрос?

Автор - emkub
Дата добавления - 20.03.2016 в 12:08
Wasilich Дата: Воскресенье, 20.03.2016, 13:05 | Сообщение № 38
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Да, по какому принципу работает макрос?
Ну это же можно посмотреть запустив макрос по F8. Исправил, синтаксис не меняет.
[vba]
Код
Sub tekst()
  ps = Range("K" & Rows.Count).End(xlUp).Row '№ последней строки
  For I = 1 To ps
    ul = Cells(I, 11) 'название улицы
    st = Replace(Cells(I, 12), ",", " ") 'строка в переменную без запятых
    st = Application.Trim(st) & " " 'сжимаем пробелы и добавляем один в конец
    If ul <> "" Then 'если улица не пусто
       ns = InStr(st, ul) + Len(ul) + 1 'определяем № символа в строке после улицы
       SD = Mid(st, ns) 'берем часть строки после улицы
       KS = InStr(SD, " ") 'определяем № пробела в части строки
       ND = Mid(SD, 1, KS) 'выбираем символы из части строки до пробела
       Cells(I, 11) = Cells(I, 11) & " " & ND 'дописываем символи к улице
    End If
  Next
End Sub
[/vba]


Сообщение отредактировал Wasilich - Воскресенье, 20.03.2016, 13:08
 
Ответить
Сообщение
Да, по какому принципу работает макрос?
Ну это же можно посмотреть запустив макрос по F8. Исправил, синтаксис не меняет.
[vba]
Код
Sub tekst()
  ps = Range("K" & Rows.Count).End(xlUp).Row '№ последней строки
  For I = 1 To ps
    ul = Cells(I, 11) 'название улицы
    st = Replace(Cells(I, 12), ",", " ") 'строка в переменную без запятых
    st = Application.Trim(st) & " " 'сжимаем пробелы и добавляем один в конец
    If ul <> "" Then 'если улица не пусто
       ns = InStr(st, ul) + Len(ul) + 1 'определяем № символа в строке после улицы
       SD = Mid(st, ns) 'берем часть строки после улицы
       KS = InStr(SD, " ") 'определяем № пробела в части строки
       ND = Mid(SD, 1, KS) 'выбираем символы из части строки до пробела
       Cells(I, 11) = Cells(I, 11) & " " & ND 'дописываем символи к улице
    End If
  Next
End Sub
[/vba]

Автор - Wasilich
Дата добавления - 20.03.2016 в 13:05
emkub Дата: Воскресенье, 20.03.2016, 13:16 | Сообщение № 39
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 171
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Информативно!!!!
Погоняю, посмотрю, как можно совместить этот макрос с моей идеей реализации.
Кстати, сейчас теоретически набросал алгоритм, как корректно вычленить номер. Пока загвоздка алгоритма - убрать лишние знаки ЗА номером дома.
СУТЬ алгоритма:
1) исходная колонка из 9 любых знаков, которые встречаются ЗА названием улицы.
2) удалить такую связку "символ-символ-СЛЕШ-символ-символ"
3) удалить "ул.,"
4) удалить(очистить) ячейку, если первый символ НЕ пробел, НЕ запятая, НЕ цифра.

Пока вот тут и запнулся. Кто-нибудь может помочь с реализацией этого алгоритма? И вообще, кто что скажет по поводу такого принципа?


Сообщение отредактировал emkub - Воскресенье, 20.03.2016, 13:31
 
Ответить
СообщениеИнформативно!!!!
Погоняю, посмотрю, как можно совместить этот макрос с моей идеей реализации.
Кстати, сейчас теоретически набросал алгоритм, как корректно вычленить номер. Пока загвоздка алгоритма - убрать лишние знаки ЗА номером дома.
СУТЬ алгоритма:
1) исходная колонка из 9 любых знаков, которые встречаются ЗА названием улицы.
2) удалить такую связку "символ-символ-СЛЕШ-символ-символ"
3) удалить "ул.,"
4) удалить(очистить) ячейку, если первый символ НЕ пробел, НЕ запятая, НЕ цифра.

Пока вот тут и запнулся. Кто-нибудь может помочь с реализацией этого алгоритма? И вообще, кто что скажет по поводу такого принципа?

Автор - emkub
Дата добавления - 20.03.2016 в 13:16
al-Ex Дата: Воскресенье, 20.03.2016, 14:19 | Сообщение № 40
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
помочь с реализацией этого алгоритма
А чем Василича вариант не устраивает? С Вашими тестовыми образцами он отлично справляется.


Сообщение отредактировал al-Ex - Воскресенье, 20.03.2016, 14:22
 
Ответить
Сообщение
помочь с реализацией этого алгоритма
А чем Василича вариант не устраивает? С Вашими тестовыми образцами он отлично справляется.

Автор - al-Ex
Дата добавления - 20.03.2016 в 14:19
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Копирование адреса из текста (Макросы/Sub)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!