В реальном мире строки редко совпадают «под копирку».
Например:
"aPpLe iPhone® 14 Pro Max"
"iphone 14 pro max"
Вопрос — чем сравнивать? Ответ зависит от того, что именно вы хотите поймать.
1️⃣ Regex — чистим шум по шаблону
Идеален как первый шаг: убрать мусор, стандартизировать формат.
import re
def clean(t):
t = t.lower()
t = re.sub(r"[®™©]", "", t)
return re.sub(r"\s+", " ", t).strip()
clean("iPhone® 14 Pro Max")
# 'iphone 14 pro max'
✅ Приводит строки к общему виду
✖️ Не знает, что «наушники» и «headphones» — это одно и то же
2️⃣ difflib — встроенный baseline
Умеет считать похожесть на уровне символов. Отлично для быстрого «на коленке».
from difflib import SequenceMatcher
SequenceMatcher(None, "iphone 14 pro max", "i phone 14 pro max").ratio()
# 0.97
✅ Ловит пробелы и опечатки
✖️ Путается, если слова меняются местами
3️⃣ RapidFuzz — быстрый и умный fuzzy
Оптимизированный под скорость и адекватнее реагирует на перестановку слов.
from rapidfuzz import fuzz
fuzz.WRatio("apple iphone 14 pro max", "iphone 14 pro max apple")
# 95
✅ Справляется с разным порядком слов и лишними словами
✖️ Для него «wireless headphones» и «bluetooth earbuds» — разные вещи
4️⃣ Sentence Transformers — смысл > буквы
Нейросети, которые понимают значение, а не только текстовый паттерн.
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
m = SentenceTransformer('all-MiniLM-L6-v2')
cosine_similarity(
[m.encode("wireless headphones")],
[m.encode("bluetooth earbuds")]
)[0][0]
# 0.75
✅ Понимает синонимы и концептуальную близость
✖️ Требует ресурсов, особенно на больших данных
➡️ Как выбирать:
—
re → всегда первым шагом—
difflib → мелкие задачи без зависимостей—
RapidFuzz → продакшн, большие объёмы, сложные текстовые вариации—
Sentence Transformers → смысл важнее скорости, есть GPU🐸 Библиотека питониста
#буст
