質問

2つの異なるデータソース間で人の名前でマッチングに使用することができますか?

このあります任意のツールや方法

システムは、他の一般的な情報を持っていないと名前は多くの場合、別々に入力されています。

非完全一致の例:

・キング・ジュニア、マーティン・ルーサー・キング=マーティン(サフィックスを除外)
アービング、博士J. =アービング、J.(接頭辞を除外)
オバマ、バラク・フセイン・オバマ=、バラク(ミドルネームを除外)
Pufnstuf、H.R. = Pufnstuf、灰羽連盟(マッチ略語)
Tankengine、トーマス= Tankengine、トム(共通ニックネームに一致する)
フレアー、リック "Natureboy" =フレア、Natureboy(ニックネームに一致)

役に立ちましたか?

解決

私が提案し、種々の技術を使用する必要がありました。右方向(S)で私を指してくれてありがとう。うまくいけば、次のように解決するために、この種の問題を他の誰かを助けるでしょう。

を超過した文字を削除する

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

一般的なニックネーム:

私はこのリストのrel="noreferrer">の

使用方法:

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ウィンクラー):

SOUNDEX超えて素晴らしい記事では、 - MS SQL Serverのファジー検索するための機能、インストールして、SQL Serverに SimMetrics のライブラリを使用する方法を示しています。このライブラリを使用すると、文字列の間の相対的な類似性を見つけることができますし、数多くのアルゴリズムが含まれています。私は主に名前を一致させるために JAROウィンクラーに使用してしまいました。

の使用方法:

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

他のヒント

これは非常に複雑な問題だ - とそれを正しく行うには、高価なツールがたくさんあり
。 あなたはトム、ディックやハリー(またはビル)などのフライトでチェックインすることはできませんなぜあなたは疑問に思っている場合
または、なぜ無飛ぶリストやテロリストは、リストは-consider動作しません見ます:

(1)Muammarのカダフィ
(2)Mo'ammarカダフィ
(3)MuammarのKaddafi
(4)Muammarのカダフィ
(5)MoammarエルKadhafi
(6)MuammarのGadafi
(7)Mu'ammarアルQadafi
(8)MoamerエルKazzafi
(9)Moamarアルカダフィ
(10)Mu'ammarアルQathafi
(11)MuammarのアルQathafi
(12)Mo'ammar EL-カダフィ
(13)MoamarエルKadhafi
(14)ムアマル・アル・カダフィ
(15)Mu'ammarアルQadhdhafi
(16)Mu'ammar Qadafi
(17)Moamarカダフィ
(18)Mu'ammar Qadhdhafi
(19)MuammarのKhaddafi
(20)ムアマルアルKhaddafi
(21)Mu'amarアルカダフィ
(22)MuammarのGhaddafy
(23)MuammarのGhadafi
(24)MuammarのGhaddafi
(25)Muamar Kaddafi
(26)MuammarのQuathafi
(27)MuammarのGheddafi
(28)MuamarアルKaddafi
(29)Moammar Khadafy
(30)Moammar Qudhafi
(31)Mu'ammarアルカダフィ
(32)Mulazim Awwal Mu'ammarモハメドアブMinyarアルカダフィ

そして、それはただの公式綴りだ - !それはタイプミスが含まれていません。

私はしばしばこのような状況のためのsoundex型アルゴリズムを採用しています。 ダブルMetaphoneののアルゴリズムを試してみてください。 SQL Serverを使用している場合は、ユーザー定義関数を作成するには、いくつかのソースコードがあります。

あなたがデータを転置しているので、あなたは、例えば、それを少しを正規化し、すべてのカンマと最初の文字で単語を結果の並べ替えを削除することがあります。それはあなたにいくつかのより良いマッチングの可能性を提供します。単語が途中で追加された場合には、それは少し厳しいなります。あなたは一致する他の列の単語があるかどうかをダブルMetaphoneので確認し、単語に名前を破り考慮して、2列がどれだけ近いかを教えてくれます言葉対マッチ、全体の数を集めることができました。

私はまた、比較を行う前に、など博士は、氏、氏、夫人、のような一般的な単語を除外します。

ここではいくつかのオプションがあります:

ふりがなアルゴリズム...

のSoundex( http://en.wikipedia.org/wiki/Soundexする

ダブルMetaphoneの( http://en.wikipedia.org/wiki/Double_Metaphoneする

編集距離( http://en.wikipedia.org/wiki/Levenshtein_distanceする

JARO-ウィンクラー距離( http://en.wikipedia.org/wiki/Jaro- Winkler_distance の)

あなたが試みることができるもう一つは、他の名前で各単語と、各単語(スペースと多分ハイフンで分割)を比較し、一致どのように多くの単語を参照することです。たぶんもっとファジーマッチングのための表音アルゴリズムと組み合わせます。巨大なデータセットに対しては、インデックスに各単語をしたいと思うし、それが名前のIDと一致します。略語についてあなただけの最初の文字を比較することができ、一致。あなたは、おそらくあなたにも言葉を比較する文字以外のものを無視したい。

表音アルゴリズムの多くは、オンラインオープンソース/サンプルを持っています。

  

Metaphoneの3 のMetaphoneのアルゴリズムの第三世代です。   それは、二重の89%から表音符号化の精度を増加させます   最も一般的なのデータベースに対してテストとしての 98%のへのMetaphoneの、   英語の単語、および名前と北でおなじみの英語以外の言葉   アメリカ。これはのための非常に信頼性の高い発音エンコーディングを生成します   アメリカ人の発音ます。

     

のMetaphone 3を設計し、ローレンス・フィリップス、によって開発された方   設計されており、オリジナルのMetaphoneのとダブルMetaphoneの開発   アルゴリズムます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top