Поиск совпадений
Как сопоставить данные большого объема? В этой статье я хочу поделиться практикой решения задачи, когда данные совпадают по косвенным признакам и имеют различную структуру. Например, поиск совпадений адресов из внешних источников с внутренними базами данных. Для этого я использовал язык программирования Python и алгоритм Расстояния Левенштейна.
Расстояние Левенштейна (редакционное расстояние, дистанция редактирования) — это измерение, показывающее отличие между парой рядом стоящих знаков. Ее можно определить в виде минимума операций (вставки, удаления, замены), необходимых для преображения второй последовательности символов (слова, слов) в первую. Всем затратам на операции присваивается числовое значение. Расстояние Левенштейна для ‘аb’и ‘ас’как ‘ас’ниже:
Поэтому выравнивание:
а с
а b
Длина символьной последовательности = 2
Число несоответствий(затрат) = 1
Расстояние Левенштейна равно 1, потому что для изменения «ас» в «аb» (или наоборот) потребует только одну затрату на операцию замены.
Таким образом получаем:
Расстояние = (Количество затрат) / (Длина символьной последовательности) = 0,5
1/2 = 0,5 Расстояние Левенштейна для Python выглядит следующим образом:
Для Python существует большое количество бесплатных библиотек, для решения задачи будем использовать FuzzyWuzzy. FuzzyWuzzy — это библиотека соответствия строк. Другими словами, она говорит вам, насколько похожи два фрагмента текста (и некоторые другие функции).
В ней представлены такие функции как: Простое соотношение (ratio) – производит точное сравнение:
Частичное соотношение (partial_ratio), — производит «умное» сравнение с учетом возможных ошибок:
Коэффициент сортировки (token_sort_ratio) производит сравнение с учетом возможных перестановок:
Коэффициент соотношения (token_set_ratio) производит сравнение с учетом всех возможных изменений:
Библиотека позволяет работать с данными из файлов и файлами (extract) и выводит данные от максимально до минимально похожих значений. При помощи limit можно ограничить количество отображаемых данных.
У нас есть два типа данных:
Далее используем extractOne (показывает одно максимально похожее значение):
В результате получаем значение, максимально соответствующее искомому и коэффициент сравнения:
Осталось только применить вышеуказанный алгоритм для всех данных. Попробуйте и у Вас получится!