Задолбался руками адреса сверять? Python to the rescue!

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

  • "д. Малое Шилово, ул. Березовая, д. 7" и "Березовая 7_М Шилово"

  • "п. Ласьва, ул. Весенняя, д. 5" и "Весенняя 5_Ласьва"

  • "Луговой пер 5, Краснокамск г" и "г. Краснокамск, пер. Луговой, 5"

  • "д. Новая Ивановка, ул. Солнечная, 18" и "д.Новая Ивановка, ул.Солнечная, 18"

Задолбался руками адреса сверять? Python to the rescue! Программирование, IT, Гайд, Гифка, Длиннопост

Задача стояла так: "В реестре поданных объектов отметить все согласованные объекты (из общего списка согласованных)".

Руками это делать - вообще не вариант. Поэтому решил запилить скрипт на Python. Какие есть варианты?

  1. Fuzzy matching (нечеткое совпадение): алгоритмы, которые сравнивают строки, учитывая опечатки, разный порядок слов и сокращения.

  2. Геокодинг: преобразование текстового адреса в координаты.

Fuzzy matching мне показался более подходящим. Он не требует, чтобы адрес был на карте (а вдруг объект еще строится?), и хорошо справляется с разными вариантами написания.

Задолбался руками адреса сверять? Python to the rescue! Программирование, IT, Гайд, Гифка, Длиннопост

картинка не совсем в тему, но прикольная, про fuzzy logic

Геокодинг, конечно, тоже можно использовать, но он может быть неточным, особенно в деревнях. Да и не все адреса на картах есть.

Задолбался руками адреса сверять? Python to the rescue! Программирование, IT, Гайд, Гифка, Длиннопост

Как я это сделал:

  1. Подготовка данных: Сначала нужно привести адреса к единому формату. Убрать лишние пробелы, точки, запятые, сокращения типа "д.", "ул.", "г.". Для этого использовал Python с библиотеками pandas, openpyxl и fuzzywuzzy. (pip install pandas openpyxl fuzzywuzzy)

  2. Fuzzywuzzy magic: Библиотека fuzzywuzzy использует алгоритм Левенштейна, чтобы определить, насколько строки похожи. Я использовал fuzz.token_sort_ratio, которая сортирует слова по алфавиту перед сравнением, чтобы порядок слов не мешал. Еще добавил фильтрацию по цифрам в адресе, чтобы ускорить процесс.

Задолбался руками адреса сверять? Python to the rescue! Программирование, IT, Гайд, Гифка, Длиннопост

Скрипт: Скрипт загружает данные из Excel, чистит адреса, ищет совпадения с помощью fuzzywuzzy, помечает согласованные объекты плюсиком "➕", а несогласованные - крестиком "❌", и сохраняет результат в новый файл.

Задолбался руками адреса сверять? Python to the rescue! Программирование, IT, Гайд, Гифка, Длиннопост

Profit! Автоматизация сэкономила кучу времени и нервов. Скрипт легко адаптировать под другие задачи, где нужно сравнивать текст.

Что можно улучшить:

  • Комбинировать fuzzy matching с геокодингом для большей точности.

  • Добавить обработку большего количества сокращений и вариантов написания.

Вопросы? Предложения? Пишите в комментарии!

Автор: Михаил Шардин,

20 января 2025 г.

Программирование на python

785 постов11.9K подписчика

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу