Как сравнить имена по их части (или производной) в python?
============================================================

 У меня есть 2 имени и мне нужно сравнить их. Проблема заключается в том, что я не знаю как написаны эти 2 имени. Там может оказаться Дмитрий и Dmitry, может Димочка и Димон, может одно из имён будет написано с ошибкой. Мне нужно сравнить их и убедиться, что это одинаковые имена (или нет). Для этого я придумал такой алгоритм:  

  

1. Транслитом переводим имена (если в них попадаются не кириллические символы)
2. Делаем стемминг по имени
3. Проходим по получившимся именам алгоритмом по поиску расстояния Левенштейна (кол-во ошибок задаём 2)

  

Но в этом алгоритме возникла такая проблема. Предположим, мне прилетел Дима и Дмитрий. Транслитом здесь переводить ничего не нужно. После стемминга мы получим дим и дмитр... и, как вы понимаете, расстояние Левенштейна скажет, что это разные имена. Из этого вопрос: как понять, что дима = дмитрий или дим = дмитр? Может существуют библиотечки для python такого поиска? Или есть какой то алгоритм? Или мой алгоритм полностью неверен? 

 Если это не учебная, а практическая задача, то вы необоснованно усложняете реализацию. Проще и удобнее использовать таблицу имен. Не говоря уже о том, что это единственный способ сравнить одинаковые, но совершенно по разному звучащие имена, например Георгий и Жора, Анна и Нюра.  

  

Для создания таблицы имен можно использовать обыкновенный список. Например:  

```
names = [
       ('Саша', 'Александр'), 
       ('Георгий', 'Жора'), 
       ('Лена', 'Леночка', 'Lena')
]

name1 = 'Жора'
name2 = 'Георгий'
for x in names:
    if name1 in x and name2 in x:
        print(name1, name2, 'same')
```
 

 Самый хороший вариант найти какую не будь библиотеку для сравнений. Первое что нашел поиск <https://antonz.ru/difflib-ratio/> 

> Из этого вопрос: как понять, что дима = дмитрий или дим = дмитр? 

  

**Используем только, если расстояние большое!**  

  

Сначала уравниваем "веса" некоторых букв: е=ё, р=ш=н.  

  

**Проверки:**  

1. Смена первых соседних букв местами: 123 -> 132 (**Дим**а->**Дми**трий) или 123 -> 213 (...)  

2. Сдвиг с добавлением новой буквы впереди: 12 -> 012 (**Ле**на->**Еле**на, **Ка**тя->**Ека**терина, **Лё**ша->**Але**ксей)  

3. Совпадение первых двух букв с паттерном внутри слова и затем проверка: или две согласных подряд, или совпадение 3-х букв подряд: **Са**ша -> Алек**санд**р, **Ке**ша -> Ино**кент**ий.  

  

Это без словаря, но со словарём - будет надёжнее!