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

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Всем привет!
Я понимаю, что тема если не заезженная, то поднималась. А хороших алгоритмов так и нет. Видел описание на один Web-ресурс (там по описаниям все ошибки исправляет, даже пытается выстроить оценочную функцию для нескольких одинаковых вариантов, из которых надо выбрать один)

Может кто занимался? Вроде Олег (of63) что-то делал на Фоксе (хотя нам нать на Оракле, но утрясти бы критерии, как и что искать, если какой-то реквизит отсутствует).


Преамбула. Готовим 2 курсора - по городам (город, AOGUID, 2-значный код региона, уровень (AOLEVEL) и ссылка на GUID вышестоящего уровня) и по регионам (регион, GUID, код региона).
Пока добрался до города (разумеется, сначала разложили в курсор по элементам, хоть и не универсально - но запятые).
Итак.
1) Сначала идентифицицируем регионы везде, где они есть. Это в ряде случаев (в большинстве случаев как раз не нужено) поможет - например два села, район не указан, идентифицировать можно только по доп.параметру - области - т.е. региону.
2)Если есть "г.", "гор " (у нас других вроде не было, кстати, как лучше это учесть через регулярные выражения?) - ищем в курсоре городов. Если нашли - проставили GUID, и вычитали PARENTGUID, чтобы определить вышестоящий регион (для чего это нужно? А вот такой адрес: 620010, г.Екатеринбург, ул.Шутенко, д.21, кв.56). И кстати, если не нашли по PARENTGUID - надо еще один вложенный цикл сделать и перебрать районы.
Но это уже задача на завтра и понедельник.

Есть интересные мысли?


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

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
например два села, район не указан, идентифицировать можно только по доп.параметру - области - т.е. региону.

Два (и много больше) одинаковых по названию села может встретиться не только в одном регионе, но и в одном районе (например, с.Андреевское).
Так что не имея почтового индекса задачу не всегда можно решить, даже если вся "словесная" иерархическая цепочка адреса есть в наличии.

sphinx
Пока добрался до города (разумеется, сначала разложили в курсор по элементам, хоть и не универсально - но запятые)

Обычно главная проблема в другом - найти объект, если какие-то элементы адреса отсутствуют или написаны с ошибками.

sphinx
для чего это нужно? А вот такой адрес: 620010, г.Екатеринбург, ул.Шутенко, д.21, кв.56)
Если задан почтовый индекс, то это решает большую часть проблем - плясать лучше именно от него.
Считая его правильным (а ошибок в нем, как правило, на порядок меньше, чем в остальных частях адреса), надо лишь проверить, что остальные элементы ему не противоречат явно. Иногда индекс определяет адрес вплоть до нескольких домов и даже до дома.
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx
Автор

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

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

akvvohinc
Если задан почтовый индекс, то это решает большую часть проблем

Индекс как раз ничего по большому счету и не решает. Порой даже область. Как тебе адрес: 625643, Свердловская обл., г.Киев.... <skip> ?

Да и почтовый адрес я буду восстанавливать по отдельной таблице (пока ее нет в полном объеме, я в инете не нашел готовую и актуальную, но вручную потихоньку соберу свою).


СПАСИБО за отзыв, вопросы, обсуждение. Знал, что хоть кто-нибудь откликнется.


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

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
Иногда индекс определяет адрес вплоть до нескольких домов и даже до дома. Иногда индекс определяет адрес вплоть до нескольких домов и даже до дома.

Согласен! Но не в ФИАСЕ же! А вот через такой СВОЙ справочник прогнать - это другое дело.

Я так понял, что придется не только от общего к частному идти, а придется все алгоритмы микшевать - от того же города - возвращаться через парент-ид до района. Или по индексу что-то восстанавливать. Но с последним как раз и не понял... Село по индексу еще можно восстановить ОДНОЗНАЧНО, ибо на все село один почтовый индекс. Даже улицу не взять. Это только если есть справочник привязки (именно официальной, а не в жизни, кто и куда ходит письма-телеграммы относить - да в ЛЮБОМ почтовом отделении) улица/дом К почтовому отделению. Да и то в обратном порядке НИЧЕМ не поможет. Ты сможешь определить по почтовому индексу улицу?


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

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
Согласен! Но не в ФИАСЕ же! А вот через такой СВОЙ справочник прогнать - это другое дело.

