Frage

Gibt es irgendwelche Werkzeuge oder Methoden, die von dem Namen einer Person zwischen zwei verschiedenen Datenquellen für den Abgleich verwendet werden können?

Die Systeme haben keine andere allgemeine Informationen und die Namen wurden unterschiedlich in vielen Fällen eingegeben.

Beispiele für nicht-exakte Treffer:

King Jr., Martin Luther = König, Martin (auszuschließen Suffix)
Erving, Dr. J. = Erving, J. (auszuschließen Präfix)
Obama, Barak Hussein = Obama, Barak (auszuschließen Mittelname)
Pufnstuf, H. R. = Pufnstuf, Haibane Renmei (Match Abkürzungen)
Tankengine, Thomas = tankengine, Tom (Match gemeinsamen Spitznamen)
Flair, Rick "die Natureboy" = Flair, Natureboy (Match auf Spitznamen)

War es hilfreich?

Lösung

Ich hatte eine Vielzahl von Techniken zu verwenden, vorgeschlagen. Dank zeigt mich in der richtigen Richtung (en). Wir hoffen, dass die folgenden jemand anderes heraus mit dieser Art von Problem helfen zu lösen.

Entfernen überschüssigen Zeichen

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

Verbrauch:

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

Split Namen in Teile

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

Verbrauch:

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

Allgemein Spitznamen:

Ich habe eine Tabelle basierend auf dieser Liste und verwendet es auf gemeinsamen Namen zu verbinden Äquivalente.

Verbrauch:

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

Phonetik Algorithmen (Jaro Winkler):

Der erstaunliche Artikel, Jenseits SoundEx - Funktionen für die Fuzzy-Suche in MS SQL Server , zeigt, wie die SimMetrics Bibliothek in SQL Server installieren und zu verwenden. Diese Bibliothek können Sie relative Ähnlichkeit zwischen Streichern und umfasst zahlreiche Algorithmen finden. Ich landete meist mit Jaro Winkler die Namen übereinstimmen.

Verbrauch:

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

Andere Tipps

Es ist ein sehr komplexes Problem - und es gibt es richtig viel teure Werkzeuge zu tun
. Wenn Sie sich jemals gefragt, warum Sie nicht auf einem Flug einchecken können als Tom, Dick oder Harry (oder Bill)
Oder warum No-Fly-Listen und Terroristen Watchlisten funktionieren nicht -consider:

(1) Muammar Qaddafi
(2) Mo'ammar Gadhafi
(3) Muammar Kaddafi
(4) Muammar Qaddafi
(5) Muammar 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-Gaddafi
(13) Moamar El Kadhafi
(14) Muammar al-Gaddafi
(15) Mu'ammar al-Qadhdhafi
(16) Mu'ammar Qadafi
(17) Moamar Gaddafi
(18) Mu'ammar Qadhdhafi
(19) Muammar Ghaddafi
(20) Muammar al-Ghaddafi
(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) Muammar al Khadafy
(30) Muammar al Qudhafi
(31) Mu'ammar al-Qaddafi
(32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qaddafi

Und das ist nur offizielle Schreibweisen - es umfasst nicht Fehler

ich oft soundex-Typ-Algorithmen für diese Art von Situation beschäftigen. Versuchen Sie, die Double Metaphone Algorithmus. Wenn Sie SQL Server verwenden, gibt es einige Code Quelle eine benutzerdefinierte Funktion zu erstellen.

Da Sie Daten umgesetzt haben, können Sie wollen, dass es ein wenig normalisieren, zum Beispiel, entfernen Sie alle Kommas und die Art resultierende Worte durch den ersten Buchstaben. Das gibt Ihnen eine bessere Anpassung Potenzial. In dem Fall, in dem Wort in der Mitte hinzugefügt wurde, wird es ein bisschen härter. Man könnte erwägen, einen Namen in Worte zu brechen, mit Doppel Metaphone prüft wird, ob es ein Wort in der anderen Spalte ist, die übereinstimmt, und dann die Gesamtzahl der Spiele gegen Worte sammeln, die Ihnen sagen, wie nahe die beiden Spalten sind.

Ich würde auch gemeinsame Worte wie Dr. herauszufiltern, Herr, Frau, Frau, usw., bevor die Vergleiche zu tun.

Hier sind einige Möglichkeiten:

Phonetic Algorithmen ...

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

Double Metaphone ( http://en.wikipedia.org/wiki/Double_Metaphone )

Bearbeiten Entfernung ( http://en.wikipedia.org/wiki/Levenshtein_distance )

Jaro-Winkler Entfernung ( http://en.wikipedia.org/wiki/Jaro- Winkler_distance )

Eine andere Sache, die Sie würden versuchen könnte jedes Wort (Splitting auf Raum und vielleicht Bindestrich) mit jedem Wort in dem anderen Namen zu vergleichen und sehen, wie viele Wörter zusammenpassen. kombiniert diese mit Laut Algorithmen für mehr Fuzzy Matching Vielleicht. Für einen großen Datensatz, würden Sie jedes Wort indizieren möchten und passen Sie es mit einem Namen id. Für Abkürzung für: Sie nur die ersten Buchstaben vergleichen können. Sie wollen wahrscheinlich alles andere als Briefe ignorieren, wenn Sie Wörter wie gut vergleichen.

Viele der Laut Algorithmen haben Open-Source / samples online.

  

Metaphone 3 ist die dritte Generation des Metaphone Algorithmus.   Es erhöht die Genauigkeit des Laut Codierung von dem 89% der Doppel   Metaphone auf 98% , wie eine Datenbank der häufigsten getestet   Englische Worte und Namen und nicht-englische Worte vertraut in Nord   Amerika. Dadurch ergibt sich eine äußerst zuverlässige Laut Codierung für   Amerikanische Aussprachen.

     

Metaphone 3 wurde von Lawrence Philips entworfen und entwickelt, die   entworfen und die ursprüngliche Metaphone und Doppel entwickelt Metaphone   Algorithmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top