Я решил эту проблему с помощью комбинации нормализации адреса, метафона и расстояния Левенштейна. Вам нужно будет отделить имя от адреса, так как они имеют разные характеристики. Вот шаги, которые вам нужно сделать:
1) Сократите список совпадений, используя (первые шесть символов) почтовый индекс. В основном вам нужно будет вычислить расстояние Левенштейна для двух струн и выбрать те, которые имеют расстояние не более 1 или 2. Вы можете заранее вычислить таблицу почтовых индексов и их «соседей Левенштейна», если вам действительно нужно ускорить поиск.
http://en.wikipedia.org/wiki/Levenshtein_distance
2) Преобразовать все сокращения адресов в стандартный формат, используя список официальных префиксов и сокращений суффиксов из USPS. Это поможет сделать ваши результаты для следующего шага более равномерными:
https://www.usps.com/send/official-abbreviations.htm
3) Преобразовать адрес в короткий код, используя алгоритм метафона. Это избавит от наиболее распространенных орфографических ошибок. Просто убедитесь, что ваша реализация может исключить все несловарные символы, передать номера без изменений и обработать несколько слов (убедитесь, что каждое слово отделено одним пробелом):
http://en.wikipedia.org/wiki/Metaphone
4) Получив результат с метафона, сравните адресные строки, используя расстояние Левенштейна. Рассчитайте процент от оценки изменения, разделив результат на количество символов в более длинной строке.
5) Повторите шаги 3 и 4, но теперь используйте адреса вместо адресов.
6) Рассчитайте оценку для каждой записи, используя следующую формулу: (Вес для адреса * Оценка адреса) + (Вес для имени * Оценка имени). Выберите свой вес в зависимости от того, что важнее. Я бы начал с .9 для адреса (поскольку адрес более конкретен) и .1 для имени, но вес может зависеть от вашего приложения. Выберите запись с самым низким счетом. Если оценка слишком высокая (скажем, выше .15, вы можете объявить, что совпадений нет).