人物名に基づいてレコードをマッチング
-
13-09-2019 - |
質問
このあります任意のツールや方法
システムは、他の一般的な情報を持っていないと名前は多くの場合、別々に入力されています。
非完全一致の例:
・キング・ジュニア、マーティン・ルーサー・キング=マーティン(サフィックスを除外)
アービング、博士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">の
使用方法: の表音アルゴリズム(JAROウィンクラー):の SOUNDEX超えて素晴らしい記事では、 - MS SQL Serverのファジー検索するための機能、インストールして、SQL Serverに SimMetrics のライブラリを使用する方法を示しています。このライブラリを使用すると、文字列の間の相対的な類似性を見つけることができますし、数多くのアルゴリズムが含まれています。私は主に名前を一致させるために JAROウィンクラーに使用してしまいました。 の使用方法:の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
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の開発 アルゴリズムます。