Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Нечёткий поиск  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Есть большая таблица с колонкой ФИО. Не все данные являются корректными: в основном, ФИО, иногда ИОФ, иногда просто ФИ, очень много просто опечаток.
Посоветуйте описание/алгоритм/реализацию нечёткого поиска по полю.
13 сен 15, 13:52    [18143808]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
=Сергей=,

Наведи в таблице порядок с полем ФИО.
Тогда не нужно будет выдумывать нечеткий алгоритм поиска.
13 сен 15, 13:56    [18143816]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
=Сергей=,

надо просто сделать простенького клиента, который мог бы апдейтить колонку.
Посадить за этого клиента юзеров, которые вручную исправят ошибки в ФИО.
Только так. ИМХО.

Но ошибок было бы меньше, если бы фамилия, имя и отчество хранились бы в отдельных полях.
13 сен 15, 13:59    [18143819]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
=Сергей=,

При наведении порядка можно применить частичную автоматизацию, для этого понадобится словарь имен. Словарь должен быть максимально полным :) Определяете по словарю, какое из слов - имя, остальное просто парсите, исходя из того, что отчество, если оно есть, записывается в одно слово. Если в строке найдены несколько слов, пишущихся как имя, то такой случай надо разбирать вручную.
13 сен 15, 14:12    [18143846]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
iap
=Сергей=,

надо просто сделать простенького клиента, который мог бы апдейтить колонку.
Посадить за этого клиента юзеров, которые вручную исправят ошибки в ФИО.
Только так. ИМХО.

Но ошибок было бы меньше, если бы фамилия, имя и отчество хранились бы в отдельных полях.


Запись изменение данных ФИО, это не наша задача, наша - поиск. И структурирование уже тоже неактуально - БД уже есть и наполняется.
13 сен 15, 15:28    [18143938]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Есть большая та
Guest
=Сергей=,

soundex, регулярки

как вариант:
- выстроить вычлененые отдельные слова по алфавиту, и не важно, где там имя, где фамилия - это регулярка + сортировка, возможно clr функция где все в одном или udf с разбиением по пробелу
- транслитерировать в латиницу - udf
- вычислить один или несколько вариантов soundex: по всему что есть, по отдельным словам и сложить в длинный код, то же, но без гласных; может быть отдельные саундэксы хранить на Ф, И, О. после упорядочивания - 1е слово, 2е, 3е.
13 сен 15, 15:41    [18143951]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Если подходить глобально, то можно внедрить Data Quality Services.
Или самому повозиться с Fuzzy Grouping Transformation.
14 сен 15, 08:45    [18145204]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Jaffar
Member

Откуда:
Сообщений: 633
=Сергей=,

Посмотрите тему по мне год так за 2010- 2011.
https://www.sql.ru/forum/726747-1/nechetkoe-sravnenie

там даже конкретный код функции написан.
14 сен 15, 09:30    [18145296]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Jovanny,

еще можно активировать FULL TEXT SEARCH на этих полях. Там, как минимум, порядое слов будет уже не важен.
Ну в вообще да - лучше разделить на отдельные поля ИМЯ, ФАМИЛИЯ, etc...
14 сен 15, 09:32    [18145302]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
ГуЗы
Guest
=Сергей=,
Почти в тему: поле дата строкой. Заполняют дд/мм/гггг или мм/дд/гггг т.е 01/12/гггг может быть и 1 декабря и 12 января - вот это класс! Сижу курю. Повлиять на источник данных никаких шансов нет...
14 сен 15, 09:35    [18145313]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
ГуЗы
=Сергей=,
Почти в тему: поле дата строкой. Заполняют дд/мм/гггг или мм/дд/гггг т.е 01/12/гггг может быть и 1 декабря и 12 января - вот это класс! Сижу курю. Повлиять на источник данных никаких шансов нет...

Можетт еще как-то язык/локаль вытащить можно, а им тогда уже формат даты сопоставить
14 сен 15, 09:58    [18145354]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
ГуЗы
Guest
Yuri Abele,
Источник - наши грешные люди. Из соседнего района города. Так что локаль тут никаким боком...
14 сен 15, 10:17    [18145400]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Pulsar_p
Member

Откуда: Потому, что я с севера, что ли...
Сообщений: 1908
=Сергей=
Я уже давно работаю с такими данными. Если взять суммарное количество записей с Ф И О в таблицах (с архивами), будет много больше 1 млн.
Мое глубокое ИМХО: пока не наведете порядок в базе, ни фига у вас не получится. Только время и нервы потеряете. Да и от пользователей много нелестного в свой адрес услышите. Идея с разбиением ФИО на Ф И О и справочником имен абсолютно правильная. Только у меня три справочника: имя, фамилия и отчество, при чем каждый с разделением по полу. Поверьте, это сильно облегчает жизнь.
14 сен 15, 11:09    [18145661]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
ГуЗы
Yuri Abele,
Источник - наши грешные люди. Из соседнего района города. Так что локаль тут никаким боком...

А ID источника существует? Можно и к нему привязаться
14 сен 15, 11:16    [18145702]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Lisichkin
Member

Откуда:
Сообщений: 487
Для русских фамилий, имен хорошо подходит алгоритм MetaPhone(RU) учитывающий грамматику Русского языка.

-- Алгоритм MetaPhone. Реализация этого алгоритма для русского языка показал Каньковски Пётр (kankowski@narod.ru) в журнале "Программист" за август 2002 года.
IF exists (SELECT * from dbo.sysobjects where id = object_id(N'[dbo].[MetaPhoneRu]') and xtype in (N'FN', N'IF', N'TF'))
  drop function [dbo].[MetaPhoneRu]
GO


CREATE FUNCTION dbo.MetaPhoneRu (@W varchar(4000))
RETURNS varchar(4000)
AS
BEGIN
DECLARE @alf varchar(4000), @cns1 varchar(4000), @cns2 varchar(4000), @cns3 varchar(4000), @ch varchar(4000), @ct varchar(4000)

SET @alf = 'ОЕАИУЭЮЯПСТРКЛМНБВГДЖЗЙФХЦЧШЩЁЫ'
SET @cns1 = 'БЗДВГ'
SET @cns2 = 'ПСТФК'
SET @cns3 = 'ПСТКБВГДЖЗФХЦЧШЩ'
SET @ch = 'ОЮЕЭЯЁЫ'
SET @ct = 'АУИИАИА'
-- @alf - алфавит кроме исключаемых букв, @cns1 и @cns2 - звонкие и глухие
-- согласные, @cns3 - согласные, перед которыми звонкие оглушаются,
-- @ch, @ct - образец и замена гласных

DECLARE @S varchar(4000), @V varchar(4000), @i int, @B int, @c char(1), @old_c char(1)
-- @S, @V - промежуточные строки, @i - счётчик цикла,
-- @B - позиция найденного элемента, @c - текущий символ

SET @W = UPPER(@W)
SET @S = ''
SET @V = ''

SET @i = 1
WHILE @i <= LEN(@W)
BEGIN
  SET @c = SUBSTRING(@W, @i, 1)
  IF CHARINDEX(@c, @alf)>0 SET @S = @S + @c
  SET @i=@i+1
END

IF LEN(@S) = 0 RETURN ''

-- Заменяем окончания
IF LEN(@S)>6
SET @S = LEFT(@S, LEN(@S) - 6) +
CASE RIGHT(@S, 6)
  WHEN 'ОВСКИЙ' THEN '@'
  WHEN 'ЕВСКИЙ' THEN '#'
  WHEN 'ОВСКАЯ' THEN '$'
  WHEN 'ЕВСКАЯ' THEN '%'
  ELSE RIGHT(@S, 6)
END

IF LEN(@S)>4
SET @S = LEFT(@S, LEN(@S) - 4) +
CASE RIGHT(@S, 4)
  WHEN 'ИЕВА' THEN '9'
  WHEN 'ЕЕВА' THEN '9'
  ELSE RIGHT(@S, 4)
END

IF LEN(@S)>3
SET @S = LEFT(@S, LEN(@S) - 3) +
CASE RIGHT(@S, 3)
  WHEN 'ОВА' THEN '9'
  WHEN 'ЕВА' THEN '9'
  WHEN 'ИНА' THEN '1'
  WHEN 'ИЕВ' THEN '4'
  WHEN 'ЕЕВ' THEN '4'
  WHEN 'НКО' THEN '3'
  ELSE RIGHT(@S, 3)
END

IF LEN(@S)>2
SET @S = LEFT(@S, LEN(@S) - 2) +
CASE RIGHT(@S, 2)
  WHEN 'ОВ' THEN '4'
  WHEN 'ЕВ' THEN '4'
  WHEN 'АЯ' THEN '6'
  WHEN 'ИЙ' THEN '7'
  WHEN 'ЫЙ' THEN '7'
  WHEN 'ЫХ' THEN '5'
  WHEN 'ИХ' THEN '5'
  WHEN 'ИН' THEN '8'
  WHEN 'ИК' THEN '2'
  WHEN 'ЕК' THEN '2'
  WHEN 'УК' THEN '0'
  WHEN 'ЮК' THEN '0'
  ELSE RIGHT(@S, 2)
END

-- Оглушаем последний символ, если он - звонкий согласный:
SET @B = CHARINDEX(RIGHT(@S, 1), @cns1)
IF @B > 0
  SET @S = LEFT(@S, LEN(@S)-1) + SUBSTRING(@cns2, @B, 1)

SET @old_c = ' '
SET @i = 1
WHILE @i <= LEN(@S)
BEGIN
  SET @c = SUBSTRING(@S, @i, 1)
  SET @B = CHARINDEX(@c, @ch)
  IF @B > 0
  BEGIN
    IF @old_c = 'Й' OR @old_c = 'И'
    BEGIN
      IF @c = 'О' OR @c = 'Е'
      BEGIN
        SET @old_c = 'И'
        SET @S = LEFT(@S, LEN(@S)-1) + @old_c
      END
      ELSE
        IF @c <> @old_c SET @V = @V + SUBSTRING(@ct, @B, 1)
    END
    ELSE
    BEGIN
      IF @c <> @old_c SET @V = @V + SUBSTRING(@ct, @B, 1)
    END
  END
  ELSE
  BEGIN
    IF @c <> @old_c
      AND CHARINDEX(@c, @cns3)>0
    BEGIN
      SET @B = CHARINDEX(@old_c, @cns1)
      IF @B>0
      BEGIN
        SET @old_c = SUBSTRING(@cns2, @B, 1)
        SET @V = LEFT(@V, LEN(@V)-1) + @old_c
      END
    END
    IF @c <> @old_c SET @V = @V + @c
  END
  SET @old_c = @c
  SET @i = @i + 1
END

RETURN (@V)
END
GO


select dbo.MetaPhoneRu('Иванов'), dbo.MetaPhoneRu('Ивонов')
-----------------------------------------------------------------------------
ИВАН4 ИВАН4

В случае если У Вас еще перепутан порядок следования ФИО, тут нужно или использовать либо подход предложенный Shakill или метод N Грамм.
14 сен 15, 11:27    [18145753]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
=Сергей=, конкретно для поиска дублей вида ФИО и ИОФ нужно разбить все строки с разделителем - пробел, соединить их в одну строку в порядке возрастания и сравнить (либо напрямую, либо через те же Ngram).

Например "Константинов Александр Сергеевич" и "Александр Сергеевич Константинов" у вас превратятся в строку "Александр Константинов Сергеевич" в обоих случаях, и вы сможете обнаружить равенство.

Этот способ чисто для поиска неправильного порядка, для опечаток можно использовать что-то из вышеприведенного.
14 сен 15, 14:16    [18146788]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
o-o
Guest
Minamoto
для поиска дублей вида ФИО и ИОФ нужно разбить все строки с разделителем - пробел, соединить их в одну строку в порядке возрастания и сравнить (либо напрямую, либо через те же Ngram).

