Комментарии 19
Классный сервис. Пользуемся и всем довольны!
+2
НЛО прилетело и опубликовало эту надпись здесь
А можно примеры? Хотя-бы парочку… По-моему опыту, справочник (кладр или фиас) + n-граммы отлично исправляют опечатки, не изменяя адрес.
Тут у всех свои пути, и, вероятнее всего, для вашей тестовой выборки алгоритм действительно работает. Мы подразумевали не конкретные примеры, а статистику в целом. Под пример можно заточиться, но это не гарантирует, что ошибка не вылезет в другом месте. Мы сравнивали алгоритмы с исправлением опечаток с теми же алгоритмами, но без них, на выборках примерно в 20млн адресов, и всегда получали бОльший процент обратной ошибки в алгоритмах с исправлением опечаток.
Так что-же должно быть в данном случае, улица или площадь? )
Мы возвращаем два варианта и говорим, что невозможно однозначно определить адрес.
А разве задача справочников не в том, чтобы исправлять подобные моменты? Подскажите, в каких случаях они не справляются, plz.
Справочники то справляются, а вот алгоритмы не всегда и притягивают адрес к другому н.п. но с таким же типом.
Тоже работа справочника, верно? Без справочника (стороннего или своего) подобные случаи решить не получится никак.
Верно, но некоторые алгоритмы ставят устаревшим адресам слабый приоритет и разбирают адрес не туда.
В целом — отличный пост. Не хватает технических деталей, но и так очень хорошо. Спасибо.
:)
0
НЛО прилетело и опубликовало эту надпись здесь
А в веб-версии один результат — улица. Почему?)
В веб версии этот функционал сейчас отсутствует, мы возвращаем наиболее вероятный вариант и ставим признак «Проверьте корректность распознанного значения».
В любом алгоритме название должно иметь выше приоритет, нежели тип объекта.
Должно, но не у всех алгоритмов это есть. Статья же про то, как выбрать алгоритм, и мы сказали на что стоит обратить внимание тем, кто его выбирает.
Примеры тестов, к сожалению, не имею права публиковать:(
0
НЛО прилетело и опубликовало эту надпись здесь
С примерами я могу помочь, поскольку тоже этим занимался. :)
Например, юзер может ввести:
— московская о, пушкино, пушкина 15-3-123
или даже еще проще
— пушкино пушкина 15-4-123
1. Пушкина — это улица или ошибка написания города? Если ошибка, то какая? Человек спутал о и а (пушкино/пушкина) или добавил случайно букву (пушкин/пушкина)?
2. Пушкино — это город? Село? Поселок? В какой области?
Или например,
— пушкино, тургенева 18а
Это именно «город Пушкино, ул. Тургенева, д18а» или «город Пушкино, мкр. Заветы Ильича, ул. Тургенева, д18а». Оба объекта находятся рядом, но имеют разный почтовый индекс и разные почтовые отделения. Местный, проживающий во втором адресе, как ни странно, скорее напишет первый адрес.
В этом кейсе ни приоритет, ни тип не сработают. Надо смотреть, какой номер дома завел клиент, и исходя из этого уже определять какой адрес он ввел. Но и этот способ не позволяет проверить достоверно — что же хочет клиент, если он ввел номер дома, например, д3.
Так что задача не тривиальна, а пример с пушкино выше поиск на n-gramm'ах даже близко не дает удовлетворительный результат.
Например, юзер может ввести:
— московская о, пушкино, пушкина 15-3-123
или даже еще проще
— пушкино пушкина 15-4-123
1. Пушкина — это улица или ошибка написания города? Если ошибка, то какая? Человек спутал о и а (пушкино/пушкина) или добавил случайно букву (пушкин/пушкина)?
2. Пушкино — это город? Село? Поселок? В какой области?
Или например,
— пушкино, тургенева 18а
Это именно «город Пушкино, ул. Тургенева, д18а» или «город Пушкино, мкр. Заветы Ильича, ул. Тургенева, д18а». Оба объекта находятся рядом, но имеют разный почтовый индекс и разные почтовые отделения. Местный, проживающий во втором адресе, как ни странно, скорее напишет первый адрес.
В этом кейсе ни приоритет, ни тип не сработают. Надо смотреть, какой номер дома завел клиент, и исходя из этого уже определять какой адрес он ввел. Но и этот способ не позволяет проверить достоверно — что же хочет клиент, если он ввел номер дома, например, д3.
Так что задача не тривиальна, а пример с пушкино выше поиск на n-gramm'ах даже близко не дает удовлетворительный результат.
0
НЛО прилетело и опубликовало эту надпись здесь
Пушкино, Пушкна есть — вот например: pushkino.choister.ru/kupit-kvartiru/ulitza-pushkina Но при этом если обратить внимание на сами объявления, то там вообще все замечательно:
В одном рекламном блоке (по одному дому) идет сразу два адреса:
Продается 1 комна…
Московская область, Пушкино, Пушкина, 8
1 комната…
Продаю 1 комнатную квартиру в Пушкинском р-не п. Лесной, Пушкина, д.8
То есть тоже вот пример — п. Лесной — в черте города, и его просто опускают при вводе.
По поводу n-gramm — все же не соглашусь. Они не исправляют ошибки эффективно, а при ранжировании результатов поиска могут серьезно ухудшить выборку. Например, в большинстве алгоритмов, если человек введет пушкин вместо пушкино — то по n-gramm пушкин будет доминировать.
Или другой пример — Саратов. Если ошибиться и написать Сартов — то n-gramm найдет поселок (или село — не помню точно) Сартово — оно более релевантно этой ошибке.
Вообще, в целом, я более-менее приемлимый результат получил только проводя последовательно несколько проверок:
— точное совпадение начала типа объекта (г, р-н, обл)
— точное совпадение по каждому значащему слову
— совпадение по граничному n-gramm с правом одной ошибки
— совпадение по n-gramm с правом одной ошибки
Вот только при этом получается что-то приемлимое. что-то вроде такого
— + 0.0000 init_parser Исходная строка: 'Спб, Марш. Жукова, 44 128'
+ 0.0003 clean_addr Очистка строки: 'спб, марш. жукова, 44 128'
+ 0.0003 split_addr Разбиение строки: [«спб», «марш.», «жукова», «44», «128»]
+ 0.0007 detect_sections Найдены секции: маршрут: [«спб», «марш.», «жукова»] дом: [«44», «128»], неизвестно: []
+ 0.0007 normalize_secti Финальные секции: маршрут: [«спб», «марш», «жукова»] дом: [«44», «128»], неизвестно: []
+ 0.0008 normalize_house Параметры house: [«44 (house)», «128 (kvartira)»]
+ 0.0008 replace_synonym Замена синонимов: [«санкт-петербург», «марш», «жукова»]
+ 0.0015 parse_federals Город федерального значения: [спб] -> [санкт-петербург] (исправлена ошибка написания)
+ 0.0015 parse_region Регион не найден
+ 0.0016 parse_area Район не найден
+ 0.0017 detect_route_el [«санкт-петербург (city)», «марш (street)», «жукова (street)»]
+ 0.0175 search_route Найдено 1 возможных варианта(ов)
+ 0.0179 profile_route Найден адрес 'г. Санкт-Петербург / проспект Маршала Жукова' (score=1.0)
+ 0.0180 parse_house Подготовлен запрос: '[«дом 44»]'
+ 0.0180 parse_house Формат квартиры — long: 'дом 44 квартира 128', short: 'д.44 кв.128'
+ 0.0347 validate_house Постройка найдена: 'дом 44 квартира 128'
198262, Город Санкт-Петербург, Проспект Маршала Жукова, дом 44 квартира 128
:)
В одном рекламном блоке (по одному дому) идет сразу два адреса:
Продается 1 комна…
Московская область, Пушкино, Пушкина, 8
1 комната…
Продаю 1 комнатную квартиру в Пушкинском р-не п. Лесной, Пушкина, д.8
То есть тоже вот пример — п. Лесной — в черте города, и его просто опускают при вводе.
По поводу n-gramm — все же не соглашусь. Они не исправляют ошибки эффективно, а при ранжировании результатов поиска могут серьезно ухудшить выборку. Например, в большинстве алгоритмов, если человек введет пушкин вместо пушкино — то по n-gramm пушкин будет доминировать.
Или другой пример — Саратов. Если ошибиться и написать Сартов — то n-gramm найдет поселок (или село — не помню точно) Сартово — оно более релевантно этой ошибке.
Вообще, в целом, я более-менее приемлимый результат получил только проводя последовательно несколько проверок:
— точное совпадение начала типа объекта (г, р-н, обл)
— точное совпадение по каждому значащему слову
— совпадение по граничному n-gramm с правом одной ошибки
— совпадение по n-gramm с правом одной ошибки
Вот только при этом получается что-то приемлимое. что-то вроде такого
— + 0.0000 init_parser Исходная строка: 'Спб, Марш. Жукова, 44 128'
+ 0.0003 clean_addr Очистка строки: 'спб, марш. жукова, 44 128'
+ 0.0003 split_addr Разбиение строки: [«спб», «марш.», «жукова», «44», «128»]
+ 0.0007 detect_sections Найдены секции: маршрут: [«спб», «марш.», «жукова»] дом: [«44», «128»], неизвестно: []
+ 0.0007 normalize_secti Финальные секции: маршрут: [«спб», «марш», «жукова»] дом: [«44», «128»], неизвестно: []
+ 0.0008 normalize_house Параметры house: [«44 (house)», «128 (kvartira)»]
+ 0.0008 replace_synonym Замена синонимов: [«санкт-петербург», «марш», «жукова»]
+ 0.0015 parse_federals Город федерального значения: [спб] -> [санкт-петербург] (исправлена ошибка написания)
+ 0.0015 parse_region Регион не найден
+ 0.0016 parse_area Район не найден
+ 0.0017 detect_route_el [«санкт-петербург (city)», «марш (street)», «жукова (street)»]
+ 0.0175 search_route Найдено 1 возможных варианта(ов)
+ 0.0179 profile_route Найден адрес 'г. Санкт-Петербург / проспект Маршала Жукова' (score=1.0)
+ 0.0180 parse_house Подготовлен запрос: '[«дом 44»]'
+ 0.0180 parse_house Формат квартиры — long: 'дом 44 квартира 128', short: 'д.44 кв.128'
+ 0.0347 validate_house Постройка найдена: 'дом 44 квартира 128'
198262, Город Санкт-Петербург, Проспект Маршала Жукова, дом 44 квартира 128
:)
0
НЛО прилетело и опубликовало эту надпись здесь
А кладр использовать тупо для выбора адресов не вариант?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как выбрать алгоритм для адресного фильтра