Сравнение адресов Python
Пытаюсь разобраться, как сравнить строки Примеры строк
1. г. Москва, вн.тер.г. муниципальный округ Тверской, ул Кузнецкий Мост, д. 4/3, стр. 1, этаж МАНСАРДНЫЙ, ПОМ. I, ком. 413
2. г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1
3. 105005 г. Москва 2-я Бауманская ул. 5 стр. 1
4. 105005 г. Москва ул. Радио д. 20
Как видно, строки 1 и 2 содержат в целом одинаковый адрес. А строки 3 и 4 разный. Я не могу понять, как сделать,чтобы программа выдавала, что 1 и 2 адрес - один и тот же. Даже не знаю с чего начать...
Ответы (1 шт):
- почистить всякий мусор
- использовать нечёткое сравнение
В первом приближении может выглядеть так:
import re
from fuzzywuzzy import fuzz
junk_words = [
r'вн\.тер\.г\.',
'муниципальный округ',
r'этаж \w+',
r'ПОМ\. \w+',
r'ком\. \w+',
r'\,']
junk_re = re.compile('|'.join(f'{w}' for w in junk_words), re.IGNORECASE)
addresses = [
'г. Москва, вн.тер.г. муниципальный округ Тверской, ул Кузнецкий Мост, д. 4/3, стр. 1, этаж МАНСАРДНЫЙ, ПОМ. I, ком. 413',
'г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1',
'105005 г. Москва 2-я Бауманская ул. 5 стр. 1',
'105005 г. Москва ул. Радио д. 20',
]
addr_processed = [junk_re.sub('', addr).strip() for addr in addresses]
print('\n'.join(addr_processed))
for i,w1 in enumerate(addr_processed):
for j,w2 in enumerate(addr_processed):
if i >= j:
continue
print(i, j, fuzz.ratio(w1.lower(),w2.lower()))
Почищенные от ненужной информации адреса:
г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1
г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1
105005 г. Москва 2-я Бауманская ул. 5 стр. 1
105005 г. Москва ул. Радио д. 20
Результаты сравнения:
0 1 98
0 2 52
0 3 45
1 2 51
1 3 46
2 3 63
Обычно рейтинг где-то >95 означает, что данные можно считать совпадающими. В данном случае совпадают 1-й и 2-й адреса, остальные сравнения дают очень маленький рейтинг. Основные проблемы бывают на рейтинге от 85 до 95, но дополнительная чистка/нормализация данных может помочь - надо смотреть, где алгоритм не справляется и добавлять ещё преобразований данных.
Но вообще может получиться и так, что вы в итоге утонете в этих преобразованиях данных. В общем случае это довольно нетривиальная задача и она может оказаться гораздо сложнее, чем выглядит на первый взгляд.