18

2つの異なるデータソース間で人の名前を照合するために使用できるツールまたは方法はありますか?

システムには他の共通情報がなく、多くの場合、名前の入力方法が異なります。

完全に一致しない例:

キングジュニア、マーティンルーサー=キング、マーティン(サフィックスを除く)
アービング、ドクターJ. =アービング、J。(プレフィックスを除く)
オバマ、バラクフセイン=オバマ、バラク(ミドルネームを除く)
プフンストゥフ、HR =プフンストゥフ、ハイバネレンメイ(略語に一致)
Tankengine、Thomas = Tankengine、Tom(一般的なニックネームに一致)
Flair、Rick "the Natureboy" = Flair、Natureboy(ニックネームに一致)

4

5 に答える 5

15

提案されたさまざまな手法を使用する必要がありました。正しい方向に向けてくれてありがとう。うまくいけば、次のことがこの種の問題を解決するのに役立つでしょう。

余分な文字を削除する

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

すばらしい記事、Beyond SoundEx - Functions for Fuzzy Searching in MS SQL Serverでは、 SimMetricsライブラリを SQL Serverにインストールして使用する方法が示されています。このライブラリを使用すると、文字列間の相対的な類似性を見つけることができ、多数のアルゴリズムが含まれています。名前を一致させるために、主に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))
于 2009-06-19T15:55:26.377 に答える
2

これは非常に複雑な問題であり、正しく処理するための高価なツールがたくさんあります。
トム、ディック、ハリー (またはビル) のようにフライトにチェックインできない理由、または
飛行禁止リストやテロリストの監視リストが機能しない理由を疑問に思ったことがある場合は、次のことを考慮してください。

(1) ムアンマル・カダフィ
(2) モアンマル・カダフィ
(3) ムアンマル
・カダフィ (4) ムアンマル・カダフィ
(5) モアンマル・エル
・カダフィ (6) ムアンマル・カダフィ
(7) ムアンマル・アル・カダフィ
(8) モアマル・エル・カザフィ
(9 ) ) モアマル・アル・カダフィ
(10) ムアマル・アル・カダフィ
(11) ムアンマル・アル・カダフィ
(12) モアマル・エル・カダフィ
(13) モアマル・エル・カダフィ
(14) ムアンマル・アル・カダフィ
(15)ムアマル・アル・カダフィ
(16) ムアマル・
カダフィ (17) モアマル・カダフィ
(18)ムアマル・カダフィ
(19) ムアンマル・カダフィ
(20) ムアマル・アル・カダフィ
(21) ムアマル・アル・カダフィ
(22) ムアマル・カダフィ
(23) ムアンマル・カダフィ
(24) ムアンマル・カダフィ大佐
(25)
ムアマル・カダフィ (26) ムアマル・クアタフィ
(27) ムアマル・ゲダフィ
(28) ムアマル・アル・カダフィ
(29) モアマル・カダフィ
(30) モアンマル・クダフィ
(31) ムアマル・アル・カダフィ
(32) ムラジム・アワル ムアンマル・ムハンマドアブ・ミニャル・アル・カダフィ

そして、それは単なる公式のスペルです - タイプミスは含まれていません!

于 2010-03-31T18:56:55.270 に答える
1

私はこの種の状況にsoundexタイプのアルゴリズムをよく使用します。DoubleMetaphoneアルゴリズムを試してください。SQL Serverを使用している場合は、ユーザー定義関数を作成するためのソースコードがいくつかあります。

データを転置したので、データを少し正規化することをお勧めします。たとえば、すべてのコンマを削除し、結果の単語を最初の文字で並べ替えます。それはあなたにいくつかのより良いマッチングの可能性を与えるでしょう。途中で単語を追加した場合は少し難しくなります。名前を単語に分割し、Double Metaphoneで一致する単語が他の列にあるかどうかを確認してから、一致と単語の総数を収集することを検討できます。これにより、2つの列がどれだけ近いかがわかります。

また、比較を行う前に、Dr。、Mr.、Ms.、Mrs。などの一般的な単語を除外します。

于 2009-06-12T17:50:15.730 に答える
1

Metaphone 3は、Metaphone アルゴリズムの第 3 世代です。Double Metaphone の 89% から98%に音声エンコーディングの精度が向上します。これは、北米でよく知られている最も一般的な英単語、名前、英語以外の単語のデータベースに対してテストされています。これにより、アメリカの発音に対して非常に信頼性の高い音声エンコーディングが生成されます。

Metaphone 3 は、元の Metaphone および Double Metaphone アルゴリズムを設計および開発した Lawrence Philips によって設計および開発されました。

于 2013-02-06T04:43:17.587 に答える
1

以下にいくつかのオプションを示します。

音声アルゴリズム...

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

ダブル メタフォン ( http://en.wikipedia.org/wiki/Double_Metaphone )

距離の編集 ( http://en.wikipedia.org/wiki/Levenshtein_distance )

ジャロ・ウィンクラー距離 ( http://en.wikipedia.org/wiki/Jaro-Winkler_distance )

別の方法として、各単語 (スペースとハイフンで分割) を他の名前の各単語と比較して、一致する単語の数を確認することもできます。たぶん、これを音声アルゴリズムと組み合わせて、よりあいまいな一致を実現します。巨大なデータ セットの場合、各単語にインデックスを付けて名前 ID と照合する必要があります。略語の一致では、最初の文字だけを比較できます。単語を比較するときも、文字以外は無視したいでしょう。

音声アルゴリズムの多くは、オンラインでオープン ソース/サンプルを提供しています。

于 2009-06-12T17:55:52.863 に答える