Задолбался руками адреса сверять? Python to the rescue!
Привет, пикабушники! Недавно столкнулся с задачей, от которой у любого глаза на лоб полезут: нужно было сравнить два огромных списка адресов. Проблема в том, что адреса были записаны как попало, без каких-либо нормальных идентификаторов. Один и тот же адрес мог выглядеть так:
"д. Малое Шилово, ул. Березовая, д. 7" и "Березовая 7_М Шилово"
"п. Ласьва, ул. Весенняя, д. 5" и "Весенняя 5_Ласьва"
"Луговой пер 5, Краснокамск г" и "г. Краснокамск, пер. Луговой, 5"
"д. Новая Ивановка, ул. Солнечная, 18" и "д.Новая Ивановка, ул.Солнечная, 18"
Задача стояла так: "В реестре поданных объектов отметить все согласованные объекты (из общего списка согласованных)".
Руками это делать - вообще не вариант. Поэтому решил запилить скрипт на Python. Какие есть варианты?
Fuzzy matching (нечеткое совпадение): алгоритмы, которые сравнивают строки, учитывая опечатки, разный порядок слов и сокращения.
Геокодинг: преобразование текстового адреса в координаты.
Fuzzy matching мне показался более подходящим. Он не требует, чтобы адрес был на карте (а вдруг объект еще строится?), и хорошо справляется с разными вариантами написания.

картинка не совсем в тему, но прикольная, про fuzzy logic
Геокодинг, конечно, тоже можно использовать, но он может быть неточным, особенно в деревнях. Да и не все адреса на картах есть.
Как я это сделал:
Подготовка данных: Сначала нужно привести адреса к единому формату. Убрать лишние пробелы, точки, запятые, сокращения типа "д.", "ул.", "г.". Для этого использовал Python с библиотеками pandas, openpyxl и fuzzywuzzy. (pip install pandas openpyxl fuzzywuzzy)
Fuzzywuzzy magic: Библиотека fuzzywuzzy использует алгоритм Левенштейна, чтобы определить, насколько строки похожи. Я использовал fuzz.token_sort_ratio, которая сортирует слова по алфавиту перед сравнением, чтобы порядок слов не мешал. Еще добавил фильтрацию по цифрам в адресе, чтобы ускорить процесс.
Скрипт: Скрипт загружает данные из Excel, чистит адреса, ищет совпадения с помощью fuzzywuzzy, помечает согласованные объекты плюсиком "➕", а несогласованные - крестиком "❌", и сохраняет результат в новый файл.
Profit! Автоматизация сэкономила кучу времени и нервов. Скрипт легко адаптировать под другие задачи, где нужно сравнивать текст.
Что можно улучшить:
Комбинировать fuzzy matching с геокодингом для большей точности.
Добавить обработку большего количества сокращений и вариантов написания.
Вопросы? Предложения? Пишите в комментарии!
Автор: Михаил Шардин,
20 января 2025 г.
Программирование на python
785 постов11.9K подписчика
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• конструктивность комментариев
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу