Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

алгоритмы выборки похожих фио [D7, XP, 2003]


Страницы:   1 2 3 4 5

Дмитрий ©   (2015-04-17 18:43:00) 

Имеется таблица Персонал связанная с таблицей Предприятия.
Появилась потребность сохранять личные координаты контактов и бонусы при смене места работы
Добавили таблицу Персоналии с личными телефонами и бонусами.
Тут же возникла проблема- при добавлении новой записи в персонал требуется определить не существует ли такая личность в Персоналиях.
Во избежание многократного дублирования.

Какие существуют алгоритмы выборки похожих лиц, включая возможные ошибки в написании имен и перестановки типа "Иван Иванов" и "Иванов Иван"?


Дмитрий   (2015-04-30 19:25:00) [21]

Наоборот
При отсутствии каких-либо совпадений, запись создается в Персоны, ссылка заносится в Персонал
При нечетком совпадении (или при любых совпадениях) - на решение оператору.


Юрий Зотов   (2015-04-30 18:54:00) [22]

> Если никаких совпадений не найдено, создается новая запись,
>  ссылку на которую и помещаем в Персонал.


Это опасно. Допустим в БД - Миха Йлович, на входе - Миха Илович, а остальные атрибуты совпадают. То есть, это один и тот же человек, который при строгом сравнении будет продублирован  и мы получим грязь в базе.

Я бы использовал нечеткое сравнение и автоматически создавал новую запись только при совпадении 100%, а если меньше - то на откуп оператору.


Дмитрий   (2015-04-30 17:28:00) [23]


> Юрий Зотов ©   (30.04.15 14:35) [70]
>  Недавно решал ту же задачу.Параметры
> поиска были разбиты на 2 группы - обязательные и необязательные.
>  Результаты поиска получились в трех категориях:1. Полное
> соответствие (совпали все параметры)2. Частичное соответствие
> (совпали обязательные параметры, но не совпал хотя бы один
> необязательный).3. Не найдено (не совпал хотя бы один обязательный
> параметр).По категории 1 программа может сделать нужные
> действия автоматически. По категории 2 решение принимает
> оператор. По категории 3 не делается ничего.


Именно так, кроме п.3
Если никаких совпадений не найдено, создается новая запись, ссылку на которую и помещаем в Персонал.


Юрий Зотов   (2015-04-30 15:24:00) [24]

Нечеткое сравнение строк:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=722


Юрий Зотов   (2015-04-30 15:17:00) [25]

Вдогонку - и про TRIM не забываем, а то понагонят пробелов в БД...


Юрий Зотов   (2015-04-30 15:14:00) [26]

И что касается собственно поиска по ФИО.

1. В экранном интерфейсе есть птичка - различать Е и Ё, или не различать. Оператор ставит эту птичку как ему надо. Если не различать, то в тексте запроса к БД используем TRANSLATE (замена Ё на Е), а в параметрах запроса - ReplaceAll (та же замена). И в любом случае используем UPPER.

2. Жаль, конечно, что на входе атрибуты в ФИО могут меняться местами, но это можно обойти простым перебором (и искать сцепленное ФИО).

Допустим, на входе имеем: Мусик Пусик. Мы не знаем, где тут фамилия, где имя, а где отчество. Запрос примерно такой:

select ... from ... where
(LastName || FirstName || Patronymic)  =  'МусикПусик'
or
(LastName || Patronymic || FirstName)  =  'МусикПусик'
or
... -- остальные 4 варианта


Запрос, конечно, не самый лучший, но суть он показывает.


Юрий Зотов   (2015-04-30 14:35:00) [27]

> Дмитрий   (29.04.15 18:33) [67]

> Меня вполне устроит показать оператору список записей уже
> зарегистрированных персоналей, схожих с создаваемой.


Недавно решал ту же задачу.

Параметры поиска были разбиты на 2 группы - обязательные и необязательные. Результаты поиска получились в трех категориях:
1. Полное соответствие (совпали все параметры)
2. Частичное соответствие (совпали обязательные параметры, но не совпал хотя бы один необязательный).
3. Не найдено (не совпал хотя бы один обязательный параметр).

По категории 1 программа может сделать нужные действия автоматически. По категории 2 решение принимает оператор. По категории 3 не делается ничего.

Такое решение всех устроило (да и возможно ли другое?). Надо только хорошо продумать критерии поиска (какие параметры обязательные, а какие - нет). И еще надо иметь в виду, что одна входная запись может породить не одну, а несколько выходных записей в категории 2.


Германн   (2015-04-30 02:07:00) [28]


> Дмитрий   (29.04.15 18:33) [67]
>
>
> > Труп Васи Доброго ©   (29.04.15 01:32) [52]
> > > Про какой бардак заявлял труп васи?Про полный. Если
> нет
> > формализации и ключа у "персонала", то твоя задача нерешаема.
>
> >
>
>
> Бардак начинается, когда вы, не внимательно прочитав, делаете
> поспешные выводы.
> Вы также не различаете "задачу не решаемую", "не решаемую
> автоматически", "не решаемую в теории", и "задачу имеющую
> удовлетворительное решение"
>
> Меня вполне устроит показать оператору список записей уже
> зарегистрированных персоналей, схожих с создаваемой.

Вопрос в том устроит ли такое решение твоего работодателя.


