Сравнение строк Python "на мягкую руку": методы и библиотеки

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для простого сопоставления строк по их схожести используйте fuzzywuzzy и функцию fuzz.ratio():

Python
Скопировать код
from fuzzywuzzy import fuzz
# Кто лучше любит яблоки? Да не Appel!
print(fuzz.ratio("apple", "appel"))  # Возвращает оценку похожести

Если вам требуется более высокая производительность, обратите внимание на rapidfuzz:

Python
Скопировать код
from rapidfuzz import fuzz
# Рокси-кролик помешан на яблоках и согласится с этим
print(fuzz.ratio("apple", "appel"))  # Возвращает оценку похожести

Чтобы их установить, выполните команду:

pip install fuzzywuzzy python-Levenshtein rapidfuzz
Кинга Идем в IT: пошаговый план для смены профессии

Детальный рассмотрение вариантов

Стоит ли использовать difflib?

Функция get_close_matches() из модуля difflib поможет найти схожие строки:

Python
Скопировать код
import difflib
# Помните – яблоко в день отгонит доктора прочь!
print(difflib.get_close_matches("appel", ["apple", "ape", "zebra"]))

С помощью функции ratio() вы можете найти схожие строки:

Python
Скопировать код
from difflib import SequenceMatcher
# Яблоко, только под разными названиями...
similarity_ratio = SequenceMatcher(None, 'apple', 'appel').ratio()
print(similarity_ratio)

python-Levenshtein выделяется своим быстродействием и настраиваемостью, успешно работая с Unicode-строками.

Jellyfish для уточненных задач

Jellyfish станет превосходным инструментом при фонетическом сравнении. Для распознавания похоже звучащих слов или имен используйте Metaphone или Soundex:

Python
Скопировать код
import jellyfish
# Кэтрин или Кэтрин – в этом и нюанс...
print(jellyfish.soundex("Catherine"))
print(jellyfish.soundex("Kathryn"))

Визуализация

Пример затруднения с пониманием надписей на книгах на полке:

Markdown
Скопировать код
Bookshelf: ['Pyth0n Pr0gramm1ng', 'Jav4 Script', 'C++ D3sign', 'Phyton Coding']

Можно использовать представленные модули для поиска нужной книги, например 'Python Programming':

Markdown
Скопировать код
| Модуль                | Помощь в поиске                      |
| --------------------- | ------------------------------------ |
| `fuzzywuzzy`          | 🧠 Лучшее совпадение с оценкой       |
| `difflib`             | 🕵️‍♂️ Возможные варианты совпадений    |
| `python-Levenshtein`  | ⏩ Скорое вычисление редакционного расстояния |
| `rapidfuzz`           | 🚀 Лучший поиск с оценкой эффективности |

Эти инструменты позволят вам находить нужные книги как всевещий библиотекарь.

Использование продвинутых методов сравнения

Алгоритм Damerau-Levenshtein для сложных случаев

Алгоритм Damerau-Levenshtein особенно эффективен при работе с транспозициями и превосходит обычное расстояние Левенштейна:

Python
Скопировать код
import jellyfish
# Яблоко? Апель? Что посередине?
print(jellyfish.damerau_levenshtein_distance("apple", "aplep"))

Когда важна скорость обработки

Rapidfuzz заметно выигрывает в скорости при обработке больших объемов данных благодаря своей высокой производительности.

Выбор оптимальных метрик для сравнения строк

При выборе метрик сравнения строк следуйте этим рекомендациям:

  • Для вычисления редакционного расстояния используйте расстояние Левенштейна.
  • Если в строках присутствуют транспозиции, выберите Damerau-Levenshtein.
  • Для коротких строк Jaro-Winkler станет оптимальным выбором.
  • При работе с фонетическим сравнением выберите метрики Metaphone и Soundex.

Полезные материалы

  1. GitHub – seatgeek/fuzzywuzzy: Fuzzy String Matching in Python — Известная библиотека Python для сравнения строк с учетом неточностей.
  2. GitHub – rapidfuzz/RapidFuzz: Rapid fuzzy string matching in Python — Решение для быстрого сравнения строк в Python.
  3. difflib — Helpers for computing deltas — Python 3.12.2 documentationСтандартный модуль Python для сравнения последовательностей.
  4. GitHub – life4/textdistance: Compute distance between sequences — Коллекция алгоритмов для вычисления расстояния между текстами.
  5. FuzzyWuzzy: Fuzzy String Matching in Python – ChairNerd — Образовательный ресурс по FuzzyWuzzy от SeatGeek.
  6. Levenshtein Distance and Text Similarity in Python — Обзор алгоритмов сравнения текстов в Python.