문제

두 개의 다른 데이터 소스 사이에 사람의 이름으로 일치하는 데 사용할 수있는 도구 나 방법이 있습니까?

시스템에는 다른 공통 정보가 없으며 많은 경우 이름이 다르게 입력되었습니다.

비 게시 성냥의 예 :

King Jr., Martin Luther = King, Martin (접미사 제외)
Erving, Dr. J. = Erving, J. (접두사 제외)
오바마, 바락 후세인 = 오바마, 바락 (중간 이름 제외)
pufnstuf, hr = pufnstuf, Haibane Renmei (매치 약어)
TankEngine, Thomas = Tankengine, Tom (일치 공통 별명)
Flair, Rick "The Natureboy"= Flair, Natureboy (별명에 일치)

도움이 되었습니까?

해결책

나는 제안 된 다양한 기술을 사용해야했다. 올바른 방향으로 나를 지적해 주셔서 감사합니다. 바라건대, 다음은 이러한 유형의 문제를 해결하는 데 도움이되기를 바랍니다.

과도한 캐릭터 제거

CREATE FUNCTION [dbo].[fn_StripCharacters]
(
    @String NVARCHAR(MAX), 
    @MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    SET @MatchExpression =  '%['+@MatchExpression+']%'

    WHILE PatIndex(@MatchExpression, @String) > 0
        SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')

    RETURN @String

END

용법:

--remove all non-alphanumeric and non-white space  
dbo.fn_StripCharacters(@Value, , '^a-z^0-9 ')  

이름을 부품으로 분할하십시오

CREATE FUNCTION [dbo].[SplitTable] (@sep char(1), @sList StringList READONLY)
RETURNS @ResultList TABLE 
    (
        [ID] VARCHAR(MAX),
        [Val] VARCHAR(MAX)
    )
AS
BEGIN

declare @OuterCursor cursor
declare @ID varchar(max)
declare @Val varchar(max)

set @OuterCursor = cursor fast_forward for (SELECT * FROM @sList) FOR READ ONLY

open @OuterCursor

fetch next from @OuterCursor into @ID, @Val

while (@@FETCH_STATUS=0)
begin

    INSERT INTO @ResultList (ID, Val)   
    select @ID, split.s from dbo.Split(@sep, @Val) as split 
           where len(split.s) > 0

    fetch next from @OuterCursor into @ID, @Val
end

close @OuterCursor
deallocate @OuterCursor 

CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      LTRIM(RTRIM(SUBSTRING(@s, start, 
             CASE WHEN stop > 0 
                  THEN stop-start 
                  ELSE 8000 
             END))) AS s
    FROM Pieces
  )

RETURN

용법:

--create split name list
DECLARE @NameList StringList 

INSERT INTO @NameList (ID, Val)
SELECT id, firstname FROM dbo.[User] u
WHERE PATINDEX('%[^a-z]%', u.FirstName) > 0 

----remove split dups
select u.ID, COUNT(*)
from dbo.import_SplitTable(' ', @NameList) splitList
INNER JOIN dbo.[User] u
ON splitList.id = u.id

일반적인 별명 :

나는 그에 따라 테이블을 만들었습니다 이 목록 공통 이름에 동등한 사람들이 결합하는 데 사용했습니다.

용법:

SELECT u.id
, u.FirstName
, u_nickname_maybe.Name AS MaybeNickname
, u.LastName
, c.ID AS ContactID from
FROM dbo.[User] u 
INNER JOIN nickname u_nickname_match
ON u.FirstName = u_nickname_match.Name
INNER JOIN nickname u_nickname_maybe
ON u_nickname_match.relatedid = u_nickname_maybe.id
LEFT OUTER JOIN
(
    SELECT c.id, c.LastName, c.FirstName, 
         c_nickname_maybe.Name AS MaybeFirstName
    FROM dbo.Contact c
    INNER JOIN nickname c_nickname_match
    ON c.FirstName = c_nickname_match.Name
    INNER JOIN nickname c_nickname_maybe
    ON c_nickname_match.relatedid = c_nickname_maybe.id
    WHERE c_nickname_match.Name <> c_nickname_maybe.Name
) as c
ON c.AccountHolderID = ah.ID 
       AND u_nickname_maybe.Name = c.MaybeFirstName AND u.LastName = c.LastName
WHERE u_nickname_match.Name <> u_nickname_maybe.Name

음성 알고리즘 (Jaro Winkler) :

놀라운 기사, Soundex 너머 - MS SQL Server에서 퍼지 검색 기능, 설치 및 사용 방법을 보여줍니다 심해 SQL 서버로의 라이브러리. 이 라이브러리를 사용하면 문자열간에 상대적인 유사성을 찾을 수 있으며 수많은 알고리즘이 포함되어 있습니다. 나는 주로 사용하게되었습니다 Jaro Winkler 이름과 일치합니다.

용법:

SELECT
u.id AS UserID
,c.id AS ContactID
,u.FirstName
,c.FirstName 
,u.LastName
,c.LastName
,maxResult.CombinedScores
 from
