Pull to refresh

Comments 49

Глянул ваш код — повезло вам, что нет такой улицы как ' DROP TABLE ADDROBJ :-).
PS: код лучше выложить на GitHub.
А что, хорошее название для какого-нибудь района, куда лучше не ходить.
Ну и полагаю, это не самая страшная проблема, хоть и легкопочинимая.
Спасибо за советы :-)
У меня в городе есть и улица, и проспект Шевченко (он в нашем районе родился). То есть, с моим городом возникли бы проблемы) А у него население всего-то 20к.
А в городе, где я родился, все еще хуже: есть 19 квартал, и есть 19 микрорайон. И это разные штуки.
Но пока забил. Хотя грязный хак, который побеждает проблему, следующий: при выкусывании слов «улица» («ул»), «квартал» («кв-л», «квл»)… добавлять их православно-фиасовскую форму (поле SHORTNAME) в отдельный список. И если при поиске на очередном шаге нашли несколько элементов с одним названием, но разным SHORTNAME, выбирать тот, у которого SHORTNAME есть в выкушенном списке.
Естественно, с достаточно жесткими ограничениями на входные данные, при которых будем продолжать изыскания:
Адрес всегда написан без опечаток: «проспект Арфографии» пусть останется на совести вводящего.
Запись адреса ведется от максимально общего элемента (область) до максимально частного (номер квартиры).
С учетом пункта 2, забиваем болт на слова-подсказки типа «область», «улица», «проспект», «дом». Так что если в городе есть и проспект Телепузиков, и улица имени их же, то уловить столь тонкую грань мы не сможем. С учетом редкости подобной ситуации и наличием права на ошибку – вполне себе рабочий вариант.

К сожалению, в реальной жизни эти три пункта плохо применимы. Мы тут как-то гоняли один не очень публичный адресный сервис на совершенно реальной базе адресов — получили точность распознавания процентов в 20-30.

Мой вам совет — помимо всего прочего, в общем случае парсер должен отдавать не один вариант, а несколько, с указанием веса (точности распознавания) каждого из них.
Видимо, мои подопечные подходили к делу более аккуратно, т.к. 62 тестовых результата из сотни распарсились корректно. Несколько вариантов парсер и сейчас прорабатывает, но отдает только победителя, так что модификация будет несложно. Но, возможно, бессмысленной, т.к. без работы с опечатками ценность весов теряется.
Занимаюсь, в свободное время, тем же самым. Правда уже дошел до переконвертации фиас в нужный вид). Чуть комментариев:

Адрес всегда написан без опечаток: «проспект Арфографии» пусть останется на совести вводящего.

Сфинкс отлично справляется с этой задачей. Думаю, можно и MSSQL приспособить. Гуглить по «поиск по триграммам» ;)

Запись адреса ведется от максимально общего элемента (область) до максимально частного (номер квартиры).

Это зря. Не должен порядок влиять на качество )

С учетом пункта 2, забиваем болт на слова-подсказки типа «область», «улица», «проспект», «дом».

Пока тоже забиваю, но есть мысли как использовать. Доделаю — накатаю пост на хабре)
Гуглить по «поиск по триграммам»

Спасибо! На самом деле, когда писал заключение про недостатки, гуглил, как их можно обойти. В PostgreSQL это нативно вроде как работает (http://habrahabr.ru/post/78566/), а под MS SQL нужно что-то городить. В общем, пока решил подзабить, а там посмотрим.

Не должен порядок влиять на качество

Согласен, тем более, что Артемий Татьянович наметил тенденцию использования обратного порядка (http://www.artlebedev.ru/kovodstvo/sections/163/), да и в цивилизованных странах он же используется.
Но тогда забивать на слова-подсказки вообще никак нельзя. А они могут стоять как перед значащим словом (ул. Декабристов), так и после него (Иркутская обл.)
В общем, пока решил подзабить, а там посмотрим.


Я начинал с этого поста. По сути — этого хватит именно для опечаток.

Но тогда забивать на слова-подсказки вообще никак нельзя.


Эмм… Не вижу связи, если честно.
Без слов-подсказок трудно будет различить «Иркутская обл. пос. Лесной Смоленская ул.» и «ул. Иркутская Лесной пос. Смоленская обл.»
А такой (не совсем честный) вариант не рассматривали:
Отправлять адрес в поиск Яндекс/Гугл Карт и из результатов извлекать распарсеный адрес.
Конечно, есть шанс быть забаненым, если адресов очень много, но, думаю, это тоже решаемо, если подобрать оптимальные задержки между запросами или затариться несколькими прокси.
Пробовал такой вариант для тех адресов, которые не удалось распарсить своим методом. За исключением опечаток, Яндекс/Гугл-карты тоже не смогли дать внятный ответ. В периферийных регионах гугло-яндексовые карты местами хуже, чем ФИАС.
Ну и потом, затачиваться на сторонний сервис, для этой цели изначально не предназначенный — это обрекать себя на постоянный головняк с поддержкой.
Те 10 копеек за адрес идут за реальную работу людей, потому как реальный парсинг адреса требует еще и работы оператора. То что описали вы этой статье врядли можно назвать парсингом, подобную задачу доводилось решать один раз в качестве модуля к црм системе одного крупного банка, кроме разбиения и сопоставления с эталоном делалась умная самообучаемая система для операторов, которая давала в процентах 10 результат достоверный, в остальных выдавала предположения и варианты на основании расстояния левенштейна и предыдущем опыте работы оператов с системой.
10 копеек за адрес, конечно, идут за реальную работу людей — например, разработчиков сервиса :-) Парсить вручную адреса по 10 копеек никто не будет.
Двойственное ощущение от таких статей.
1. Автор поучился, изучил предметную область и явно разобрался. LevelUP =)
2. С другой стороны поступил как программист. Зная о наличии сервисов высоким уровнем качества по 10 копеек за запись потратил не один день на написание своего кода с выходом ~70%
3. Странно отношение к адресу как просто в тексту, по сути это или адрес доставки корреспонденции или разрез аналитики. Доставка и корреспонденция стоит денег (70% аналитика — не аналитика=))
4. с точки зрения экономики просто умножите объем своей базы на 10 копеек и спросите стоило ли оно того при таком уровне разбора?

Результат работы программиста не код, а решенная задача.
Зная о наличии сервисов высоким уровнем качества по 10 копеек за запись

С неизвестным уровнем качества, будем честными.
Ну почему же?
Уважающие себя сервисы предоставляют демо версии и демо аккаунты. Некоторые даже пишут парсеры демо страниц и через них строят разбор адреса. =)
Можно сравнить свой разбор и предлагаемый.
Вот именно, что можно сравнить. После этого можно будет говорить о качестве сервиса. После, а не до.
Сейчас средний уровень коммерческих сервисов 95-99% от возможного разбора.
Обрабатывают даже ситуации "… зеленая дверь налево, звонить три раза, спросить разведчика Исаева"
Поживем — увидим. Результаты своего тестирования одного такого специализированного сервиса я показывал выше.
20-30% это кто ж так разбирает? еще и за деньги.
ИМХО в лидерах сейчас post-address.ru/ и dadata.ru/
C обоими знаком, но не одних не работаю.
Некоторые интеграторы пишут свои модули на различных Data Quality решениях, но пока до 90% добрались единици
20-30% это кто ж так разбирает? еще и за деньги.

К сожалению, не могу сказать.

ИМХО в лидерах сейчас post-address.ru/ и dadata.ru/

Мы планировали их тестировать для своих задач, но пока не начали.
Если не затруднит вывод в личку киньте после тестов. В своё время проводил сравнение IQ, HF, и двух решений которые не выжили на рынке.
Интересно как изменилась ситуация за 5 лет.
1. Да, это мотив!
2. Я и есть программист :)
Не факт, что уровень качества сервисов за 10 копеек высок. Я просто отметил их наличие, но не регистрировался и не проводил тесты. Были еще сервисы за 70 копеек. Возможно, между ними есть разница.
Потратил я как раз один день (точнее, вечер), на реализацию, и еще один — на доводку, тестирование и эту статью.
3. Задача заказчиком была утверждена именно так: «распознавать как-нибудь, без дополнительной оплаты за парсинг каждого адреса». Вариант с внешним сервисом, разумеется, предлагался.

С таковой точки зрения задача решена.
1. Согласитесь, тема не так проста как выглядит на первый взгляд. Если долго всматриваться там видны и нейронки и генетические алгоритмы=)
2. Относительно цен. Качество — цена не имеет корреляции. Те кто делают дешевле чаще всего выезжают на объемах.
Относительно сроков реализации — производительно для такой задачи.
3. Заказчик странно относится к данным. Видимо постановка такая была от «бизнеса»
1. Тема ни разу не простая, поэтому я постарался как можно больше рассказать о недостатках такого «наколенно-однодневного» решения. С другой стороны, какое-то решение чаще все же лучше, чем никакого.
Нейросети, возможно, смогли бы оказаться полезными в классификации уровня адресного элемента (область, район, город, улица, дом, корпус, квартира) по рядом лежащим словам-подсказкам. Я с ними совсем не работал, поэтому, спасибо за наводку, попробую при наличии свободного времени поэкспериментировать. Но опять же, потом нужна будет фактическая база, по которой придется пробивать почтовый индекс. Ибо вряд ли получится обучить сеть экстраполировать индексы. :)
А вот чем тут могут помочь генетические алгоритмы?

2. Не стану спорить. Нужны тесты.

3. Это не ключевая для бизнеса функция. Поэтому так и относится.
1. Фактическая база — тот же ФИАС и различные почтовые и прочие базы для набора критической массы. Как в интервью сказал один из разработчик такой системы «после 80-90 % каждый следующий процент требует ровно столько усилий сколько было приложено до этого».
+
Есть же еще, т.н. «обратная ошибка», т.е. адрес разобран и помечен как правильный, а он не верно был разобран и указывает совершенно другую точку в пространстве.

Вы так пишете о сервисах за 10 копеек, как будто ими весь рунет завален :-) Я только один знаю.
Ну почему же один. Ваш и конкурентов=) это минимум.
Наверняка есть умельцы кто еще не вышел на большой рынок, а работает локально
Да, конкурентов я знаю много, а вот 10 копеек за запись только у нас :-) Черт, это нескромно.
Не понял из статьи, была ли решена бизнес-задача, заказчика устроили результаты парсинга?

Еще интересно, о каком количестве адресов шла речь.

P.S. «жадно пялились онлайн-сервисы… за вполне реальную мзду» — это прекрасно. Да как они посмели!
Заказчика результаты парсинга устроили, так что можно сказать, данная задача была решена.
Объемы адресов: периодически (примерно один раз в неделю) по 50-100 штук.

PS. Вот-вот! Нахалы, да и только! :)
А если серьезно, я не против подобных сервисов совсем. Опечалило лишь отсутствие открытых альтернатив (пусть и худшего качества).
Прелестно.
1. Пересчитайте свои трудозатраты в количество недель обслуживания «нахальных сервисов». Хватило бы на годы =)
2. Можно просто прогонять через демо аккаунты объемы позволяют=)
Вы потратили время своей жизни на то, чтобы некачественно воспроизвести сервис dadata.ru. Я не понимаю мотивацию вашей работы.

Не хочется отдавать добровольно доходы?
Сколько стоит ваш час? Умножьте его на количество часов, потраченные на разработку алгоритма. Теперь сравните с 10 копеек за запись. Каков результат?

Появился некий азарт
Есть еще столько нерешенных интересных проблем в мире в области софта, почему вы не используете свой азарт для них?
Каков результат?

Личное удовлетворение, деньги в кармане от заказчика, пусть хреновая, но доступная желающим реализация.

почему вы не используете свой азарт для них?

Очень хороший вопрос. Надеюсь, человек все еще может заниматься тем, чем он хочет?
Я спрашивала про результат в денежном выражении. Это оказалось выгодней, чем 10 копеек за адрес или нет? Если по вашей часовой ставке?

Безусловно, вы можете заниматься чем хотите. Интересна мотивация писать то, что уже написано для вас. Зачем писать очередную «пусть хреновую» реализацию? Это перекликается с вопросом про деньги, мне прежде всего интересно, сэкономили ли вы :)
И еще интересна бизнес-задача, для которой нужно «невысокое качества парсинга» с алгоритмом, ошибающимся в случайных местах. Поделитесь или это секрет?
С чего вы решили, что dadata.ru обрабатывает адреса корректно? Я во время тестов отправил им с десяток разных адресов, которые они обрабатывали не правильно. Простой пример, про который я им говорил месяца 3 назад: берем ИХ-ЖЕ почтовый адрес со страницы dadata.ru/about/, загоняем к ним и видим, строение и этаж не определились.

