Сравнение адресов 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 шт):

Автор решения: CrazyElf
  • почистить всякий мусор
  • использовать нечёткое сравнение

В первом приближении может выглядеть так:

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, но дополнительная чистка/нормализация данных может помочь - надо смотреть, где алгоритм не справляется и добавлять ещё преобразований данных.

Но вообще может получиться и так, что вы в итоге утонете в этих преобразованиях данных. В общем случае это довольно нетривиальная задача и она может оказаться гораздо сложнее, чем выглядит на первый взгляд.

→ Ссылка