Я занимался чем-то подобным еще в конце 90-х - тогда был КЛАДР. Он и сейчас еще ведется. Почему бы не считать его СВОИМ справочником?

С ФИАСом я не работал, но раз в нем есть и почтовые индексы, и дома, то твое восклицание "Но не в ФИАСЕ же!" мне без разъяснения не понятно.

sphinx
Как тебе адрес: 625643, Свердловская обл., г.Киев

Нормальный адрес.
Надо лишь понять, какой реквизит здесь неправильный.
Если индекс и регион соответствуют друг другу, а город - нет, то считаем неправильным город (и, наоборот). Далее, считая индекс верным, вероятно, найдем и город через сам индекс или улицу.

Но если могут встретиться еще СССР-адреса (г.Киев), то и справочник с почтовыми индексами надо искать тех времен.
Я, когда работал с Паспортными столами, создавал свои "исторические" справочники на основе данных об административно-территориальном делении СССР и России. Эти справочники, если нужно, до сих пор можно скачать на рутрекере.
Индексов там, правда, не было, но старые названия объектов, по которым можно будет попробовать найти новые, присутствуют.
(помню, в некоторых книгах были какие-то экзотические реквизиты типа "название вокзала в Москве, с которого идет поезд до данного н/п" или "расстояние до районного или областного центра")

В тех базах, с которыми я работал, старые адреса в больших количествах имелись в таких реквизитах, как Место рождения, Откуда прибыл, Куда выбыл и т.п. Иногда встречались люди, родившиеся еще в 19 веке с соответствующим тому времени местом рождения.
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Но это уже задача на завтра и понедельник.
Это задача на много месяцев придумывания, и собственно писанины, и отладки, и примерки к разным видам человеческого написания адреса.

() Например:
Н.Новгород, Ниж.Новгород, Нижегородская обл, г. Нижний Новгород, Н.НОВГОРОД Г ... Что будешь искать в курсоре городов (и как узнать, что именно городов) ?
П.Корчагина, ул П.Корчагина, ул Павла Корчагина, ул. Корчагина, п.Корчагина... Что искать? И где - среди улиц, или Корчагина среди поселков (п.Корчагина)?
Индекс часто не указывают, указывают неправильно, индекс меняют как перчатки, индекс на одной длинной улице бывает разный (зависит от № дома)
...

ФИАС и КЛАДР отличаются почти ничем, только в ФИАС каждому адресному элементу присвоен стабильный GUID, т.е. обещают, что этот GUID будет повторяться в каждом новом обновлении ФИАС, т.е. можно хранить адрес клиента единственным GUID... удобно, но и человеческую запись (например, из паспорта) тоже надо хранить обязательно.

...Все это муторно, хотя обозримо написать с нуля.
Кстати, есть сайты, которые парсят бесплатно, есть которые за денежку пачкой адресов парсят... Хорошо парсят (мой самодельный парсер бывает и не распознает, что у них распарсено)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
С ФИАСом я не работал, но раз в нем есть и почтовые индексы, и дома, то твое восклицание "Но не в ФИАСЕ же!" мне без разъяснения не понятно.

Да он просто не заполнен (пока!), хотя бы по моему региону. А у нас 90% - наша область. Впрочем, вроде алгоритм мне нравится (с четом, что на Оркале, на Фоксе я бы проще и быстрее сделал, но и ассоциативные массивы прикрутил, по крайней мере по скорости перебора уже не всю базу гонять, пусть даже она и с индексами.

Пока уперся в разбор сел. Не, справочник типов сел вычитать из ФИАСа не проблема (допускаю, что не все грамотно сделал, просто нет описания, как проще управлять тем же AOLEVEL). Ну да ладно - будет оптимизация по запросу - ее в одно место вставить, тут как раз не вопрос. ;)


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

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

У меня пока нет привязки по МЕСТУ города-индеса-района в строке - найдет по ключевым словам, мусор выкинет (типа ул.Республиканская!- это часть ключевого слово на поиск региона ).

Ну и 100% не разобрать - я же про это и говорил. Ты сейчас споришь с тем, что я сам и утверждал? Ну, оригинально, че..

