@rkhokhorin

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

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

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

Но в этом алгоритме возникла такая проблема. Предположим, мне прилетел Дима и Дмитрий. Транслитом здесь переводить ничего не нужно. После стемминга мы получим дим и дмитр... и, как вы понимаете, расстояние Левенштейна скажет, что это разные имена. Из этого вопрос: как понять, что дима = дмитрий или дим = дмитр? Может существуют библиотечки для python такого поиска? Или есть какой то алгоритм? Или мой алгоритм полностью неверен?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
@grecha10
Если это не учебная, а практическая задача, то вы необоснованно усложняете реализацию. Проще и удобнее использовать таблицу имен. Не говоря уже о том, что это единственный способ сравнить одинаковые, но совершенно по разному звучащие имена, например Георгий и Жора, Анна и Нюра.

Для создания таблицы имен можно использовать обыкновенный список. Например:
names = [
       ('Саша', 'Александр'), 
       ('Георгий', 'Жора'), 
       ('Лена', 'Леночка', 'Lena')
]

name1 = 'Жора'
name2 = 'Георгий'
for x in names:
    if name1 in x and name2 in x:
        print(name1, name2, 'same')
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@anerev
Самый хороший вариант найти какую не будь библиотеку для сравнений. Первое что нашел поиск https://antonz.ru/difflib-ratio/
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Из этого вопрос: как понять, что дима = дмитрий или дим = дмитр?

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

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

Проверки:
1. Смена первых соседних букв местами: 123 -> 132 (Дима->Дмитрий) или 123 -> 213 (...)
2. Сдвиг с добавлением новой буквы впереди: 12 -> 012 (Лена->Елена, Катя->Екатерина, Лёша->Алексей)
3. Совпадение первых двух букв с паттерном внутри слова и затем проверка: или две согласных подряд, или совпадение 3-х букв подряд: Саша -> Александр, Кеша -> Инокентий.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы