Ответ 1
Отличный вопрос.
Я инженер в SeatGeek, поэтому я думаю, что могу помочь здесь. У нас отличное сообщение в блоге, которое объясняет различия довольно хорошо, но я могу обобщить и дать некоторое представление о том, как мы используем разные типы.
обзор
Под капотом каждый из четырех методов вычисляет расстояние редактирования между некоторым упорядочением токенов в обеих входных строках. Это выполняется с difflib.ratio
функции difflib.ratio
которая будет:
Возвратите меру сходства последовательностей (float в [0,1]).
Где T - общее количество элементов в обеих последовательностях, а M - количество совпадений, это 2.0 * M/T. Обратите внимание, что это 1, если последовательности идентичны, и 0, если они не имеют ничего общего.
Четыре метода fuzzywuzzy вызывают difflib.ratio
для разных комбинаций входных строк.
fuzz.ratio
Просто. Просто вызывает difflib.ratio
на двух входных строках (код).
fuzz.ratio("NEW YORK METS", "NEW YORK MEATS")
> 96
fuzz.partial_ratio
Попытки объяснить частичную строку соответствуют лучше. ratio
вызовов с использованием кратчайшей строки (длина n) по всем подстрокам n-длины большей строки и возвращает наивысший балл (код).
Обратите внимание, что "YANKEES" - это кратчайшая строка (длина 7), и мы управляем соотношением с "YANKEES" против всех подстрок длины 7 "NEW YORK YANKEES" (который будет включать проверку против "YANKEES", 100% -ную совпадение ):
fuzz.ratio("YANKEES", "NEW YORK YANKEES")
> 60
fuzz.partial_ratio("YANKEES", "NEW YORK YANKEES")
> 100
fuzz.token_sort_ratio
Попытки вывести из строя аналогичные строки. ratio
вызовов по обеим строкам после сортировки токенов в каждой строке (код). Обратите внимание, что fuzz.ratio
и fuzz.partial_ratio
оба не fuzz.partial_ratio
, но как только вы сортируете токены, это соответствует 100%:
fuzz.ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 45
fuzz.partial_ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 45
fuzz.token_sort_ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 100
fuzz.token_set_ratio
Попытки исключить различия в строках. Соотношение вызовов на трех конкретных подстроках и возвращает max (код):
- только пересечение и пересечение с остатком строки 1
- пересечение и пересечение с остатком второй строки
- пересечение с остатком одного и пересечение с остатком двух
Обратите внимание, что, разделив пересечение и остатки двух строк, мы учитываем как сходные, так и разные две строки:
fuzz.ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 36
fuzz.partial_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 61
fuzz.token_sort_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 51
fuzz.token_set_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 91
заявка
Здесь происходит волшебство. В SeatGeek по существу мы создаем векторную оценку с каждым соотношением для каждой точки данных (место проведения, название события и т.д.) И используем это для информирования о программных решениях сходства, которые характерны для нашей проблемной области.
Сказанное, правда, сказал, что это не похоже, что FuzzyWuzzy полезен для вашего случая использования. Это будет потрясающе плохо при определении того, являются ли два адреса похожими. Рассмотрим два возможных адреса для штаб-квартиры SeatGeek: "235 Park Ave Floor 12" и "235 Park Ave S. Floor 12":
fuzz.ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 93
fuzz.partial_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 85
fuzz.token_sort_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 95
fuzz.token_set_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 100
FuzzyWuzzy дает этим строкам высокий балл матча, но один адрес - наш фактический офис возле Юнион-сквер, а другой находится на другой стороне Гранд-Центра.
Для вашей проблемы вам будет лучше использовать Google Geocoding API.