А улицы все же причесать немного можно, не сгущай краски. ;)





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




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

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Саша, не будет все просто! Кроме "улиц" есть еще "переулки" (пер., п.), проспекты (пр-кт, пр, п.), поселки (п., пос. пгт, село...), и много прочего, все сокращения пересекаются с начальными преамбулами (типа Г.Самочкина - толи Георгия самочкина, то-ли город Самочкина...)
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
толи Георгия самочкина, то-ли город Самочкина

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

Поэтому попытка поиска по улице в самом начале алгоритма может быть неплохим ходом - вдруг окажется, что она уникальна!
(да даже, если и не уникальна, а поиск оставит лишь сотню-другую вариантов, то это заметно упростит восстановление верхних уровней адреса)

PS
Кстати, подсмотрел я сейчас эту улицу не в инете, а в какой-то старинной проге просмотра/поиска КЛАДР, написанной еще на FPD 2.5, и чудом уцелевшей в моем архиве. Вряд ли там есть что-то ценное, но она разбирается до исходников, так что если что надо подсмотреть ...



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

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
) Это надо прочуствовать, поискать в КЛАДР/ФИАС что-то достаточно нетривиальное, типа... Вот отфильтруй в КЛАДР (STREETS.DBF) имена, содержашие "Героя", или "Космонавта" или просто многословные имена...
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
Надо лишь понять, какой реквизит здесь неправильный.
Если индекс и регион соответствуют друг другу, а город - нет, то считаем неправильным город (и, наоборот). Далее, считая индекс верным, вероятно, найдем и город через сам индекс или улицу.

Ну не так.

На самом деле - индекс и регион левые, правильный адрес - именно город КИЕВ. И по ФИАСу (если бы был и он) - восстанавливается регион (да и индекс главпочтамта в общем случае). Я понимаю, что у тебя есть знания в этом вопросе, но пример я тебе привел, не обижайся.



А примеры подкидывайте, буду думать.


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

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
of63
) Это надо прочуствовать, поискать в КЛАДР/ФИАС что-то достаточно нетривиальное, типа... Вот отфильтруй в КЛАДР (STREETS.DBF) имена, содержашие "Героя", или "Космонавта" или просто многословные имена...

Дак да! Пример навскидку - р-н Эльмаш (!) . Нет его в ФИАС. А в адресе есть. И я пока не знаю, как это учесть, пока только через твспомогательную таблицу.

Но ее копить тогда надо постоянно. Или лог вести. А это уже нет 100% разбора. И не будет его, пока в жестком формате (XML к примеру) не будут данные передаваться. Причем с заведомой верификацией по КЛАДР/ФИАС. Кстати, эти справочники тоже изрядно кривые, не обольщайтесь.


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

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
На самом деле - индекс и регион левые, правильный адрес - именно город КИЕВ.

На самом деле это значит, что ты проанализировал еще какие-то реквизиты, помимо эти трех.
Я же приводил пример, исходя лишь из имеющегося набора. По нему сказать, что правильный именно Киев, нельзя.

Если любой из этих реквизитов допустим, но все они не соответствуют друг другу, то естественно, что анализ придется продолжить до улицы, а то и до дома. Но даже тогда однозначного решения может не быть, если <улица, дом> встретятся и в Киеве, и в каком-то населенном пункте Свердловской области, или по данному почтовому индексу. В этом случае я бы установил собственные приоритеты, "что главнее", исходя из них и решал, "где эта улица, где этот дом?"
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
"Заведомо хорошие адресные данные" ты никогда не увидишь, в т.ч. по причине, что ежегодно меняется принадлежность сел (нас.пунктов), например, то это Борский р-н, то г.Бор, и все это для "села Большеорловского" какого-нибудь, ... или просто, то Героя Поющева улица, то Героя Советского Союза Героя Поющева, то просто Поющева... КЛАДР наполняется людьми, никакой там строгости нет. Это просто БД наименований, набранных девочками, со слов, с "документов". КЛАДР - это тоже человеческий документ, это не "стандарт".
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
КЛАДР - это тоже человеческий документ, это не "стандарт".