Я не против dadata.ru, наоборот — очень полезный инструмент. Но все-таки пишу свой велосипед, в более-менее свободное время. Это полезно для развития, потенциально выгодно для компании, в которой работаю, интересно, в конце-концов…
Было бы очень интересно почитать про Ваш подход к работе с адресами, мне кажется, это было бы очень интересно и всему сообществу.

P.S.: по поводу адреса с сайта дадаты — это наша боль:) Мы не умеем нормально работать с бизнес-центрами, воспринимаем их как мусоррную информацию и не учитываем в разборе. В том числе некорректно работаем когда бизнес-центры расположены внутри домового расширения: попробуйте разместить название БЦ в другом месте предложения и получите корректный разбор. В основном такое поведение продиктовано бизнесом (мы исходим от адресов, которые чаще встречаются у заказчиков), но перфекционизм не даёт покоя, и, надеюсь, что в этом году мы ещё всех удивим.
Если Вы отправили нам адреса с неправильным разобром, то отдельное Вам спасибо, мы их учитываем при разработке новой версии адресного парсера.
Обязательно напишу, как только доделаю до такого качества, которое устроит меня. По прикидкам — осталось не много, как получится на деле — кто-же знает).
Но мне странно видеть, что определение корпуса/строения/этажа зависит от названия и, тем более, местоположения в строке определенного набора букв. Видимо, у нас абсолютно разные подходы.

Из последних неправильных адресов (так и не поправили):
— 6 рощинский 2
— Пахра дом отдыха пгт Подольский р-н, Заводская ул, д. 19
— Нижний Новгород, ул.Веденяпина, 2Б, ТЦ «Парк авеню»
— Воронеж, ул.Дмитрова, д.47 (Литер А, 1 этаж, номер на поэтажном плане:3,5-9,12-26)'

и т.д. Это все реальные адреса курьерских служб.
Да, этими адресами мы занимаемся. Мы сейчас работаем над совершенно новой версией парсера, куда включаем сложные кейсы вроде представленных вами, так что в скором будущем почти всё будет обрабатываться правильно.
Кстати, а что странного в определении домовой части в зависимости от месторасположения в строке? Вы же сами приводите пример такой зависимости: 6 рощинский 2. Смотрите сами:
Москва 6 рощинский 2 = Москва 6-ой Рощинский проезд дом 2
Москва 2 рощинский 6 = Москва 2-ой Рощинский проезд дом 6
Позиции чисел необходимо учитывать, без этого никак. Я говорил про местоположение в строке определенного набора букв, т.е. названия бизнес-центра, например.
Просто обычно доп информация добавляется сбоку от адресного компонента, но не внутри него. Вот пример от заказчика:
— 3-я Мытищинская улица, 14а Москва 3
Справа добавлена доп информация с числом, по Вашей логике следует разбирать адрес как дом 14а квартира 3, тогда как на самом деле речь про дом 14а, который находится рядом со станцией Москва-3.
По моей логике будет «Москва, 3-я Мытищинская улица, дом 14а». Квартиры тут нет, т.к. нет указания на квартиру и число 3 идет не сразу за номером дома.
А как Вы определяете квартиру? Основываясь на своём опыте, могу сказать, что обозначение квартиры далеко не всегда присутствует. Плюс интересно какое число считать за квартиру: слева или справа от обозначения. Например,
Улица Мытищинская 3-я 3 кв 1 и Улица Мытищинская 3-я 3 1 кв — одно и то же?
а Улица Мытищинская 3-я 3 к 1 — тут про корпус или квартиру?
Часто можно понять о чем идет речь только исходя из порядка следования элементов в домовой части
Улица Мытищинская 3-я 3 кв 1 и Улица Мытищинская 3-я 3 1 кв — одно и то же?

Да. В первом случае есть явное указание, во втором числа идут рядом, о чем говорил выше.

а Улица Мытищинская 3-я 3 к 1 — тут про корпус или квартиру?

Корпус.

Часто можно понять о чем идет речь только исходя из порядка следования элементов в домовой части

Не, по моему опыту как-раз нельзя исходить из этого. В одних системах прямой порядок, в других обратный, в третьих случайный, в зависимости от настроения оператора колл-центра.
Sign up to leave a comment.

Articles