хорошо, когда в ФИО понятно, что есть Ф, а что И.
у нас одного товарища зовут Michele Simone.
угадайте, что тут И, а что Ф.
оба слова катят как имена, но все же одно из них фамилия.
бардак надо искоренять на стадии проектирования.
вот попадет этот товарищ в вашу базу, и всей автоматизации по расчленению ФИО крышка
14 сен 15, 14:44    [18146926]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Jaffar
Member

Откуда:
Сообщений: 633
o-o,

Все ответы учать ТС жить ... надо было вам батенька додиться не от ваших родителей, а от ....., тогда и проблем было бы меньше.
В реальности нужно решать реальные задачи - а не придумывать идеальные условия.
14 сен 15, 15:01    [18147031]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
o-o
Guest
Jaffar
В реальности нужно решать реальные задачи - а не придумывать идеальные условия.

а я как раз про суровую реальность.
в моей конкретной ситуации
ни один из способов, кроме как вручную перелопатить, не подойдет.
у вас в базе видимо нет китайцев.
а у нас и х.и, и лохи.
и пойди догадайся, где имя, где фамилия, вот Dai Hui, где имя, простите?

К сообщению приложен файл. Размер - 13Kb
14 сен 15, 15:26    [18147169]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
o-o
Minamoto
для поиска дублей вида ФИО и ИОФ нужно разбить все строки с разделителем - пробел, соединить их в одну строку в порядке возрастания и сравнить (либо напрямую, либо через те же Ngram).

хорошо, когда в ФИО понятно, что есть Ф, а что И.
у нас одного товарища зовут Michele Simone.
угадайте, что тут И, а что Ф.
оба слова катят как имена, но все же одно из них фамилия.
бардак надо искоренять на стадии проектирования.
вот попадет этот товарищ в вашу базу, и всей автоматизации по расчленению ФИО крышка

Я лишь предложил способ поиска дублей. В этом способе совершенно неважно, что - имя, а что - фамилия. Этот вопрос встанет лишь тогда, когда с дублями надо будет что-то делать - например, сливать их в одну запись, или ставить пометку о неактуальности записи. Этот вопрос, я так думаю, автор уже сам решит.
14 сен 15, 15:40    [18147252]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Minamoto,

18143819
iap
Посадить за этого клиента юзеров, которые вручную исправят ошибки в ФИО.
Только так. ИМХО.


Ведь проблема не только в перепутывании местами ФИО, а в пропущенных буквах, например,
в похожем виде некоторых латинских и кириллических букв, в разном количестве разделителей
(кстати, они тоже бывают разными и в то же время похожими на пробел)...
14 сен 15, 15:57    [18147357]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ТС,
есть целый пласт систем для решения таких сложных задач. Почитайте про MDM/НСИ.
14 сен 15, 16:00    [18147377]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
чуток не понял
Guest
Konst_One,

...mdm/нси это не _решения_ никаких проблем.
14 сен 15, 16:04    [18147406]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
o-o
Guest
Minamoto
Я лишь предложил способ поиска дублей. В этом способе совершенно неважно, что - имя, а что - фамилия.

а я про эту самую ситуацию.
если один Микеле с фамилией Симоне,
а второй Симоне с фамилией Микеле,
то это совсем не дубль.
только пойди разбери, у нас 2 разных человека или один и тот же,
занесенный в виде ФИ и ИФ.
т.е. это все равно, что номер дома и квартиры переставить.
когда порядок произвольный, докопаться до истины с ходу не получится
14 сен 15, 16:05    [18147412]     Ответить | Цитировать Сообщить модератору
 Re: Нечёткий поиск  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
чуток не понял
Konst_One,

...mdm/нси это не _решения_ никаких проблем.


не понял вашей фразы. эти системы как раз для этого и предназначены.
https://ru.wikipedia.org/wiki/Управление_основными_данными
14 сен 15, 16:06    [18147419]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить