2009-06-12 13 views
15

पर आधारित मिलान मिलान क्या कोई उपकरण या विधियां हैं जिनका उपयोग किसी व्यक्ति के नाम से दो अलग-अलग डेटा स्रोतों के बीच मिलान करने के लिए किया जा सकता है?व्यक्ति नाम

सिस्टम की कोई अन्य आम जानकारी नहीं है और कई मामलों में नाम अलग-अलग दर्ज किए गए हैं।

गैर सटीक मिलान के उदाहरण:

किंग जूनियर, मार्टिन लूथर किंग =, मार्टिन (प्रत्यय को बाहर)
इरविंग, डॉ जे = इरविंग, जे (उपसर्ग को बाहर)
ओबामा, बराक हुसैन ओबामा =, बराक (मध्य नाम शामिल न करें)
Pufnstuf, हृदय दर = Pufnstuf, Haibane Renmei (मैच संक्षिप्त रूपों)
Tankengine, थॉमस = Tankengine, टॉम (मैच आम उपनाम)
फ्लेयर, रिक "Natureboy" = फ्लेयर , नेचरबॉय (उपनाम पर मैच)

उत्तर

14

मुझे सुझाई गई विभिन्न तकनीकों का उपयोग करना पड़ा। धन्यवाद मुझे सही दिशा में इंगित करता है। उम्मीद है कि निम्नलिखित हल करने के लिए इस प्रकार की समस्या के साथ किसी और की मदद करेगा।

निकाला जा रहा है अतिरिक्त वर्ण

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 

उपयोग:

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

आम उपनाम:

मैं this list के आधार पर एक टेबल बनाया है और इसका इस्तेमाल आम नाम समकक्ष पर शामिल होने के लिए।

उपयोग:

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 विंकलर):

अद्भुत लेख, Beyond SoundEx - Functions for Fuzzy Searching in MS SQL Server, से पता चलता स्थापित करने और एसक्यूएल सर्वर में SimMetrics पुस्तकालय का उपयोग कैसे करें। यह पुस्तकालय आपको तारों के बीच सापेक्ष समानता खोजने देता है और इसमें कई एल्गोरिदम शामिल हैं। नामों से मेल खाने के लिए मैं ज्यादातर 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)) 
+0

यह एसओ पर सबसे व्यापक उत्तर होना चाहिए - यह एक समस्या है जिसे मैंने कोड में हल किया है लेकिन शुद्ध एसक्यूएल में कभी नहीं - बहुत ही सुरुचिपूर्ण। – MrTelly

+0

@MrTelly धन्यवाद। हालांकि, मुझे सिमेट्रिक्स लाइब्रेरी के लिए सीएलआर का सहारा लेना पड़ा। उम्मीद है कि यह किसी और को उनकी रूपांतरण परियोजना पर कुछ दर्द बचाएगा। –

1

मैं अक्सर इस प्रकार की स्थिति के लिए ध्वनि-प्रकार एल्गोरिदम कार्य करता हूं। Double Metaphone एल्गोरिदम का प्रयास करें। यदि आप SQL सर्वर का उपयोग कर रहे हैं, तो उपयोगकर्ता परिभाषित फ़ंक्शन बनाने के लिए कुछ स्रोत कोड हैं।

क्योंकि आपने डेटा ट्रांसफर किया है, तो आप इसे थोड़ा सामान्य बनाना चाहते हैं, उदाहरण के लिए, सभी कॉमा को हटा दें और परिणामस्वरूप शब्दों को पहले अक्षर से हटा दें। इससे आपको कुछ बेहतर मिलान क्षमता मिल जाएगी। उस मामले में जहां मध्य में शब्दों को जोड़ा गया है, यह थोड़ा मुश्किल हो जाता है। आप शब्दों में नाम तोड़ने पर विचार कर सकते हैं, डबल मेटाफोन से जांच कर सकते हैं कि मेल खाने वाले दूसरे कॉलम में कोई शब्द है या नहीं, और फिर मैचों बनाम शब्दों की समग्र गणना एकत्र करें, जो आपको बताएगा कि दो कॉलम कितने करीब हैं।

मैं तुलना करने से पहले डॉ। श्रीमान, सुश्री, श्रीमती इत्यादि जैसे सामान्य शब्दों को भी फ़िल्टर करूंगा।

ध्वन्यात्मक एल्गोरिदम ...

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

डबल मेटाफोन (http://en.wikipedia.org/wiki/Double_Metaphone)

दूरी संपादित करें (http://en.wikipedia.org/wiki/Levenshtein_distance)

Jaro-:

1

यहाँ कुछ विकल्प हैं विंकलर दूरी (http://en.wikipedia.org/wiki/Jaro-Winkler_distance)

एक और चीज जो आप कोशिश कर सकते हैं, दूसरे शब्द की तुलना में प्रत्येक शब्द (अंतरिक्ष पर विभाजन और शायद हाइफ़न) की तुलना करना और देखें कि कितने शब्द मिलते हैं। शायद इसे अधिक अस्पष्ट मिलान के लिए ध्वन्यात्मक एल्गोरिदम के साथ संयोजित करें। एक विशाल डेटा सेट के लिए, आप प्रत्येक शब्द को इंडेक्स करना चाहते हैं और इसे नाम आईडी के साथ मेल करना चाहते हैं। संक्षिप्त मिलान के लिए आप केवल पहले अक्षर की तुलना कर सकते हैं। जब आप शब्दों की तुलना करते हैं तो आप शायद कुछ भी अनदेखा करना चाहते हैं।

फोनेटिक एल्गोरिदम के कई खुले स्रोत/नमूने ऑनलाइन हैं।

2

यह एक बहुत ही जटिल समस्या है - और महंगा उपकरण का एक बहुत इसे सही ढंग से करने के लिए कर रहे हैं।
तो क्या आपने कभी सोचा कि क्यों आप टॉम, डिक या हैरी (या बिल) के रूप में एक उड़ान पर में जांच नहीं कर सकता
या क्यों नो-फ्लाई सूची और आतंकवादियों घड़ी सूचियों -consider काम नहीं करते:

(1) मुअम्मर कद्दाफी
(2) Mo'ammar गद्दाफी
(3) मुअम्मर Kaddafi
(4) मुअम्मर Qadhafi
(5) Moammar एल Kadhafi
(6) मुअम्मर Gadafi
(7) Mu'ammar अल-क़दाफी
(8) मोमर एल काज़ज़फी
(9) Moamar अल-गद्दाफी
(10) Mu'ammar अल Qathafi
(11) मुअम्मर अल Qathafi
(12) Mo'ammar अल-गद्दाफी
(13) Moamar एल Kadhafi
(14) मुअम्मर अल-Qadhafi
(15) Mu'ammar अल Qadhdhafi
(16) Mu'ammar Qadafi
(17) Moamar गद्दाफी
(18) Mu'ammar Qadhdhafi
(19) मुअम्मर Khaddafi
(20) मुअमर अल -Khaddafi
(21) Mu'amar अल Kadafi
(22) मुअम्मर Ghaddafy
(23) मुअम्मर Ghadafi
(24) मुअम्मर Ghaddafi
(25) Muamar Kaddafi
(26) मुअम्मर Quathafi
(27) मुअम्मर Gheddafi
(28) Muamar अल Kaddafi
(29) Moammar Khadafy
(30) Moammar Qudhafi
(31) Mu'ammar अल कद्दाफी
(32) Mulazim ओह अल Mu'ammar मुहम्मद अबू Minyar अल Qadafi

और यह सिर्फ आधिकारिक वर्तनी है - इसमें टाइपो शामिल नहीं है!

+0

क्या आप सूची या स्रोत प्रदान कर सकते हैं जहां ऐसे नाम मिल सकते हैं? – bjan

1

Metaphone 3 मेटाफोन एल्गोरिदम की तीसरी पीढ़ी है। यह 98% करने के लिए डबल metaphone का 89% से ध्वन्यात्मक एन्कोडिंग की सटीकता बढ़ जाती है के रूप में सबसे आम अंग्रेजी शब्दों के डेटाबेस के आधार परीक्षण किया है, और नाम और गैर अंग्रेजी उत्तर अमेरिका में परिचित शब्दों। यह अमेरिकी उच्चारण के लिए एक बेहद विश्वसनीय फोनेटिक एन्कोडिंग का उत्पादन करता है।

मेटाफोन 3 लॉरेंस फिलिप्स द्वारा डिजाइन और विकसित किया गया था, जो मूल मेटाफोन और डबल मेटाफोन एल्गोरिदम डिज़ाइन और विकसित किया गया था।