2009-06-12 11 views
15

Czy istnieją jakieś narzędzia lub metody, których można użyć do dopasowania nazwiska osoby między dwoma różnymi źródłami danych?Dopasowywanie rekordów na podstawie nazwiska osoby

Systemy nie mają innych wspólnych informacji, a nazwy zostały wprowadzone w różny sposób w wielu przypadkach.

Przykładami niejonowych dokładnych wyników:

Kinga Martin Luther = King Martina (wyklucza przyrostek)
Ervinga dr J = Ervinga J. (wyklucza prefiks)
Obama Barak Hussein = Obama Barak (wyklucza drugie imię)
Pufnstuf, HR = Pufnstuf, Haibane Renmei (skróty mecz)
Tankengine Thomas = Tankengine Tom (mecz wspólne pseudonimy)
Flair, Rick "THE Natureboy" = Flair , Natureboy (mecz pod pseudonimem)

Odpowiedz

14

Musiałem użyć różnych sugerowanych technik. Dzięki wskazaniu mnie we właściwym kierunku. Mamy nadzieję, że poniższe wskazówki pomogą komuś innemu rozwiązać ten problem.

usuwając nadmiar znaków

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

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

    RETURN @String 

END 

Zastosowanie:

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

Podział nazwę na części

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 

Zastosowanie:

--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 

Wspólne pseudonimy:

Stworzyłem tabelę w oparciu o this list i używali go do przyłączenia się na wspólnych odpowiedniki nazw.

Zastosowanie:

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 

fonetyczne algorytmy (Jaro Winkler):

Zdumiewająca artykuł, Beyond SoundEx - Functions for Fuzzy Searching in MS SQL Server, pokazuje jak zainstalować i korzystać z biblioteki SimMetrics w SQL Server. Ta biblioteka pozwala znaleźć względne podobieństwo między ciągami i zawiera wiele algorytmów. Skończyłem głównie używając Jaro Winkler, aby dopasować nazwy.

Zastosowanie:

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)) 
+0

To musi być najbardziej wyczerpująca odpowiedź na SO - to problem, który rozwiązałem w kodzie, ale nigdy w czystym Sql - bardzo elegancki. – MrTelly

+0

@MrTelly Dzięki. Musiałem jednak odwołać się do CLR dla biblioteki SimMetrics. Miejmy nadzieję, że uratuje to kogoś przed bólem w projekcie konwersji. –

1

Często stosuję algorytmy typu soundex dla tego typu sytuacji. Wypróbuj algorytm Double Metaphone. Jeśli używasz programu SQL Server, istnieje pewien kod źródłowy do utworzenia funkcji zdefiniowanej przez użytkownika.

Ponieważ masz transponowane dane, możesz trochę je znormalizować, np. Usunąć wszystkie przecinki i sortować otrzymane słowa pierwszą literą. To da ci lepszy potencjał dopasowania. W przypadku, gdy słowa zostały dodane w środku, staje się nieco trudniejsze. Możesz rozważyć łamanie nazwy w słowach, sprawdzanie za pomocą Double Metaphone, czy w drugiej kolumnie znajduje się słowo, które pasuje, a następnie zebrać ogólną liczbę dopasowań względem słów, która powie ci, jak blisko są te dwie kolumny.

Chciałbym również odfiltrować popularne słowa, takie jak Dr, Pan, Pani, Pani, itp., Przed wykonaniem porównań.

1

Oto kilka opcji:

algorytmy fonetyczne ...

SOUNDEX (http://en.wikipedia.org/wiki/Soundex)

Pokój Metaphone (http://en.wikipedia.org/wiki/Double_Metaphone)

Edit Odległość (http://en.wikipedia.org/wiki/Levenshtein_distance)

Jaro- Odległość Winklera (http://en.wikipedia.org/wiki/Jaro-Winkler_distance)

Inną rzeczą, którą możesz wypróbować, to porównać każde słowo (dzielenie w przestrzeni i może myślnik) z każdym słowem w drugim imieniu i zobaczyć, ile słów pasuje do siebie. Może połączyć to z algorytmami fonetycznymi, aby uzyskać bardziej rozmyte dopasowanie. W przypadku ogromnego zestawu danych chcesz zindeksować każde słowo i dopasować je do identyfikatora nazwy. Do dopasowywania skrótów można porównać tylko pierwszą literę. Prawdopodobnie chcesz ignorować wszystko oprócz liter, gdy porównasz słowa również.

Wiele algorytmów fonetycznych ma otwarte źródła/próbki online.

2

To bardzo złożony problem - i istnieje wiele drogich narzędzi, aby to zrobić poprawnie.
Jeśli kiedykolwiek zastanawialiście się, dlaczego nie można sprawdzić w dniu lotu jako Tom, Dick i Harry (lub rachunku)
Albo dlaczego no-fly list i terroryści oglądać listy nie działają -consider:

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

A to tylko oficjalne pisownie - nie zawiera literówek!

+0

Czy możesz podać listę lub źródło, w którym można znaleźć takie nazwy? – bjan

1

Metaphone 3 to trzecia generacja algorytmu metafonowego. To zwiększa dokładność kodowania fonetycznej z 89% Double Metaphone do 98%, jak testowane na bazie najczęstszych angielskich słów, nazw i non-angielskie słowa znane w Ameryce Północnej . Zapewnia to wyjątkowo niezawodne kodowanie fonetyczne dla wymowy amerykańskiej.

Metaphone 3 został zaprojektowany i opracowany przez Lawrence Philipsa, który opracował i opracował oryginalne algorytmy Metaphone i Double Metaphone .

Powiązane problemy