:: Visual Foxpro, Foxpro for DOS
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Олег, я вообще не ищу типы населенных пунктов (вернее не совсем так, они нужны для определения и упорядочивания адресных элементов). В общем красиво получается, нужно будет почехардить с порядком, и разные кривые комбинации погенерировать, посмотреть, как полетит. Но в первом приближении доволен. Продукт еще сырой, пока рано выкладывать.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Так, друзья. Меня предупреждали, что задачу красиво не решить, хотя я настроен приблизиться. Насколько получится - потом посмотрим, ее на работе все равно спросят, я ее бросить не могу. теперь.

Возникла такая засада - для выбора улицы я делаю (для каждой разбираемой адресной строки) курсор, выгребая по региону. На 100 записей рабоает около 60-70 секунд (замерял в течение дня, нагрузка на сервер разная, поэтому сильно это время не изменится). Как можно ускорить? Пока на уровне идей.

А то получается, что мой алгоритм хоть и существенно получше по чувствительности к порядку адресных элементов, ошибкам (пока не прикрутил алгоритм Левенштайна, но это есть и работает), а порядок по времени или тот же, или даже побольше. Хотя до парсинга улиц был 30-40 секунд. В общем вопрос таков - как по скорости лучше обойти улицы (ну, чтоб получить код ФИАС) региона?

Спасибо всем, кто откликнется с идеями, тут даже не важно, рабочие они или нет - могут натолкнуть на хороший.правильный путь.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Если Левенштейна пока нет, то дело вряд ли в алгоритме поиска - он не может занимать столько времени.
Я бы один раз забрал весь справочник себе и, думаю, все сразу в разы ускорится.
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
sphinx
... засада - для выбора улицы я делаю (для каждой разбираемой адресной строки) курсор, выгребая по региону. На 100 записей рабоает около 60-70 секунд (замерял в течение дня, нагрузка на сервер разная, поэтому сильно это время не изменится). Как можно ускорить? Пока на уровне идей. ...

1. разложил каждую строку на составляющие.
2. сгруппировал полученный курсор по всем уровням по нарастающей, т.е. по региону, по региону + город, регион+город+улица. Ну и по району вероятно тоже.
3. искать в ФИАС соответствия уже не для каждой строки, а для группы. Вполне возможно что также по нарастающей.
Сгруппировал по региону - пробежался, заполнил.
Сгруппировал по регион+город - пробежался, заполнил.
...



Исправлено 1 раз(а). Последнее : Taran, 02.09.17 00:13
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
Я бы один раз забрал весь справочник себеЯ бы один раз забрал весь справочник себе

Т.е. все улицы по всем регионам? Это ж 90% всего ФИАС. По такому объему поиск даже с индексами будет идти не быстро. Хотя может реально и получше, чем на каждом шаге выбирать улицы одного региона (с районом не взлетит, не все населенные пункты принадлежат району). Такая идея была, я по сути так и делаю, готовлю перед парсингом нужные справочники, чтобы все 3 млн. записей по ФИАСу не обходить.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Олег, я примерно так и делаю.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
Это ж 90% всего ФИАС. По такому объему поиск даже с индексами будет идти не быстро.

Я бы забрал вообще весь справочник, а поиск с индексами будет идти быстро.
У нас была подобная проблема и решилась она именно так - поставили справочник на каждую станцию (изредка обновляли), и все ускорилось в разы.

В любом случае, попробовать надо, тем более это несложно.



Исправлено 2 раз(а). Последнее : akvvohinc, 04.09.17 05:28
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> готовлю перед парсингом нужные справочники, чтобы все 3 млн. записей по ФИАСу не обходить.
Выбрать куда-то нужные справочники мне не потребовалось, сам КЛАДР (и ФИАС) - это и есть сам справочник. Главное сделать индексы, которые "ускорят"...
Если не брать экзотические виды записи адреса, то человек записывает адрес начиная от общих элементов (область, город) к частным (улица, дом). Поэтому:
- сначала выделяю старший адресный элемент (например, область)
- ищу его в КЛАДР, получаю его CODE
- беру следующий адресный элемент (например город)
- ищу его в КЛАДР но только среди элементов с CODE, полученным из предыдущего адресного элемента
- и так циклически повторять до последнего адресного элемента
- () в этом циклическом алгоритме придется заложить выход из цикла, возврат на шаг назад, или к началу, с другими константами/параметрами, но это практика покажет )

() Наименования часто пишут с ошибкой, но в первой букве ошибаются редко
() Из наименования удобно "вычесть" словосочетания, типа "Героя Советского Союза" (список в спойлере), чтобы алгоритм сравнения собственно фамилии дал адекватную оценку. Также пришлось отрезать малоинформативные окончания слов, в которых тоже ошибаются.
() Почтовый Индекс может помочь (хотя бывает, что его указывают неправильно, но первые 3 цифры пригождаются)
() Поместить КЛАДР куда-нибудь на C: - это хорошая идея, даже при наличии правильных индексов будет заметно быстрее.

Слова для вычитания из наименования:
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
В любом случае, попробовать надо, тем более это несложно.В любом случае, попробовать надо, тем более это несложно.

Согласен. Попробую. Пока занят другими, не менее важными проблемами (а чтобы ускорить отладку - сделал курсор а-ля TOP<=<заданное число>.

Тем не менее продолжаю отчитываться о продвижении. Они есть, пусть и медленно. Сегодня решил в общем случае проблему поиска улицы, устаревшей по названию. Она ищется по NEXTID (улицы, хотя надо прикрутить ко всем адресным элементам, в 99% алгоритм на эту ветку не зайдет, по скорость не повлияет), и лучше дополнительного перебора не нашел решения. Хотя может оно и есть. И почти допинываю поиск улицы, умеющей ошибку в названии - по алгоритму Левенштайна (я его обязательно выложу для Оракла, хотя есть и для фокса, именно с фокса и переводил, может не очень универсально, а порой и криво, но работает... идею забрать точно можно, а там допилить, как хочется и умеется). Должен работать, пока ошибки вылавливаю, не получаю нужный результат.


To be continued..


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
of63
ищу его в КЛАДР но только среди элементов с CODE, полученным из предыдущего адресного элементаищу его в КЛАДР но только среди элементов с CODE, полученным из предыдущего адресного элемента

Олег, это очевидно, но недостаточно! Мой алгоритм уже умеет:

- распознавать почти все адресные элементы, даже с ошибками
- не зависит от порядка чередования адресных элементов (ну с квартиры может и вряд ли начнется адрес, но моему и на это пофиг)
- восстанавливает инфу по региону и району (если село/деревня, или город, включаемый по ФИАС в район.. таких немного, но есть. Потом от этого уйдут, проект развивается в правильном направлении, а всю инфу быстро не перелопатить)
- начиная с улиц будет восстановление ПРАВИЛЬНОЙ улицы, содержащую 1 ошибку в названии (пока так, потом посмотрим, можно ли взять 2 ошибки и что проверять - корень слова, а может звучание, типа SOUNDEX()


Нет, пока не все идеально, но суть такая. И она будет допилена, я получу 99% почти с любых данных.


В проекте есть много чего:

- обучить распознаванию индексов (и не только по ФИАС, я еще почтовую базу прикручу, а номер решили брать МИНИМАЛЬНЫЙ. Это лучше, чем ничего. По не совсем правильному индексу а) налоговая примет, если в базе нет. б) до адресата дойдет, только в другое почтовое отделение, ну придет ему извещение, а проблемы-то нет. Да и в любом случае ПОПЫТКА лучше, чем ничего.

- определять и решать проблему одного города в разных регионах - я прикрутил доп.запросом выборку с COUNT() по городу-области. Там где 1 - не приседаем. Может не очень красиво, у меня уже сроки начинают жать, надо в целом написать проект, а потом улучшать, и ВЫЛИЗЫВАТЬ. И там этих мест будет овердофига.

- Восстанавливать улицы по индексу - в ФИАСе есть такие однозначно определяемые. Алгоритма тут хитрого и нет, но это время на отладку. Это тоже потом.

- В конце концов - восстанавливать населенный пункт (не только местоположение, но и может быть и город) по индексу. И даже улицу.

Да, полного разбора не получится, в налоговую не сдать такие данные. НО! Будет конкретика, чего не хватает, и это будет делаться далеко не ручным способом, а анализом лога, как минимум.

Пишите свои мысли, мне этот проект нравится, даже после работы с РАДОСТЬЮ остаюсь, нет момента, что работаю на дядю, пишу для души - с энтузазизмом и радостью. Всегда бы так!


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 04.09.17 20:34
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
sphinx
чтобы ускорить отладку - сделал курсор а-ля TOP<=<заданное число>
Для чего это нужно в оракле то? Там и так курсор после открытия не вынимает все 100500 подходящих записей, а если "остановиться" на первой же (или на десятой, к примеру), то вообще практически минимум блоков будет считывать.
Единственно что хинт FIRST_ROWS() может пригодиться.

Для отладки запроса вне pl/sql блока стоит просто использовать утилиту позволяющую не вычитывать ВСЕ подходящие данные (типа прогрессивной выборки - вынимаем первые 100, а потом ждём, нужно ли "листать" дальше - скажем Toad так работает, за другие утилиты не скажу).

Вообще, если что, подход к работе с теми же курсорами в фоксе и оракле ну очень разный. Равно как и способы (в смысле как оптимально это делать), к примеру, определения "наличия записей по условию", или наоборот - условные ветки "при отсутствии записей для update"...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Игорь, учту. Спасибо!

Я не все знаю, всю жизнь учусь.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
И она будет допилена, я получу 99% почти с любых данных.

Как бы хорошо ты не допилил прогу сам, но ты слишком высокого мнения о "наборщиках" адреса.
Снизь планку до 95-97% - это более реальные цифры для произвольных данных.
(ты же отлаживаешься на вполне конкретных данных и предусмотреть будущих, пока не встретившихся, вариантов ошибок не можешь, а они обязательно будут)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
andrewk
Автор

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
sphinx
Всем привет!
Видел описание на один Web-ресурс
Пару месяцев назад занимался схожим вопросом – возникла необходимость заполнить ФИАС-коды улиц и домов у всех клиентов. В процессе изучения вопроса наткнулся на несколько сайтов, которые онлайн подбирают адреса и выдают коды. В том числе DaData.ru. Вообще-то он заточен на онлайн-сервисы (магазины и т.п.): на своём сайте помещаешь код, появляется строка ввода адреса, клиент там в свободной форме набирает свой адрес, в процессе ввода в виде выпадающего списка появляются правильные адреса – очень прикольно. В результате «наш» сайт получает «правильный» адрес и штук 70 его свойств – раскладка по элементам, их ФИАС- и КЛАДР-коды. Но главное, что было нужно мне – есть api для работы с их веб-сервисом. Для его использования нужно у них зарегистрироваться, получаешь свой ключ доступа, который передаётся с запросами. Ограничение для бесплатного варианта – 10 тысяч запросов в сутки – мне этого вполне достаточно. Весь обмен идёт в виде json-строк. Выдаёт массив вариантов в порядке степени похожести.
Короче, на нём и остановился. В VFP сваял класс-оболочку для работы с этим сервисом. Для работы с json использую nfJson с минимальными правками. На формах работы со справочниками улиц и домов добавил кнопку «получить коды ФИАС». Случай, если получаем более одного варианта, делать решил пока не обрабатывать (так-то можно варианты юзеру предложить на выбор), просто вывожу сообщение об этом и пишу чтобы доложили мне, но никто не сообщал об этом. Вроде, у всех прокатило нормально.
Ratings: 0 negative/2 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 45 dafni_2004 OlegA  (Гостей: 43)

© 2000-2024 Fox Club 
Яндекс.Метрика