Для некоторых организаций типа ФНС - как раз стандарт еще с древних времен.
Но вроде со следующего года они переходят на ФИАС.
Ratings: 0 negative/0 positive
Re: Алгоритм разбора адресной строки по кодам ФИАС
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Да, мы от КЛАДР отказались из-за того, что он до конца года. А потом ФИАС.

of63
КЛАДР наполняется людьми, никакой там строгости нет.
Именно так. И в ФИАС это перекочевало.


akvvohinc
На самом деле это значит, что ты проанализировал еще какие-то реквизиты, помимо эти трех.
Ну в примере именно я Киев и оставил ведущим - это простая формальная логика. Допустим это не так и Киев - ошибочный город (ну предположим по названию какой-то редкой улицы можно вернуть истинный город, но в общем случае это не работает, такой метод можно пустить следом, если однозначно ничего сказать не получилось) - тогда при отсутствии и/или неправильности индекса - у тебя однозначно не будет правильных данных. Поэтому и надо комбинировать и уточнять по разным параметрам, пытаться реализовать человеческий разбор.

Вот с улицами и переулками - самая засада, Олег уже понял, я только догадываюсь. Но мы в чертей не верим, прогу надо выдать на-гора, у нас даже сказали, что путь хоть 10 часов алго работает, лишь бы были высокие показатели разбора. А мне эта задача нравится, пусть не с ФИАС, но раньше немного работал. Как оказалось очень немного.

Олег, а как ты вытаскивал из названия местоположение (т.е. деревню, село, хутор, поселок и пр.)? Я пока хочу флагом отследить, что предыдущий элемент (то, что между запятыми)? Реально, как анализировал "пос." и "п.". Я хочу вернуть из ФИАС список наименований, у которых родитель объект с сокращенным именем (SHORTNAME) "р-н" и его перебором прогонять с элементом адресной строки.

Ну, запутанно, но смысл вроде должен быть понятен.


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

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

2 sphinx
> Олег, а как ты вытаскивал из названия местоположение (т.е. деревню, село, хутор, поселок и пр.)?
Идея простая - тип ("местоположение" по твоему) находится в начале или в конце адресного элемента (бывает, что не указаны вообще). Нюансы:
- типы указываются человеком произвольно (а не только как в списке типов SOCR.dbf), например пр., пр-кт, п-кт, м/р, мкр, м-р...
- тип может быть указане неверный (не соотв. КЛАДР), например: село, деревня, поселок, р.пос, пгт... - могут быть перепутаны
- типы могут совпадать с деталями наименования, например П.Морозова п. (поселок Павлика Морозова)
- некоторые типы "тяготеют" к началу адресного элемента (например ул.), а некоторые к концу (например р-н)
- адресный элемент, перед поиском в нем типа, надо "нормализовать" (например, убрать пробелы вокруг тире, и перед точками), чтобы тип в строке пришел в более-менее искомый тип
...

Список типов, которые у меня детектируются, вот такой:



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

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Ого! Открыл для себя много нового (уже не зря тему поднял) - от активных участников пришли интересные вопросы/мысли/опыт.

Касательно П.Морозов - круто. Моим алго его как раз не разобрать. В отличие от предшественника (который и поставил задачу написать ЛУЧШЕ!) - я не иду вправо по адресным элементам (те лексемы, что стоят между запятыми). Моему алго пока без разницы, где именно встретится лексема "р-н", или "край". Это я так пытался решить проблему перестановки адресных элементов в адресной строке. Но глубже, как показал Олег - такое в чистом виде не пройдет, пример есть. Олег, ну а сам-то как решал, поделись. Пусть неправильно, но может на мысли наведет.

И я подумаю, я пока до сел дошел, это за пять минут не решить. И пока затруднился.


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

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Саша, я же написал: Идея простая - тип ("местоположение" по твоему) находится в начале или в конце адресного элемента.
Ищи "лексему - тип" в начале или в конце адресного элемента (т.е предложения между запятыми), в середине не ищи! Где найдешь (с учетом тяготения типа к началу или к концу в случае неоднозначности) - отсеки тип, все остальное будет собственно наименованием. Вот ты так и поделишь адресный элемент на тип и наименование. Далее ищешь эту пару (тип,наименование) в КЛАДР (с учетом CODE ранее найденной предыдущей адресной пары)...
Ratings: 0 negative/0 positive


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

On-line: 36 (Гостей: 36)

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