StoTisteg, повторюсь, данные берутся из разных источников (ходовых сайтов), и на выходе я получаю две колонки: "заголовок объявления" и "текст объявления". Адрес может находиться и там, и там. А может не находиться нигде :) Говоря ОЧЕНЬ образно - задался целью сделать "интеллектуальную" систему распознавания адреса внутри любого текста. И да, я прекрасно понимаю всю несовершенность такой системы. Но СЕЙЧАС интересна не конечная цель, доведённая до совершенства, а сама реализация.
StoTisteg, повторюсь, данные берутся из разных источников (ходовых сайтов), и на выходе я получаю две колонки: "заголовок объявления" и "текст объявления". Адрес может находиться и там, и там. А может не находиться нигде :) Говоря ОЧЕНЬ образно - задался целью сделать "интеллектуальную" систему распознавания адреса внутри любого текста. И да, я прекрасно понимаю всю несовершенность такой системы. Но СЕЙЧАС интересна не конечная цель, доведённая до совершенства, а сама реализация.emkub
А чисто алгоритмически — нужно считать количество признаков адреса в строке и искать минимальную подстроку, которая их все содержит...
Думаю идти от обратного, т.к. "общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры. Хочу попробовать убрать "лишнее" из той части текста, где МОЖЕТ содержаться номер дома. Сейчас улица выносится легко, а добавив щепотку регулярок, она (улица) будет вытаскиваться из текста, независимо от падежа. Однако, от помощи умных людей не откажусь. Если интересно, приложу файлик, что имею на данный момент.
А чисто алгоритмически — нужно считать количество признаков адреса в строке и искать минимальную подстроку, которая их все содержит...
Думаю идти от обратного, т.к. "общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры. Хочу попробовать убрать "лишнее" из той части текста, где МОЖЕТ содержаться номер дома. Сейчас улица выносится легко, а добавив щепотку регулярок, она (улица) будет вытаскиваться из текста, независимо от падежа. Однако, от помощи умных людей не откажусь. Если интересно, приложу файлик, что имею на данный момент.emkub
"общий признак адреса" может содержаться абсолютно в любой части текста, где есть цифры
Всё зависит от того, что мы назовём признаком адреса. Ваш Капитан Очевидность Я бы ввёл элементы обучаемости и пусть сама себе паттерны ищет...StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Паттерны, обучаемость... эх... был бы я такой умный... не задавал бы тут глупых вопросов А так, кроме желания сделать что-то интересное, нет ничего (в смысле знаний). Но это уже оффтоп.
Паттерны, обучаемость... эх... был бы я такой умный... не задавал бы тут глупых вопросов А так, кроме желания сделать что-то интересное, нет ничего (в смысле знаний). Но это уже оффтоп.emkub
Я тут подумал и придумал, если перебирая адреса искать их в массиве строк то проблему можно решить. Пусть не так быстро как в примере, но не вручную. Смотрим идею. [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.]
Я тут подумал и придумал, если перебирая адреса искать их в массиве строк то проблему можно решить. Пусть не так быстро как в примере, но не вручную. Смотрим идею. [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
Всё не так ужасно, как звучит. Просто берём большую базу объявлений из одного НП, берём список названий его улиц (только названий, без родовых названий, например, ул. Ленина --> Ленина) и составляем список ближайших окружений, т. е. цепочек символов без разрывов и цифр. Напускаем программу, снабжённую этим списком, на другую большую базу объявлений. На строки, где улица не найдена, снова напускаем генератор признаков и так до тех пор, пока программа не научится находить улицы везде.
Всё не так ужасно, как звучит. Просто берём большую базу объявлений из одного НП, берём список названий его улиц (только названий, без родовых названий, например, ул. Ленина --> Ленина) и составляем список ближайших окружений, т. е. цепочек символов без разрывов и цифр. Напускаем программу, снабжённую этим списком, на другую большую базу объявлений. На строки, где улица не найдена, снова напускаем генератор признаков и так до тех пор, пока программа не научится находить улицы везде.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
StoTisteg, я не программист. Честно говоря, мне тяжело даже понять то, что вы написали :( Wasilich, просмотрел текст макроса, запустил его в том же файле примера... и... он сделал тоже самое, что и вложенный в пример макрос - просто извлёк названия улиц. На счёт скорости, вроде даже медленнее "родного" (не уверен, может повлияло неотключенное обновление экрана). Уточните пожалуйста идею словами.
StoTisteg, я не программист. Честно говоря, мне тяжело даже понять то, что вы написали :( Wasilich, просмотрел текст макроса, запустил его в том же файле примера... и... он сделал тоже самое, что и вложенный в пример макрос - просто извлёк названия улиц. На счёт скорости, вроде даже медленнее "родного" (не уверен, может повлияло неотключенное обновление экрана). Уточните пожалуйста идею словами.emkub
Сообщение отредактировал emkub - Суббота, 19.03.2016, 21:35
Ребят, если не затруднит, помогите красиво вписать формулу и регулярку в макрос цикла. За одно увидите, на каком этапе идёт процесс. Всё необходимое находится в прикреплённом файле.
Ребят, если не затруднит, помогите красиво вписать формулу и регулярку в макрос цикла. За одно увидите, на каком этапе идёт процесс. Всё необходимое находится в прикреплённом файле.emkub
Постараюсь простым языком изложить идею с самообучающейся системой.
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
Всё ещё менее страшно, если приплюсовать сокращение паттернов. Если один паттерн является подстрокой другого, то при ошибке false positive удаляем короткий, а при false negative — длинный. И да, при достаточно большой и достаточно похожей на "боевые" базе для обучения оно закончится довольно быстро.
Всё ещё менее страшно, если приплюсовать сокращение паттернов. Если один паттерн является подстрокой другого, то при ошибке false positive удаляем короткий, а при false negative — длинный. И да, при достаточно большой и достаточно похожей на "боевые" базе для обучения оно закончится довольно быстро.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Wasilich, интересное решение. Правда есть несколько серьёзных "НО". Нельзя менять синтаксис в исходной ячейке (убирать запятые). Можете словами написать, как именно он работает?
Wasilich, интересное решение. Правда есть несколько серьёзных "НО". Нельзя менять синтаксис в исходной ячейке (убирать запятые). Можете словами написать, как именно он работает?emkub
Ну это же можно посмотреть запустив макрос по 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
Ну это же можно посмотреть запустив макрос по 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
Информативно!!!! Погоняю, посмотрю, как можно совместить этот макрос с моей идеей реализации. Кстати, сейчас теоретически набросал алгоритм, как корректно вычленить номер. Пока загвоздка алгоритма - убрать лишние знаки ЗА номером дома. СУТЬ алгоритма: 1) исходная колонка из 9 любых знаков, которые встречаются ЗА названием улицы. 2) удалить такую связку "символ-символ-СЛЕШ-символ-символ" 3) удалить "ул.," 4) удалить(очистить) ячейку, если первый символ НЕ пробел, НЕ запятая, НЕ цифра.
Пока вот тут и запнулся. Кто-нибудь может помочь с реализацией этого алгоритма? И вообще, кто что скажет по поводу такого принципа?
Информативно!!!! Погоняю, посмотрю, как можно совместить этот макрос с моей идеей реализации. Кстати, сейчас теоретически набросал алгоритм, как корректно вычленить номер. Пока загвоздка алгоритма - убрать лишние знаки ЗА номером дома. СУТЬ алгоритма: 1) исходная колонка из 9 любых знаков, которые встречаются ЗА названием улицы. 2) удалить такую связку "символ-символ-СЛЕШ-символ-символ" 3) удалить "ул.," 4) удалить(очистить) ячейку, если первый символ НЕ пробел, НЕ запятая, НЕ цифра.
Пока вот тут и запнулся. Кто-нибудь может помочь с реализацией этого алгоритма? И вообще, кто что скажет по поводу такого принципа?emkub
Сообщение отредактировал emkub - Воскресенье, 20.03.2016, 13:31