У меня есть реализация Python нечеткого сопоставления с использованием подобия Левенштейна. Я очень доволен этим, но я чувствую, что многое оставляю на столе, не учитывая структуру струн.
Вот несколько примеров совпадений, которые явно хороши, но Левенштейн не уловил их хорошо:
The Hobbit / Hobbit/TheCharlies Angles / Charlie's AngelsApples & Pairs / Apples and PairsЯ думаю, что некоторая нормализация перед использованием Левенштейна была бы хорошей - например. заменить все & на and, удалить знаки препинания и т. д. ... не уверен, что хочу сразу перейти к удалению стоп-слов и лематизации, но что-то в этом роде
Чтобы не изобретать велосипед, есть ли простой способ сделать это? Или альтернатива левенштейну, которая решает эти проблемы (за исключением некоторых вложений Берта)

да, вы можете использовать некоторую предварительную обработку, как показано ниже, и удалить небуквенно-цифровые символы или преобразовать все в нижний регистр или дополнительные пробелы:
def preprocess_string(s):
s = s.lower()
s = s.replace('&', 'and')
s = re.sub(r'[^a-z0-9 ]', '', s)
s = re.sub(r'\s+', ' ', s).strip()
s = re.sub(r'&', 'and', s).strip()
return s
на самом деле предварительная обработка всегда имеет решающее значение для такого рода сравнения.
rapidfuzz.utils.default_process может быть вариантом для предварительной обработки.
Rapidfuzz.utils.default_process(предложение: ул) → ул Эта функция предварительно обрабатывает строку:
- удаление всех не буквенно-цифровых символов
- удаление пробелов
- перевод всех символов в нижний регистр
ПАРАМЕТРЫ: предложение (str) – строка для предварительной обработки
ВОЗВРАТ: обрабатываемая_строка – обработанная строка
ТИП ВОЗВРАТА: ул
Я ищу какое-то стандартное применение этих замен, я бы не хотел заново изобретать все нормализации.