Сравнение строк Python "на мягкую руку": методы и библиотеки
Быстрый ответ
Для простого сопоставления строк по их схожести используйте fuzzywuzzy
и функцию fuzz.ratio()
:
from fuzzywuzzy import fuzz
# Кто лучше любит яблоки? Да не Appel!
print(fuzz.ratio("apple", "appel")) # Возвращает оценку похожести
Если вам требуется более высокая производительность, обратите внимание на rapidfuzz
:
from rapidfuzz import fuzz
# Рокси-кролик помешан на яблоках и согласится с этим
print(fuzz.ratio("apple", "appel")) # Возвращает оценку похожести
Чтобы их установить, выполните команду:
pip install fuzzywuzzy python-Levenshtein rapidfuzz
Детальный рассмотрение вариантов
Стоит ли использовать difflib?
Функция get_close_matches()
из модуля difflib
поможет найти схожие строки:
import difflib
# Помните – яблоко в день отгонит доктора прочь!
print(difflib.get_close_matches("appel", ["apple", "ape", "zebra"]))
С помощью функции ratio()
вы можете найти схожие строки:
from difflib import SequenceMatcher
# Яблоко, только под разными названиями...
similarity_ratio = SequenceMatcher(None, 'apple', 'appel').ratio()
print(similarity_ratio)
python-Levenshtein
выделяется своим быстродействием и настраиваемостью, успешно работая с Unicode-строками.
Jellyfish для уточненных задач
Jellyfish
станет превосходным инструментом при фонетическом сравнении. Для распознавания похоже звучащих слов или имен используйте Metaphone или Soundex:
import jellyfish
# Кэтрин или Кэтрин – в этом и нюанс...
print(jellyfish.soundex("Catherine"))
print(jellyfish.soundex("Kathryn"))
Визуализация
Пример затруднения с пониманием надписей на книгах на полке:
Bookshelf: ['Pyth0n Pr0gramm1ng', 'Jav4 Script', 'C++ D3sign', 'Phyton Coding']
Можно использовать представленные модули для поиска нужной книги, например 'Python Programming':
| Модуль | Помощь в поиске |
| --------------------- | ------------------------------------ |
| `fuzzywuzzy` | 🧠 Лучшее совпадение с оценкой |
| `difflib` | 🕵️♂️ Возможные варианты совпадений |
| `python-Levenshtein` | ⏩ Скорое вычисление редакционного расстояния |
| `rapidfuzz` | 🚀 Лучший поиск с оценкой эффективности |
Эти инструменты позволят вам находить нужные книги как всевещий библиотекарь.
Использование продвинутых методов сравнения
Алгоритм Damerau-Levenshtein для сложных случаев
Алгоритм Damerau-Levenshtein особенно эффективен при работе с транспозициями и превосходит обычное расстояние Левенштейна:
import jellyfish
# Яблоко? Апель? Что посередине?
print(jellyfish.damerau_levenshtein_distance("apple", "aplep"))
Когда важна скорость обработки
Rapidfuzz
заметно выигрывает в скорости при обработке больших объемов данных благодаря своей высокой производительности.
Выбор оптимальных метрик для сравнения строк
При выборе метрик сравнения строк следуйте этим рекомендациям:
- Для вычисления редакционного расстояния используйте расстояние Левенштейна.
- Если в строках присутствуют транспозиции, выберите Damerau-Levenshtein.
- Для коротких строк Jaro-Winkler станет оптимальным выбором.
- При работе с фонетическим сравнением выберите метрики Metaphone и Soundex.
Полезные материалы
- GitHub – seatgeek/fuzzywuzzy: Fuzzy String Matching in Python — Известная библиотека Python для сравнения строк с учетом неточностей.
- GitHub – rapidfuzz/RapidFuzz: Rapid fuzzy string matching in Python — Решение для быстрого сравнения строк в Python.
- difflib — Helpers for computing deltas — Python 3.12.2 documentation — Стандартный модуль Python для сравнения последовательностей.
- GitHub – life4/textdistance: Compute distance between sequences — Коллекция алгоритмов для вычисления расстояния между текстами.
- FuzzyWuzzy: Fuzzy String Matching in Python – ChairNerd — Образовательный ресурс по FuzzyWuzzy от SeatGeek.
- Levenshtein Distance and Text Similarity in Python — Обзор алгоритмов сравнения текстов в Python.