За последние 24 часа нас посетил 22861 программист и 1264 робота. Сейчас ищут 748 программистов ...

Сравнение фамилий

Тема в разделе "Решения, алгоритмы", создана пользователем mihdan, 17 фев 2009.

  1. mihdan

    mihdan Активный пользователь

    С нами с:
    6 май 2006
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Одинцово
    В БД логином служит ФИО человека.
    При регистрации человек часто ошибется в одной букве, потом не может из-за этот пройти авторизацию. И начинает клонировать анкеты.

    Сделал так: при неправильном логине выводится список похожих фамилий. Тупо разбивал ФИО по пробелам и сравнивал с тем, что в базе. Но вот в чем засада. Если человек ввел "Ивнов", то он не получит анкету товарища "Иванов".

    В этом собственно и вопрос, как реализовать

    Эта же тема поднималась и на другом форуме. Подробности там http://softtime.ru/forum/read.php?id_forum=1&id_theme=62577
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Средствами базы - никак. Это нужен поисковой алгоритм с определением морфологии по грамматическими подсказками - и то, иногда грамматические ошибки такие, что похожие результаты даже близко не стоят. Дайте человеку подсказку, что ничего не найдено, проверте ваш запрос.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Составьте список, и примеру, из 10000 корректных фамилий. При регистрации пускай проверяется наличие введенной фамилии в списке. Если не найдена, попросить пользователя подтвердить, что он ввел фамилию правильно.
     
  4. mihdan

    mihdan Активный пользователь

    С нами с:
    6 май 2006
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Одинцово
    Что-то все у вас слишком просто и не потеме, к сожалени
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    напишите по русски алгоритм, как считать похожими Ивнов и Иванов.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    mihdan
    Не надо использовать ФИО для логина. Бывают полные тезки.
     
  7. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    А пользователей планируется много? Если нет, то можно извратиться. Вытягивать все фамилии из базы в массив, а потом

    PHP:
    1. <? function print_simular($surname, $surname_from_base)
    2. {
    3. if (levenshtein( $surname, $lsurname_from_base)==1) // отличается на одну букву
    4. {echo 'похоже на: ',$surname_from_base;}
    5. }
    6.  
    7.  
    8. array_walk($surnames_list, 'print_simular');
    Тормозить? конечно, будет зверски. Ну так задание такое :)
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Я так понял, что меня никто не понял :) Есть таблица с 100.000 пользователей, у которых в профилях написаны валидные фамилии. Эти 100.000 пользователей - носители 95% распространеных фамилий. При регистрации нового, сравнивать, есть ли введеная им фамилия у кого-либо из этих 100.000 пользователей, если есть - значит фамилия правильная, если нет, то попросить у пользователя подтверждения того, что введеная им фамилия - валидная.
     
  9. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Да не, все поняли. Просто это не вариант. Пользователь нажмет на кнопку "подтверждаю" быстрее чем прочитает о чем речь. Вот ты когда в последний раз текст лицензии читал?
    Да и где их взять на старте, 100к пользователей?
    И что делать с фамилиями, отличающимися на одну букву? Лукин-Дукин, Путин-Пулин и так далее.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Выход - правильный дизайн. Красный заголовок h2 с текстом "Проверьте правильность фамилии", и маааленькая кнопочка "подтверждаю".
    А ты, когда при регистрации говорят, что такой логин уже существует, жмешь заново кнопку "регистрация" быстрее, чем прочитаешь текст ошибки? о_0
    Не выход - это вот это:
     
  11. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Это даже не вход. Если юзер свою фамилию вбить без ошибок не может, такого вообще не стоит к компу подпускать.

    Upd:
    Кстати, есть вариант :) при логине вместо обычного input type=text ставить select c автокомплитом :)
     
  12. mihdan

    mihdan Активный пользователь

    С нами с:
    6 май 2006
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Одинцово
    Люди пожилые - допускают всяческие ошибки при печати на клавиатуре.
    А вот вариант с автокомплитом - возможное решение.
    Вопрос остается открытым.
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Первая буква фамилии, скорее всего точна. Поэтому нужно выбирать все фамилии на 1 букву. Получится много. Поэтому, можно взять еще один ограничитель - длинна фамилии. Человек вряд ли ошибется более +/-2 буквы.
    Еще, чтобы облегчить труды сервера, можно ориентироваться на последнюю букву и предпоследнюю (считая её последней).
     
  14. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а если я напишу что меня зовут Саша Ли? Что мне покажет? Напишите фамилию еще раз для подтверждения?
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Так же ты можешь писать Вася Ли, Петя Ли, Лох ли.
     
  16. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    А что, он только в фамилии может сделать ошибку? А в имени и отчестве?
    Что-то какая-то негуманная система авторизации. Чтобы авторизоваться, нужно каждый раз фио вводить? Это ж пипец. Я б таким сервисом не стал пользоваться)
     
  17. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Поскольку про базу ничего не сказано, алгоритм в общих чертах.
    Для каждой фамилии строите набор трехбуквенных слов. Например, для Иванов строим **и, *ив, ива, ван, ано, нов, ов*, в**.
    Для введенной фамилии строим тоже самое.
    Ищем совпадения. Фамилия с наибольшим "попаданием" - наша.
    Реализация даже без полнотекстового поиска простая - строить свой словарь "трехбуквенное слово - указатель на фамилию". Делаем оттуда выборку по искомым сочетаниям (введенная фамилия) ну и смотрим какое id указателя чаще встречается.
     
  18. vuzy

    vuzy Активный пользователь

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    Хитро придумано. если мне память не изменяет где то была функция сравнения которая выдавала результат насколько похожи две сравниваемые строчки.

    и как вариант функции strcmp() , strcasecmp() , а так же функция которая приводит все в 1 регитр strtr($str,$from,$to)
    где фром и то просто строки в алфавитном порядке.

    Исходя из прочитанного выше текста я понял что сайт будет называтся старички ру где пожелые люди будуи сидеть точно так же как отцы и мамы на однокласниках и молодежь на вконтакте. И исходя из того что все бабушки хотят быть толи кошками толи клеопатрами использовать метод логина нелогично. ведь что может быть уникальнее чем "Брунгильда Ургант Мафусаиловна"
     
  19. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Для приведения в один регистр нужно использовать strtolower / strtoupper

    Без комментариев.