سؤال

هل هناك أي أدوات أو طرق يمكن استخدامها في مطابقة اسم الشخص بين اثنين من مصادر البيانات المختلفة؟

لا تحتوي الأنظمة على معلومات مشتركة أخرى وأسمت الأسماء بشكل مختلف في كثير من الحالات.

أمثلة على المباريات غير الدقيقة:

الملك Jr.، مارتن لوثر = الملك، مارتن (باستثناء لاحقة)
erving، Dr. J. = erving، J. (استبعاد البادئة)
أوباما، باراك حسين = أوباما، باراك (استبعاد الاسم الأوسط)
PUFNSTUF، HR = PUFNSTUF، Haibane Renmei (اختصارات المباراة)
TankEngine، Thomas = TankEngine، توم (مطابقة للألعاب الشائعة)
Flair، ريك "The NatureBoy" = Flair، NatureBoy (Match On LickName)

هل كانت مفيدة؟

المحلول

اضطررت لاستخدام مجموعة متنوعة من التقنيات المقترحة. شكرا لتشيرني في الاتجاه الصحيح (الأوجه). نأمل أن يساعد ما يلي شخصا آخر مع هذا النوع من المشكلة لحلها.

إزالة الأحرف الزائدة

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

الخوارزميات الصوتية (جارو وينكلر):

المقال مذهل، ما بعد Soundex - وظائف البحث الغامض في MS SQL Server, ، يوضح كيفية تثبيت واستخدام simmetrics. مكتبة في خادم SQL. تتيح لك هذه المكتبة العثور على تشابه نسبي بين السلاسل وتشمل العديد من الخوارزميات. انتهى بي الأمر في الغالب باستخدام جارو وينكلر لتتناسب مع الأسماء.

الاستعمال:

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

نصائح أخرى

إنها مشكلة معقدة للغاية - وهناك الكثير من الأدوات باهظة الثمن للقيام بذلك بشكل صحيح.
إذا كنت تساءلت يوما لماذا لا يمكنك تسجيل الدخول في رحلة ك Tom أو Dick أو Harry (أو فاتورة)
أو لماذا لا تعمل قوائم الساعات التي لا تطير فيها قوائم المراقبة -

(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) مولازيم عوال معمد محمد أبو مينير القذافي

وهذه مجرد تهجئة رسمية - لا يشمل الأخطاء المطبعية!

غالبا ما استخدم خوارزميات من نوع Soundex لهذا النوع من الوضع. جرب ال ميتافون مزدوجة خوارزمية. إذا كنت تستخدم SQL Server، فهناك بعض التعليمات البرمجية المصدر لإنشاء وظيفة محددة من قبل المستخدم.

نظرا لأنك قد قمت بتحويل البيانات، فقد ترغب في تطبيعها قليلا، على سبيل المثال، قم بإزالة جميع الفواصل وكلفة الكلمات الناتجة عن طريق الحرف الأول. من شأنها أن تعطيك بعض الإمكانات مطابقة أفضل. في الحالة التي تمت فيها إضافة الكلمات في الوسط، يصبح أكثر صرامة بعض الشيء. يمكنك التفكير في كسر اسم في الكلمات، والتحقق من ميتافون المزدوج ما إذا كانت هناك كلمة في العمود الآخر الذي يطابق، ثم اجمع العدد الإجمالي للمباريات مقابل الكلمات، والذي سيخبرك مدى إغلاق الأعمدة.

أود أيضا تصفية الكلمات الشائعة مثل الدكتور والسيد والسيدة والسيدة، وما إلى ذلك، قبل القيام بالمقارنات.

فيما يلي بعض الخيارات:

الخوارزميات الصوتية ...

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

شيء آخر يمكن أن تجربه هو مقارنة كل كلمة (تقسيم المساحة وربما واصلة) مع كل كلمة في الاسم الآخر ومعرفة عدد الكلمات تطابق. ربما يجمع بين هذه الخوارزميات الصوتية للمطابقة الأكثر غامضة. للحصول على مجموعة بيانات ضخمة، كنت ترغب في فهرسة كل كلمة وتتناسب مع معرف الاسم. للحصول على اختصار مطابقة يمكنك مقارنة الحرف الأول فقط. ربما تريد تجاهل أي شيء سوى الحروف عند مقارنة الكلمات كذلك.

تحتوي العديد من الخوارزميات الصوتية على مصدر / عينات مفتوحة على الإنترنت.

ميتافون 3. هو الجيل الثالث من خوارزمية ميتافون. إنه يزيد من دقة الترميز الصوتي من 89٪ من ميتافون المزدوج 98%, ، كما تم اختباره مقابل قاعدة بيانات من الكلمات الإنجليزية الأكثر شيوعا، والأسماء والكلمات غير الإنجليزية مألوفة في أمريكا الشمالية. هذا ينتج ترميزا صوتيا موثوقا للغاية للنطق الأمريكي.

تم تصميم ومتاحف 3 وتطويره من قبل Lawrence Philips، الذي قام بتصميم وتطوير خوارزميات الميتافون الأصلية ومتطيعية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top