brother   (2015-04-29 18:56:00) [29]

> Чтобы оператор решал по месту, создавать новую запись или
> привязаться к уже существующей.

> Чтобы оператор решал по месту, создавать новую запись или
> привязаться к уже существующей.

те потом будет что анализировать оператор? имхо: день рождения, адрес проживания, снилс...
2.


Дмитрий   (2015-04-29 18:33:00) [30]


> Труп Васи Доброго ©   (29.04.15 01:32) [52]
> > Про какой бардак заявлял труп васи?Про полный. Если нет
> формализации и ключа у "персонала", то твоя задача нерешаема.
>


Бардак начинается, когда вы, не внимательно прочитав, делаете поспешные выводы.
Вы также не различаете "задачу не решаемую", "не решаемую автоматически", "не решаемую в теории", и "задачу имеющую удовлетворительное решение"

Меня вполне устроит показать оператору список записей уже зарегистрированных персоналей, схожих с создаваемой.
Чтобы оператор решал по месту, создавать новую запись или привязаться к уже существующей.


Ega23   (2015-04-29 14:55:00) [31]


> Сканировать отпечатки пальцев, рисунок сетчатки


Угу. Ещё взвешивали. Было дело.


Kilkennycat   (2015-04-29 14:20:00) [32]


> Сканировать отпечатки пальцев, рисунок сетчатки и стоматологическую
> карту

днк из позвоночника


Труп Васи Доброго   (2015-04-29 14:12:00) [33]

Сканировать отпечатки пальцев, рисунок сетчатки и стоматологическую карту. Редких двойников расстреливать на месте и кремировать останки. Это единственный способ. Решение любой задачи требует каких-то допущений, иначе ничего невозможно сделать. Если 99,99999% пациентов имеют ФИО, то и базу надо под них проектировать, а пришедщего Остапа Ибрагима Сулеймана Берта Марию Бендер-бея внести в БД просто как Остапа Ибрагимовича Бендера. Объяснить человеку, если потребуется, что в программе такие ограничения и ничего нельзя поделать. Вот и всё.


Inovet   (2015-04-29 13:14:00) [34]

После озвучивания реальной задачи делаем вывод - задача ещё более неразрешимая. Отличаются ли степени неразрешимости? Нет. А вот степени возможностей контроля различаются - ИНН/СНИЛС у одних есть у других нет, а документ удостоверяющий личность у всех должен быть. Хуже, но хоть как-то можно ПРИ ВВОДЕ проконтролировать задвоение. Хуже тем, что через год этот же человек придёт с новым паспортом - поменял по возрасту, сменил фамилию, потерял старый, его вносят повторно и никак не проверить был ли он уже внесён, особенно в случае смены ФИО. Ни программа не проверит, ни оператор.


Ega23   (2015-04-29 12:11:00) [35]


> Ну да, чтобы потом спрашивать: "Как отличить Иванова Ивана от Ивана Иванова".


Зависит от задачи. Хотя я бы в любом случае разбил бы на три части, составное поле всегда можно сделать.


Styx   (2015-04-29 11:54:00) [36]


> Govindjee

У него ставят в качестве имени FNU - first name unknown. Хотя по факту это именно первое имя, а от last он отказался (почему - можете найти в сети). И у тех двух девушек, насколько я знаю, стоит одно имя - по информации от, собственно, Govindgee - он очень любит рассквзывать, что рн - один из трёх людей ы Штатах с одним именем. :)


Труп Васи Доброго   (2015-04-29 11:35:00) [37]


> можно всё в одном поле хранить.

Ну да, чтобы потом спрашивать: "Как отличить Иванова Ивана от Ивана Иванова".


Ega23   (2015-04-29 11:00:00) [38]


> Как всё это (вместе с оглы и монголами) помешает системе
> ФИО из трёх полей????


Речь не о трёх полях, а о коверканьи ФИО. В трёх полях или в одном - это вопрос исключительно удобства пользователей, если им не надо печатать пропуска/отчеты/карточки по шаблону, гда ФИО в трёх разных местах сидит, а также не надо часто по ФИО искать - можно всё в одном поле хранить.


Inovet   (2015-04-29 10:54:00) [39]

> [57] Труп Васи Доброго ©   (29.04.15 09:43)
> Как всё это (вместе с оглы и монголами) помешает системе ФИО из трёх полей

Для ФИО должно быть три поля, кто же спорит.


Труп Васи Доброго   (2015-04-29 09:43:00) [40]


>  Отчества может не быть и в РФ.


> А бывают люди с одним именем. Напрмер, Madonna, Cher и Govindjee.

Не бывают. Это которые Мадонна Луиза Чикконе, Ше́рилин Саркися́н Лапье́р Бо́но О́ллмэн?
Это лишь слова. Докажите делом или законом. Выкладывайте скан реального паспорта гражданина РФ, родившегося в РФ, без фамилии, имени или отчества.

> Гражданство РФ можно получить не осуществляя свое рождение
> в РФ.

И что?
Как всё это (вместе с оглы и монголами) помешает системе ФИО из трёх полей????
Кто мешает оставить поле ПУСТЫМ??? Или как система трёх полей помешает записать в поле "имя" что то экзотическое, вроде Жерар-Ксавье или Жан-Поль?


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо