Сравнение строк, унифицирующих специальные символы в Python

Вероятно, я мог бы использовать лучший английский, но я хочу игнорировать акцент (и тому подобное) в словах, поэтому:

renè, rené, rene' и rene должны быть одинаковыми, поэтому должно быть

mañana и manana или

even-distribuited и even distribuited и возможно

shouldn't и shouldnt

Я помню функцию (заимствованную из журналистики), используемую, например, для адресов интернет-страниц, которые должны удалять пробелы, акценты и т. д., но я не помню названия. Я думаю, это должно работать, но допускается другой способ

Спасибо

Возможный дубликат: stackoverflow.com/q/517923/13951118

David 24.07.2024 09:53

Во второй части вы можете просто re.sub убрать ненужных вам персонажей.

David 24.07.2024 09:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, в этом вопросе обсуждается стандартный подход к избавлению от специальных символов . Но, возможно, вы могли бы рассмотреть другой подход, который часто называют нечетким сопоставлением (или нечетким поиском).

[...] метод поиска строк, которые приблизительно (а не точно) соответствуют шаблону

В Python для этого можно использовать TheFuzz. Вот попытка на основе ваших примеров.

from thefuzz import fuzz

tuples = [("mañana", "manana"), ("shouldn't", "shouldnt"), ("even-distribuited", "even distribuited")]

for tuple in tuples:
  print(f"{tuple[0]} vs {tuple[1]}: {fuzz.ratio(tuple[0], tuple[1])}")

# mañana vs manana: 83
# shouldn't vs shouldnt: 94
# even-distribuited vs even distribuited: 94

Таким образом, вы можете определить правило, основанное на соотношении, чтобы сделать вывод о совпадении между двумя строками.


Вы даже можете объединить нормализацию Юникода и нечеткое сопоставление для достижения лучших результатов.

tuples = [("mañana", "manana"), ("shouldn't", "shouldnt"), ("even-distribuited", "even distribuited")]

def compare(tuples, unicode=True):
  for t in tuples:
    if unicode:
      t = tuple(map(lambda x: unicodedata.normalize(u'NFKD', x).encode('ascii', 'ignore').decode('utf8'), t))
    print(f"{t[0]} vs {t[1]}: {fuzz.ratio(t[0], t[1])}")

compare(tuples)

# manana vs manana: 100
# shouldn't vs shouldnt: 94
# even-distribuited vs even distribuited: 94

Другие вопросы по теме