(
    SELECT
      u.ID
    , 
        max(
            dbo.JaroWinkler(lower(u.FirstName), lower(c.FirstName))  
            * dbo.JaroWinkler(LOWER(u.LastName), LOWER(c.LastName))
        ) AS CombinedScores
    FROM dbo.[User] u, dbo.[Contact] c
    WHERE u.ContactID IS NULL
    GROUP BY u.id
) AS maxResult
INNER JOIN dbo.[User] u
ON maxResult.id  = u.id
INNER JOIN dbo.[Contact] c
ON maxResult.CombinedScores = 
dbo.JaroWinkler(lower(u.FirstName), lower(c.FirstName)) 
* dbo.JaroWinkler(LOWER(u.LastName), LOWER(c.LastName))

다른 팁

매우 복잡한 문제이며 올바르게 수행 할 수있는 비싼 도구가 많이 있습니다.
Tom, Dick 또는 Harry (또는 Bill)와 같이 비행기에서 체크인 할 수없는 이유가 궁금했다면
또는 비행 없음 목록과 테러리스트 감시 목록이 작동하지 않는 이유 -Consider :

(1) Muammar Qaddafi
(2) Mo'ammar Gadhafi
(3) Muammar Kaddafi
(4) Muammar Qadhafi
(5) Moammar El Kadhafi
(6) Muammar Gadafi
(7) Mu'ammar al-Qadafi
(8) Moamer El Kazzafi
(9) Moamar al-Gaddafi
(10) Mu'ammar al qathafi
(11) Muammar al qathafi
(12) Mo'ammar El-Gadhafi
(13) Moamar El Kadhafi
(14) Muammar al-Qadhafi
(15) Mu'ammar al-Qadhdhafi
(16) Mu'ammar Qadafi
(17) Moamar Gaddafi
(18) Mu'ammar Qadhdhafi
(19) Muammar Khaddafi
(20) Muammar al-Khaddafi
(21) Mu'amar al-Kadafi
(22) Muammar Ghaddafy
(23) Muammar Ghadafi
(24) Muammar Ghaddafi
(25) Muamar Kaddafi
(26) Muammar Quathafi
(27) Muammar Gheddafi
(28) Muamar al-Kaddafi
(29) Moammar Khadafy
(30) Moammar Qudhafi
(31) Mu'ammar al-Qaddafi
(32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi

그리고 그것은 단지 공식적인 철자 일뿐입니다 - 오타는 포함되지 않습니다!

나는 종종 이러한 유형의 상황에 대해 Soundex 유형 알고리즘을 사용합니다. 시도해보십시오 이중 은유 연산. SQL Server를 사용하는 경우 사용자 정의 기능을 작성하는 소스 코드가 있습니다.

데이터를 바꾸었기 때문에 데이터를 조금 정상화하고, 예를 들어, 모든 쉼표와 분류 결과를 첫 글자로 제거 할 수 있습니다. 그것은 당신에게 더 나은 일치 잠재력을 줄 것입니다. 중간에 단어가 추가 된 경우 조금 더 어려워집니다. 이름을 단어로 나누고, 다른 열에 일치하는 단어가 있는지 여부를 이중 은유로 확인한 다음 전체 매치와 단어 수를 수집하여 두 열이 얼마나 가까이 있는지 알려줍니다.

또한 비교를하기 전에 Dr., Mr., Mrs., Mrs. 등과 같은 일반적인 단어를 걸러 낼 것입니다.

몇 가지 옵션은 다음과 같습니다.

음성 알고리즘 ...

사슴 (soundex)http://en.wikipedia.org/wiki/soundex)

이중 은유 (이중 중유) (http://en.wikipedia.org/wiki/double_metaphone)

거리 편집 (http://en.wikipedia.org/wiki/levenshtein_distance)

Jaro-Winkler 거리 (http://en.wikipedia.org/wiki/jaro-winkler_distance)

당신이 시도 할 수있는 또 다른 것은 각 단어 (공간에서 분할과 하이픈)를 다른 이름으로 각 단어와 비교하고 얼마나 많은 단어가 일치하는지를 보는 것입니다. 어쩌면 더 퍼지 매칭을 위해 이것을 음성 알고리즘과 결합 할 수도 있습니다. 거대한 데이터 세트의 경우 각 단어를 색인하고 이름 ID와 일치시킬 것입니다. 약어 일치의 경우 첫 번째 문자 만 비교할 수 있습니다. 당신은 아마도 단어를 비교할 때 글자 외에는 아무것도 무시하고 싶을 것입니다.

많은 음성 알고리즘에는 온라인에서 오픈 소스 / 샘플이 있습니다.

은유 3 은유 알고리즘의 3 세대입니다. 이중 은유의 89%에서 발음 인코딩의 정확도를 증가시킵니다. 98%, 가장 일반적인 영어 단어의 데이터베이스에 대해 테스트 한 바와 같이, 북미에서 친숙한 이름과 영어 이외의 단어. 이것은 미국 발음에 대한 매우 신뢰할 수있는 발음 인코딩을 생성합니다.

Metaphone 3은 Lawrence Philips에 의해 설계 및 개발되었으며, 그는 원래 은유 및 이중 은유 알고리즘을 설계하고 개발했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top