RapidFuzz — это библиотека быстрого сопоставления строк для Python и C++, которая использует вычисления сходства строк из FuzzyWuzzy. Однако есть несколько аспектов, которые отличают RapidFuzz от FuzzyWuzzy:
Он имеет лицензию MIT, поэтому его можно использовать в зависимости от того, какую лицензию вы захотите выбрать для своего проекта, в то время как при использовании FuzzyWuzzy вы вынуждены принять лицензию GPL.
Он предоставляет множество строковых метрик, таких как Hamming или jaro_winkler, которые не включены в FuzzyWuzzy.
Он в основном написан на C++ и, кроме того, содержит множество алгоритмических улучшений, которые делают сопоставление строк еще быстрее, обеспечивая при этом те же результаты. Подробные тесты см. в документации.
Исправляет несколько ошибок в реализации partial_ratio
.
Его можно в основном использовать в качестве замены fuzzywuzzy
. Однако есть пара отличий API, описанных здесь.
Python 3.9 или новее
В Windows требуется распространяемый пакет Visual C++ 2019.
Существует несколько способов установки RapidFuzz. Рекомендуемые методы — использовать pip
(менеджер пакетов Python) или conda
(кроссплатформенный менеджер пакетов с открытым исходным кодом).
RapidFuzz можно установить с помощью pip
следующим образом:
pip установить RapidFuzz
Существуют готовые двоичные файлы (колеса) RapidFuzz для MacOS (10.9 и более поздних версий), Linux x86_64 и Windows. На piwheels доступны колеса для Armv6l (Raspberry Pi Zero) и Armv7l (Raspberry Pi).
✖️ ошибка «Ошибка импорта: не удалось загрузить DLL»
Если вы столкнулись с этой ошибкой в Windows, причина, скорее всего, в том, что не установлен распространяемый пакет Visual C++ 2019, который необходим для поиска библиотек C++ (версия C++ 2019 включает версии 2015, 2017 и 2019).
RapidFuzz можно установить с помощью conda
:
установка conda -c conda-forge RapidFuzz
RapidFuzz можно установить непосредственно из исходного дистрибутива путем клонирования репозитория. Для этого требуется компилятор с поддержкой C++17.
git clone --recursive https://github.com/rapidfuzz/rapidfuzz.gitcd Rapidfuzz установка пипа.
Некоторые простые функции показаны ниже. Полную документацию по всем функциям можно найти здесь.
Обратите внимание, что в RapidFuzz 3.0.0 строки по умолчанию не подвергаются предварительной обработке (удаление всех небуквенно-цифровых символов, обрезка пробелов, преобразование всех символов в нижний регистр). Это означает, что при сравнении двух строк, которые имеют одинаковые символы, но разные регистры («это слово», «ЭТО СЛОВО»), их значение оценки сходства может быть разным, поэтому при сравнении таких строк вы можете увидеть разницу в оценке. стоимость по сравнению с предыдущими версиями. Некоторые примеры сопоставления строк с предварительной обработкой можно найти здесь.
Бомбардиров в RapidFuzz можно найти в модулях fuzz
и distance
.
> from Rapidfuzz import fuzz> fuzz.ratio("это тест", "это тест!")96.55172413793103
> from Rapidfuzz import fuzz> fuzz.partial_ratio("это тест", "это тест!")100.0
> from Rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy был медведем", "wuzzy fuzzy был медведем")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy был медведем", "wuzzy fuzzy был медведем")100.0
> from Rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy был медведем", "fuzzy fuzzy был медведем")84.21052631578947> fuzz.token_set_ratio("fuzzy был медведем", "fuzzy fuzzy был медведем")100.0# Возвращает 100.0 если одна строка является подмножеством другой, независимо от дополнительного содержимого в более длинной строке> fuzz.token_set_ratio("fuzzy был медведем, но не собакой", "fuzzy был медведем")100.0# Оценка снижается только тогда, когда есть явные разногласия в двух строках> fuzz.token_set_ratio("fuzzy was a медведь, но не собака», «Фузи был медведем, а не котом») 92.3076923076923
> from Rapidfuzz import fuzz> fuzz.WRatio("это тест", "это новый тест!!!")85.5> from Rapidfuzz import fuzz, utils> # Удаление небуквенно-цифровых символов("!") из string> fuzz.WRatio("это тест", "это новый тест!!!", процессор=utils.default_process) # здесь "это новый тест!!!" преобразуется в "это новый тест" 95.0> fuzz.WRatio("это тест", "это новый тест") 95.0> # Преобразование строки в нижний регистр> fuzz.WRatio("это слово" , "ЭТО СЛОВО")21.42857142857143> fuzz.WRatio("Это слово", "ЭТО СЛОВО", процессор=utils.default_process) # здесь «ЭТО СЛОВО» преобразуется в «это слово» 100.0
> from Rapidfuzz import fuzz> fuzz.QRatio("это тест", "это новый тест!!!")80.0> from Rapidfuzz import fuzz, utils> # Удаление небуквенно-цифровых символов("!") из string> fuzz.QRatio("это тест", "это новый тест!!!", процессор=utils.default_process)87.5> fuzz.QRatio("это тест", "это новый тест")87.5> # Преобразование строки в нижний регистр> fuzz.QRatio("это слово", "ЭТО СЛОВО")21.42857142857143> fuzz.QRatio("это слово", "ЭТО СЛОВО" , процессор=utils.default_process)100.0
Модуль процесса позволяет сравнивать строки со списками строк. Обычно это более производительно, чем использование средств оценки непосредственно из Python. Вот несколько примеров использования процессоров в RapidFuzz:
> из процесса импорта RapidFuzz, fuzz> choice = ["Атланта Фэлконз", "Нью-Йорк Джетс", "Нью-Йорк Джайентс", "Даллас Ковбойз"]>process.extract("Нью-Йорк Джетс", choices, scor=fuzz. WRatio, limit=2)[('Нью-Йорк Джетс', 76.92307692307692, 1), ('Нью-Йорк Джайентс', 64.28571428571428, 2)]>process.extractOne("cowboys", choices, Scor=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # С предварительной обработкой> from Rapidfuzz importprocess, fuzz, utils>process.extract( «Нью-Йорк Джетс», выбор, scorer=fuzz.WRatio, limit=2, процессор=utils.default_process)[('Нью-Йорк Джетс', 100.0, 1), ('Нью-Йорк Джайентс', 78.57142857142857, 2)]>process.extractOne("ковбои", выбор, Scor=fuzz.WRatio, процессор=utils.default_process)('Даллас Ковбои, 90,0, 3)
Полную документацию процессоров можно найти здесь.
Следующий тест дает быстрое сравнение производительности между RapidFuzz и FuzzyWuzzy. Более подробные тесты для строковых метрик можно найти в документации. Для этого простого сравнения я создал список из 10 000 строк длиной 10, который сравнивается с выборкой из 100 элементов из этого списка:
слова = [".".join(random.choice(string.ascii_letters + string.digits) для _ в диапазоне (10)) для _ в диапазоне (10_000) ]samples =words[::len(words) // 100]
Первый тест сравнивает производительность средств оценки в FuzzyWuzzy и RapidFuzz, когда они используются непосредственно из Python, следующим образом:
для образца в образцах: для слова в словах: бомбардир (образец, слово)
На следующем графике показано, сколько элементов обрабатывается в секунду каждым из счетчиков. Между разными бомбардирами существуют большие различия в результативности. Однако каждый из бомбардиров быстрее в RapidFuzz.
Второй тест сравнивает производительность при использовании скореров в сочетании с cdist следующим образом:
cdist(образцы, слова, бомбардир = бомбардир)
На следующем графике показано, сколько элементов обрабатывается в секунду каждым из счетчиков. В RapidFuzz использование средств оценки через такие процессоры, как cdist
происходит намного быстрее, чем напрямую. Вот почему их следует использовать везде, где это возможно.
Если вы используете RapidFuzz для своей работы и хотите вернуть немного своей выгоды для поддержки проекта, рассмотрите возможность отправки нам денег через спонсоров GitHub или PayPal, которые мы можем использовать, чтобы купить нам свободное время для обслуживания этой замечательной библиотеки. исправлять ошибки в программном обеспечении, просматривать и интегрировать код, улучшать его функции и документацию или просто время от времени делать глубокий вдох и пить чашку чая. Спасибо за вашу поддержку.
Поддержите проект через спонсоров GitHub или через PayPal:
RapidFuzz лицензируется по лицензии MIT, поскольку я считаю, что каждый должен иметь возможность использовать его, не принуждая принимать лицензию GPL. Вот почему библиотека основана на более старой версии fuzzywuzzy, которая также была лицензирована MIT. Эту старую версию fuzzywuzzy можно найти здесь.